@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.
Files changed (546) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +21 -0
  3. package/corpus/core/docs/content/actions.mdx +1 -1
  4. package/corpus/core/docs/content/authentication.mdx +1 -1
  5. package/corpus/core/docs/content/dispatch.mdx +3 -3
  6. package/corpus/core/docs/content/external-agents.mdx +30 -19
  7. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +1 -1
  8. package/corpus/core/docs/content/locales/ar-SA/authentication.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  10. package/corpus/core/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  11. package/corpus/core/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  12. package/corpus/core/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  13. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  14. package/corpus/core/docs/content/locales/ar-SA/server.mdx +2 -2
  15. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  16. package/corpus/core/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  17. package/corpus/core/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  18. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  19. package/corpus/core/docs/content/locales/de-DE/actions.mdx +1 -1
  20. package/corpus/core/docs/content/locales/de-DE/authentication.mdx +1 -1
  21. package/corpus/core/docs/content/locales/de-DE/dispatch.mdx +3 -3
  22. package/corpus/core/docs/content/locales/de-DE/external-agents.mdx +23 -19
  23. package/corpus/core/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  24. package/corpus/core/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  25. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  26. package/corpus/core/docs/content/locales/de-DE/server.mdx +2 -2
  27. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  28. package/corpus/core/docs/content/locales/de-DE/template-assets.mdx +1 -1
  29. package/corpus/core/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  30. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +3 -3
  31. package/corpus/core/docs/content/locales/es-ES/actions.mdx +1 -1
  32. package/corpus/core/docs/content/locales/es-ES/authentication.mdx +1 -1
  33. package/corpus/core/docs/content/locales/es-ES/dispatch.mdx +3 -3
  34. package/corpus/core/docs/content/locales/es-ES/external-agents.mdx +32 -19
  35. package/corpus/core/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  36. package/corpus/core/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  37. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  38. package/corpus/core/docs/content/locales/es-ES/server.mdx +2 -2
  39. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  40. package/corpus/core/docs/content/locales/es-ES/template-assets.mdx +1 -1
  41. package/corpus/core/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  42. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +3 -3
  43. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +1 -1
  44. package/corpus/core/docs/content/locales/fr-FR/authentication.mdx +1 -1
  45. package/corpus/core/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  46. package/corpus/core/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  47. package/corpus/core/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  48. package/corpus/core/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  49. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  50. package/corpus/core/docs/content/locales/fr-FR/server.mdx +2 -2
  51. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  52. package/corpus/core/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  53. package/corpus/core/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  54. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  55. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +1 -1
  56. package/corpus/core/docs/content/locales/hi-IN/authentication.mdx +1 -1
  57. package/corpus/core/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  58. package/corpus/core/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  59. package/corpus/core/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  60. package/corpus/core/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  61. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  62. package/corpus/core/docs/content/locales/hi-IN/server.mdx +2 -2
  63. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  64. package/corpus/core/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  65. package/corpus/core/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  66. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  67. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +1 -1
  68. package/corpus/core/docs/content/locales/ja-JP/authentication.mdx +1 -1
  69. package/corpus/core/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  70. package/corpus/core/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  71. package/corpus/core/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  72. package/corpus/core/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  73. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  74. package/corpus/core/docs/content/locales/ja-JP/server.mdx +2 -2
  75. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  76. package/corpus/core/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  77. package/corpus/core/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  78. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  79. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +1 -1
  80. package/corpus/core/docs/content/locales/ko-KR/authentication.mdx +1 -1
  81. package/corpus/core/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  82. package/corpus/core/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  83. package/corpus/core/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  84. package/corpus/core/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  85. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  86. package/corpus/core/docs/content/locales/ko-KR/server.mdx +2 -2
  87. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  88. package/corpus/core/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  89. package/corpus/core/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  90. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  91. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +1 -1
  92. package/corpus/core/docs/content/locales/pt-BR/authentication.mdx +1 -1
  93. package/corpus/core/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  94. package/corpus/core/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  95. package/corpus/core/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  96. package/corpus/core/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  97. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  98. package/corpus/core/docs/content/locales/pt-BR/server.mdx +2 -2
  99. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  100. package/corpus/core/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  101. package/corpus/core/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  102. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  103. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +1 -1
  104. package/corpus/core/docs/content/locales/zh-CN/authentication.mdx +1 -1
  105. package/corpus/core/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  106. package/corpus/core/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  107. package/corpus/core/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  108. package/corpus/core/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  109. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  110. package/corpus/core/docs/content/locales/zh-CN/server.mdx +2 -2
  111. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  112. package/corpus/core/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  113. package/corpus/core/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  114. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  115. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +1 -1
  116. package/corpus/core/docs/content/locales/zh-TW/authentication.mdx +1 -1
  117. package/corpus/core/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  118. package/corpus/core/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  119. package/corpus/core/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  120. package/corpus/core/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  121. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  122. package/corpus/core/docs/content/locales/zh-TW/server.mdx +2 -2
  123. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  124. package/corpus/core/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  125. package/corpus/core/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  126. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  127. package/corpus/core/docs/content/mcp-clients.mdx +31 -4
  128. package/corpus/core/docs/content/mcp-protocol.mdx +35 -15
  129. package/corpus/core/docs/content/plan-plugin.mdx +3 -3
  130. package/corpus/core/docs/content/server.mdx +2 -2
  131. package/corpus/core/docs/content/skills-guide.mdx +1 -1
  132. package/corpus/core/docs/content/template-assets.mdx +1 -1
  133. package/corpus/core/docs/content/template-dispatch.mdx +2 -2
  134. package/corpus/core/docs/content/template-plan.mdx +3 -3
  135. package/corpus/core/package.json +1 -1
  136. package/corpus/core/src/a2a/client.ts +3 -0
  137. package/corpus/core/src/a2a/handlers.ts +95 -7
  138. package/corpus/core/src/cli/connect.ts +50 -24
  139. package/corpus/core/src/cli/mcp-config-writers.ts +10 -0
  140. package/corpus/core/src/cli/mcp.ts +5 -5
  141. package/corpus/core/src/cli/skills-content/assets-skill.ts +1 -1
  142. package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +1 -1
  143. package/corpus/core/src/cli/skills-content/help.ts +1 -1
  144. package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +1 -1
  145. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +1 -1
  146. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +2 -2
  147. package/corpus/core/src/cli/skills.ts +23 -12
  148. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +5 -0
  149. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +17 -0
  150. package/corpus/core/src/embedding/agent.ts +8 -6
  151. package/corpus/core/src/localization/default-messages.ts +7 -0
  152. package/corpus/core/src/mcp/ask-app-inline-tasks.ts +125 -0
  153. package/corpus/core/src/mcp/build-server.ts +65 -3
  154. package/corpus/core/src/mcp/builtin-tools.ts +186 -22
  155. package/corpus/core/src/mcp/connect-route.ts +17 -14
  156. package/corpus/core/src/mcp/oauth-route.ts +38 -13
  157. package/corpus/core/src/mcp/route-paths.ts +34 -0
  158. package/corpus/core/src/mcp/server.ts +21 -10
  159. package/corpus/core/src/mcp/stdio.ts +34 -16
  160. package/corpus/core/src/mcp/workspace-resolve.ts +2 -1
  161. package/corpus/core/src/mcp-client/manager.ts +5 -3
  162. package/corpus/core/src/mcp-client/remote-store.ts +10 -10
  163. package/corpus/core/src/server/agent-chat-plugin.ts +59 -8
  164. package/corpus/core/src/server/auth.ts +22 -6
  165. package/corpus/core/src/server/core-routes-plugin.ts +30 -24
  166. package/corpus/core/src/server/csrf.ts +17 -0
  167. package/corpus/core/src/server/framework-request-handler.ts +8 -2
  168. package/corpus/core/src/server/google-oauth.ts +6 -0
  169. package/corpus/core/src/server/http-response-telemetry.ts +6 -1
  170. package/corpus/core/src/server/recap-image-route.ts +3 -3
  171. package/corpus/core/src/server/security-headers.ts +7 -1
  172. package/corpus/core/src/server/ssr-handler.ts +2 -0
  173. package/corpus/core/src/shared/cache-control.ts +6 -4
  174. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  175. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  176. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  177. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  178. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  179. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +10 -0
  180. package/corpus/templates/analytics/app/global.css +63 -4
  181. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +8 -5
  182. package/corpus/templates/analytics/changelog/2026-07-13-daily-dashboard-emails-recover-more-reliably-from-serverless.md +6 -0
  183. package/corpus/templates/analytics/changelog/2026-07-13-session-replays-keep-a-visible-mac-style-cursor-over-the-vis.md +6 -0
  184. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -2
  185. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +57 -1
  186. package/corpus/templates/analytics/server/lib/dashboard-report.ts +266 -28
  187. package/corpus/templates/analytics/server/routes/[...page].get.ts +0 -2
  188. package/corpus/templates/assets/.agents/skills/security/SKILL.md +10 -0
  189. package/corpus/templates/assets/agent-native.app-skill.json +1 -1
  190. package/corpus/templates/brain/.agents/skills/security/SKILL.md +10 -0
  191. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +10 -0
  192. package/corpus/templates/calendar/AGENTS.md +2 -1
  193. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +0 -19
  194. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +14 -5
  195. package/corpus/templates/calendar/changelog/2026-07-13-your-local-time-now-follows-your-browser-timezone-and-event-.md +6 -0
  196. package/corpus/templates/chat/.agents/skills/security/SKILL.md +10 -0
  197. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +7 -2
  198. package/corpus/templates/clips/.agents/skills/security/SKILL.md +10 -0
  199. package/corpus/templates/clips/AGENTS.md +7 -0
  200. package/corpus/templates/clips/actions/list-meetings.ts +19 -4
  201. package/corpus/templates/clips/actions/start-meeting-recording.ts +7 -1
  202. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +75 -78
  203. package/corpus/templates/clips/app/components/recorder/confetti-canvas.tsx +18 -1
  204. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +6 -12
  205. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +19 -2
  206. package/corpus/templates/clips/app/lib/camera-composite.ts +70 -10
  207. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
  208. package/corpus/templates/clips/app/routes/record.tsx +5 -25
  209. package/corpus/templates/clips/changelog/2026-07-13-clips-desktop-now-requires-macos-13-for-native-capture.md +6 -0
  210. package/corpus/templates/clips/changelog/2026-07-13-clips-hide-solo-meeting-reminders.md +6 -0
  211. package/corpus/templates/clips/changelog/2026-07-13-clips-now-removes-duplicate-mic-and-system-transcript-turns-.md +6 -0
  212. package/corpus/templates/clips/changelog/2026-07-13-desktop-recordings-run-cooler-and-quieter-live-transcription.md +6 -0
  213. package/corpus/templates/clips/changelog/2026-07-13-meeting-recordings-now-stop-after-a-calendar-meeting-ends-an.md +6 -0
  214. package/corpus/templates/clips/changelog/2026-07-13-meeting-transcripts-now-use-a-clean-agent-chat-style-reading.md +6 -0
  215. package/corpus/templates/clips/changelog/2026-07-13-screen-recordings-use-less-processing-power-during-longer-ca.md +6 -0
  216. package/corpus/templates/clips/chrome-extension/src/background.ts +5 -3
  217. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +17 -14
  218. package/corpus/templates/clips/chrome-extension/src/overlay.ts +8 -2
  219. package/corpus/templates/clips/desktop/README.md +3 -0
  220. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -0
  221. package/corpus/templates/clips/desktop/src/lib/recorder.ts +8 -2
  222. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  223. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +5 -0
  224. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +134 -5
  225. package/corpus/templates/clips/desktop/src/lib/upload-video-stream.ts +28 -0
  226. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +10 -3
  227. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +42 -9
  228. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -2
  229. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +6 -1
  230. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +77 -1
  231. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +104 -25
  232. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +4 -0
  233. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +287 -32
  234. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  235. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +28 -0
  236. package/corpus/templates/clips/server/routes/[...page].get.ts +1 -59
  237. package/corpus/templates/clips/shared/recording-capture.ts +37 -0
  238. package/corpus/templates/content/.agents/skills/security/SKILL.md +10 -0
  239. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  240. package/corpus/templates/content/server/routes/[...page].get.ts +1 -15
  241. package/corpus/templates/design/.agents/skills/security/SKILL.md +10 -0
  242. package/corpus/templates/design/actions/connect-assets-mcp.ts +1 -1
  243. package/corpus/templates/design/agent-native.app-skill.json +1 -1
  244. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +88 -12
  245. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1 -0
  246. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +4 -1
  247. package/corpus/templates/design/changelog/2026-07-13-adding-shapes-preserves-canvas-background.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-13-clicking-quickly-between-overlapping-elements-no-longer-bounc.md +6 -0
  249. package/corpus/templates/design/server/plugins/assets-mcp.ts +1 -1
  250. package/corpus/templates/design/server/routes/[...page].get.ts +0 -2
  251. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +10 -0
  252. package/corpus/templates/forms/.agents/skills/security/SKILL.md +10 -0
  253. package/corpus/templates/macros/.agents/skills/security/SKILL.md +10 -0
  254. package/corpus/templates/mail/.agents/skills/security/SKILL.md +10 -0
  255. package/corpus/templates/plan/.agents/skills/security/SKILL.md +10 -0
  256. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +1 -1
  257. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +2 -2
  258. package/corpus/templates/plan/agent-native.app-skill.json +1 -1
  259. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +6 -1
  260. package/corpus/templates/plan/app/pages/PlansPage.tsx +15 -6
  261. package/corpus/templates/plan/changelog/2026-07-13-fixed-local-plan-previews-continuously-flickering-while-revi.md +6 -0
  262. package/corpus/templates/plan/server/routes/[...page].get.ts +0 -2
  263. package/corpus/templates/slides/.agents/skills/security/SKILL.md +10 -0
  264. package/dist/a2a/client.d.ts +2 -0
  265. package/dist/a2a/client.d.ts.map +1 -1
  266. package/dist/a2a/client.js +2 -0
  267. package/dist/a2a/client.js.map +1 -1
  268. package/dist/a2a/handlers.d.ts.map +1 -1
  269. package/dist/a2a/handlers.js +84 -7
  270. package/dist/a2a/handlers.js.map +1 -1
  271. package/dist/cli/connect.d.ts +2 -2
  272. package/dist/cli/connect.d.ts.map +1 -1
  273. package/dist/cli/connect.js +45 -23
  274. package/dist/cli/connect.js.map +1 -1
  275. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  276. package/dist/cli/mcp-config-writers.js +7 -0
  277. package/dist/cli/mcp-config-writers.js.map +1 -1
  278. package/dist/cli/mcp.js +5 -3
  279. package/dist/cli/mcp.js.map +1 -1
  280. package/dist/cli/skills-content/assets-skill.d.ts +1 -1
  281. package/dist/cli/skills-content/assets-skill.d.ts.map +1 -1
  282. package/dist/cli/skills-content/assets-skill.js +1 -1
  283. package/dist/cli/skills-content/assets-skill.js.map +1 -1
  284. package/dist/cli/skills-content/design-exploration-skill.d.ts +1 -1
  285. package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -1
  286. package/dist/cli/skills-content/design-exploration-skill.js +1 -1
  287. package/dist/cli/skills-content/design-exploration-skill.js.map +1 -1
  288. package/dist/cli/skills-content/help.d.ts +1 -1
  289. package/dist/cli/skills-content/help.d.ts.map +1 -1
  290. package/dist/cli/skills-content/help.js +1 -1
  291. package/dist/cli/skills-content/help.js.map +1 -1
  292. package/dist/cli/skills-content/plan-setup-auth.d.ts +1 -1
  293. package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -1
  294. package/dist/cli/skills-content/plan-setup-auth.js +1 -1
  295. package/dist/cli/skills-content/plan-setup-auth.js.map +1 -1
  296. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  297. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  298. package/dist/cli/skills-content/visual-plan-skill.js +1 -1
  299. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  300. package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
  301. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
  302. package/dist/cli/skills-content/visual-recap-skill.js +2 -2
  303. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
  304. package/dist/cli/skills.d.ts.map +1 -1
  305. package/dist/cli/skills.js +16 -12
  306. package/dist/cli/skills.js.map +1 -1
  307. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  308. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  309. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  310. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  311. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  312. package/dist/client/resources/mcp-integration-catalog.js +14 -0
  313. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  314. package/dist/collab/awareness.d.ts +2 -2
  315. package/dist/collab/awareness.d.ts.map +1 -1
  316. package/dist/collab/struct-routes.d.ts +1 -1
  317. package/dist/embedding/agent.d.ts.map +1 -1
  318. package/dist/embedding/agent.js +6 -7
  319. package/dist/embedding/agent.js.map +1 -1
  320. package/dist/localization/default-messages.d.ts +5 -0
  321. package/dist/localization/default-messages.d.ts.map +1 -1
  322. package/dist/localization/default-messages.js +5 -0
  323. package/dist/localization/default-messages.js.map +1 -1
  324. package/dist/mcp/ask-app-inline-tasks.d.ts +47 -0
  325. package/dist/mcp/ask-app-inline-tasks.d.ts.map +1 -0
  326. package/dist/mcp/ask-app-inline-tasks.js +87 -0
  327. package/dist/mcp/ask-app-inline-tasks.js.map +1 -0
  328. package/dist/mcp/build-server.d.ts.map +1 -1
  329. package/dist/mcp/build-server.js +56 -3
  330. package/dist/mcp/build-server.js.map +1 -1
  331. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  332. package/dist/mcp/builtin-tools.js +141 -21
  333. package/dist/mcp/builtin-tools.js.map +1 -1
  334. package/dist/mcp/connect-route.d.ts +12 -10
  335. package/dist/mcp/connect-route.d.ts.map +1 -1
  336. package/dist/mcp/connect-route.js +17 -14
  337. package/dist/mcp/connect-route.js.map +1 -1
  338. package/dist/mcp/oauth-route.d.ts +1 -1
  339. package/dist/mcp/oauth-route.d.ts.map +1 -1
  340. package/dist/mcp/oauth-route.js +30 -13
  341. package/dist/mcp/oauth-route.js.map +1 -1
  342. package/dist/mcp/route-paths.d.ts +13 -0
  343. package/dist/mcp/route-paths.d.ts.map +1 -0
  344. package/dist/mcp/route-paths.js +27 -0
  345. package/dist/mcp/route-paths.js.map +1 -0
  346. package/dist/mcp/server.d.ts +2 -1
  347. package/dist/mcp/server.d.ts.map +1 -1
  348. package/dist/mcp/server.js +14 -6
  349. package/dist/mcp/server.js.map +1 -1
  350. package/dist/mcp/stdio.d.ts +7 -6
  351. package/dist/mcp/stdio.d.ts.map +1 -1
  352. package/dist/mcp/stdio.js +27 -15
  353. package/dist/mcp/stdio.js.map +1 -1
  354. package/dist/mcp/workspace-resolve.d.ts +2 -1
  355. package/dist/mcp/workspace-resolve.d.ts.map +1 -1
  356. package/dist/mcp/workspace-resolve.js +2 -1
  357. package/dist/mcp/workspace-resolve.js.map +1 -1
  358. package/dist/mcp-client/manager.js +6 -3
  359. package/dist/mcp-client/manager.js.map +1 -1
  360. package/dist/mcp-client/remote-store.js +5 -7
  361. package/dist/mcp-client/remote-store.js.map +1 -1
  362. package/dist/notifications/routes.d.ts +2 -2
  363. package/dist/observability/routes.d.ts +3 -3
  364. package/dist/progress/routes.d.ts +1 -1
  365. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  366. package/dist/resources/handlers.d.ts +3 -3
  367. package/dist/secrets/routes.d.ts +6 -6
  368. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  369. package/dist/server/agent-chat-plugin.js +60 -9
  370. package/dist/server/agent-chat-plugin.js.map +1 -1
  371. package/dist/server/auth.d.ts.map +1 -1
  372. package/dist/server/auth.js +16 -6
  373. package/dist/server/auth.js.map +1 -1
  374. package/dist/server/core-routes-plugin.d.ts +4 -3
  375. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  376. package/dist/server/core-routes-plugin.js +20 -15
  377. package/dist/server/core-routes-plugin.js.map +1 -1
  378. package/dist/server/csrf.d.ts.map +1 -1
  379. package/dist/server/csrf.js +11 -0
  380. package/dist/server/csrf.js.map +1 -1
  381. package/dist/server/framework-request-handler.d.ts.map +1 -1
  382. package/dist/server/framework-request-handler.js +8 -2
  383. package/dist/server/framework-request-handler.js.map +1 -1
  384. package/dist/server/google-oauth.d.ts +2 -0
  385. package/dist/server/google-oauth.d.ts.map +1 -1
  386. package/dist/server/google-oauth.js +5 -0
  387. package/dist/server/google-oauth.js.map +1 -1
  388. package/dist/server/http-response-telemetry.d.ts.map +1 -1
  389. package/dist/server/http-response-telemetry.js +4 -1
  390. package/dist/server/http-response-telemetry.js.map +1 -1
  391. package/dist/server/recap-image-route.js +3 -3
  392. package/dist/server/recap-image-route.js.map +1 -1
  393. package/dist/server/security-headers.d.ts.map +1 -1
  394. package/dist/server/security-headers.js +4 -1
  395. package/dist/server/security-headers.js.map +1 -1
  396. package/dist/server/ssr-handler.d.ts.map +1 -1
  397. package/dist/server/ssr-handler.js +3 -1
  398. package/dist/server/ssr-handler.js.map +1 -1
  399. package/dist/server/transcribe-voice.d.ts +1 -1
  400. package/dist/shared/cache-control.d.ts +7 -6
  401. package/dist/shared/cache-control.d.ts.map +1 -1
  402. package/dist/shared/cache-control.js +4 -3
  403. package/dist/shared/cache-control.js.map +1 -1
  404. package/dist/templates/default/.agents/skills/security/SKILL.md +10 -0
  405. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  406. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  407. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  408. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  409. package/docs/content/actions.mdx +1 -1
  410. package/docs/content/authentication.mdx +1 -1
  411. package/docs/content/dispatch.mdx +3 -3
  412. package/docs/content/external-agents.mdx +30 -19
  413. package/docs/content/locales/ar-SA/actions.mdx +1 -1
  414. package/docs/content/locales/ar-SA/authentication.mdx +1 -1
  415. package/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  416. package/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  417. package/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  418. package/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  419. package/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  420. package/docs/content/locales/ar-SA/server.mdx +2 -2
  421. package/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  422. package/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  423. package/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  424. package/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  425. package/docs/content/locales/de-DE/actions.mdx +1 -1
  426. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  427. package/docs/content/locales/de-DE/dispatch.mdx +3 -3
  428. package/docs/content/locales/de-DE/external-agents.mdx +23 -19
  429. package/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  430. package/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  431. package/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  432. package/docs/content/locales/de-DE/server.mdx +2 -2
  433. package/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  434. package/docs/content/locales/de-DE/template-assets.mdx +1 -1
  435. package/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  436. package/docs/content/locales/de-DE/template-plan.mdx +3 -3
  437. package/docs/content/locales/es-ES/actions.mdx +1 -1
  438. package/docs/content/locales/es-ES/authentication.mdx +1 -1
  439. package/docs/content/locales/es-ES/dispatch.mdx +3 -3
  440. package/docs/content/locales/es-ES/external-agents.mdx +32 -19
  441. package/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  442. package/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  443. package/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  444. package/docs/content/locales/es-ES/server.mdx +2 -2
  445. package/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  446. package/docs/content/locales/es-ES/template-assets.mdx +1 -1
  447. package/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  448. package/docs/content/locales/es-ES/template-plan.mdx +3 -3
  449. package/docs/content/locales/fr-FR/actions.mdx +1 -1
  450. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  451. package/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  452. package/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  453. package/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  454. package/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  455. package/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  456. package/docs/content/locales/fr-FR/server.mdx +2 -2
  457. package/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  458. package/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  459. package/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  460. package/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  461. package/docs/content/locales/hi-IN/actions.mdx +1 -1
  462. package/docs/content/locales/hi-IN/authentication.mdx +1 -1
  463. package/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  464. package/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  465. package/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  466. package/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  467. package/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  468. package/docs/content/locales/hi-IN/server.mdx +2 -2
  469. package/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  470. package/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  471. package/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  472. package/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  473. package/docs/content/locales/ja-JP/actions.mdx +1 -1
  474. package/docs/content/locales/ja-JP/authentication.mdx +1 -1
  475. package/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  476. package/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  477. package/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  478. package/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  479. package/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  480. package/docs/content/locales/ja-JP/server.mdx +2 -2
  481. package/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  482. package/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  483. package/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  484. package/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  485. package/docs/content/locales/ko-KR/actions.mdx +1 -1
  486. package/docs/content/locales/ko-KR/authentication.mdx +1 -1
  487. package/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  488. package/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  489. package/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  490. package/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  491. package/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  492. package/docs/content/locales/ko-KR/server.mdx +2 -2
  493. package/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  494. package/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  495. package/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  496. package/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  497. package/docs/content/locales/pt-BR/actions.mdx +1 -1
  498. package/docs/content/locales/pt-BR/authentication.mdx +1 -1
  499. package/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  500. package/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  501. package/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  502. package/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  503. package/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  504. package/docs/content/locales/pt-BR/server.mdx +2 -2
  505. package/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  506. package/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  507. package/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  508. package/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  509. package/docs/content/locales/zh-CN/actions.mdx +1 -1
  510. package/docs/content/locales/zh-CN/authentication.mdx +1 -1
  511. package/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  512. package/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  513. package/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  514. package/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  515. package/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  516. package/docs/content/locales/zh-CN/server.mdx +2 -2
  517. package/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  518. package/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  519. package/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  520. package/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  521. package/docs/content/locales/zh-TW/actions.mdx +1 -1
  522. package/docs/content/locales/zh-TW/authentication.mdx +1 -1
  523. package/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  524. package/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  525. package/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  526. package/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  527. package/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  528. package/docs/content/locales/zh-TW/server.mdx +2 -2
  529. package/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  530. package/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  531. package/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  532. package/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  533. package/docs/content/mcp-clients.mdx +31 -4
  534. package/docs/content/mcp-protocol.mdx +35 -15
  535. package/docs/content/plan-plugin.mdx +3 -3
  536. package/docs/content/server.mdx +2 -2
  537. package/docs/content/skills-guide.mdx +1 -1
  538. package/docs/content/template-assets.mdx +1 -1
  539. package/docs/content/template-dispatch.mdx +2 -2
  540. package/docs/content/template-plan.mdx +3 -3
  541. package/package.json +1 -1
  542. package/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  543. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  544. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  545. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  546. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
@@ -64,6 +64,7 @@ import {
64
64
  handleMcpOAuthAuthorizationServerMetadata,
65
65
  handleMcpOAuthProtectedResourceMetadata,
66
66
  } from "../mcp/oauth-route.js";
67
+ import { MCP_ROUTE_PREFIXES } from "../mcp/route-paths.js";
67
68
  import { registerBuiltinNotificationChannels } from "../notifications/channels.js";
68
69
  import { createNotificationsHandler } from "../notifications/routes.js";
69
70
  import { getOrgContext } from "../org/context.js";
@@ -873,9 +874,10 @@ export interface CoreRoutesPluginOptions {
873
874
  /** Disable the /_agent-native/embed/start iframe session launcher. */
874
875
  disableEmbedRoute?: boolean;
875
876
  /**
876
- * Disable the /_agent-native/mcp/connect routes (browser Connect page +
877
- * CLI device-code flow that mints per-user, revocable MCP tokens) and the
878
- * standard remote-MCP OAuth endpoints under /_agent-native/mcp/oauth.
877
+ * Disable the /mcp/connect routes (browser Connect page + CLI device-code
878
+ * flow that mints per-user, revocable MCP tokens) and the standard remote-MCP
879
+ * OAuth endpoints under /mcp/oauth. The legacy /_agent-native/mcp aliases
880
+ * are disabled at the same time.
879
881
  * Enabled by default — the routes are session-gated where they approve user
880
882
  * access; token endpoints are protected by single-use codes / refresh
881
883
  * tokens.
@@ -939,7 +941,7 @@ export function createCoreRoutesPlugin(
939
941
  rejectInit = reject;
940
942
  });
941
943
  trackPluginInit(nitroApp, initPromise, {
942
- paths: [FRAMEWORK_ROUTE_PREFIX, "/.well-known"],
944
+ paths: [FRAMEWORK_ROUTE_PREFIX, "/mcp", "/.well-known"],
943
945
  });
944
946
  try {
945
947
  await awaitBootstrap(nitroApp);
@@ -3497,16 +3499,18 @@ export function createCoreRoutesPlugin(
3497
3499
  handleMcpOAuthAuthorizationServerMetadata(event),
3498
3500
  ),
3499
3501
  );
3500
- getH3App(nitroApp).use(
3501
- `${P}/mcp/oauth`,
3502
- defineEventHandler(async (event: H3Event) => {
3503
- const subpath = event.url?.pathname || "";
3504
- return handleMcpOAuth(event, subpath, {
3505
- appId: options.mcpConnectAppId,
3506
- appName: options.mcpConnectAppName ?? getAppName(),
3507
- });
3508
- }),
3509
- );
3502
+ for (const mcpRoutePrefix of MCP_ROUTE_PREFIXES) {
3503
+ getH3App(nitroApp).use(
3504
+ `${mcpRoutePrefix}/oauth`,
3505
+ defineEventHandler(async (event: H3Event) => {
3506
+ const subpath = event.url?.pathname || "";
3507
+ return handleMcpOAuth(event, subpath, {
3508
+ appId: options.mcpConnectAppId,
3509
+ appName: options.mcpConnectAppName ?? getAppName(),
3510
+ });
3511
+ }),
3512
+ );
3513
+ }
3510
3514
 
3511
3515
  // Frictionless external-agent connection. A logged-in user mints a
3512
3516
  // per-user, scoped, revocable MCP bearer token here — via the browser
@@ -3522,16 +3526,18 @@ export function createCoreRoutesPlugin(
3522
3526
  appName: options.mcpConnectAppName ?? getAppName(),
3523
3527
  serverName: options.mcpConnectServerName,
3524
3528
  };
3525
- getH3App(nitroApp).use(
3526
- `${P}/mcp/connect`,
3527
- defineEventHandler(async (event: H3Event) => {
3528
- // The framework strips the mount prefix from event.url.pathname,
3529
- // so what remains is the subpath after `/connect` (e.g. `/token`,
3530
- // `/device/start`, or `` for the page itself).
3531
- const subpath = event.url?.pathname || "";
3532
- return handleMcpConnect(event, subpath, mcpConnectOpts);
3533
- }),
3534
- );
3529
+ for (const mcpRoutePrefix of MCP_ROUTE_PREFIXES) {
3530
+ getH3App(nitroApp).use(
3531
+ `${mcpRoutePrefix}/connect`,
3532
+ defineEventHandler(async (event: H3Event) => {
3533
+ // The framework strips the mount prefix from event.url.pathname,
3534
+ // so what remains is the subpath after `/connect` (e.g. `/token`,
3535
+ // `/device/start`, or `` for the page itself).
3536
+ const subpath = event.url?.pathname || "";
3537
+ return handleMcpConnect(event, subpath, mcpConnectOpts);
3538
+ }),
3539
+ );
3540
+ }
3535
3541
  }
3536
3542
 
3537
3543
  // Cross-app SSO ("Sign in with Agent-Native") — CLIENT side. Mounted
@@ -50,6 +50,7 @@ import {
50
50
  setResponseStatus,
51
51
  } from "h3";
52
52
 
53
+ import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
53
54
  import { getConfiguredAppBasePath } from "./app-base-path.js";
54
55
 
55
56
  /**
@@ -166,12 +167,28 @@ function matchingFrameworkPrefix(
166
167
  ): string | undefined {
167
168
  if (pathname.startsWith(frameworkPrefix)) return frameworkPrefix;
168
169
 
170
+ if (
171
+ pathname === MCP_PUBLIC_ROUTE_PREFIX ||
172
+ pathname.startsWith(`${MCP_PUBLIC_ROUTE_PREFIX}/`)
173
+ ) {
174
+ return MCP_PUBLIC_ROUTE_PREFIX;
175
+ }
176
+
169
177
  const basePath = getConfiguredAppBasePath();
170
178
  const basePathFrameworkPrefix = `${basePath}${frameworkPrefix}`;
171
179
  if (basePath && pathname.startsWith(basePathFrameworkPrefix)) {
172
180
  return basePathFrameworkPrefix;
173
181
  }
174
182
 
183
+ const basePathMcpPrefix = `${basePath}${MCP_PUBLIC_ROUTE_PREFIX}`;
184
+ if (
185
+ basePath &&
186
+ (pathname === basePathMcpPrefix ||
187
+ pathname.startsWith(`${basePathMcpPrefix}/`))
188
+ ) {
189
+ return basePathMcpPrefix;
190
+ }
191
+
175
192
  return undefined;
176
193
  }
177
194
 
@@ -15,6 +15,7 @@ import type { EventHandler, H3Event } from "h3";
15
15
  import { setResponseHeader, setResponseStatus } from "h3";
16
16
 
17
17
  import { getMissingDefaultPlugins } from "../deploy/route-discovery.js";
18
+ import { MCP_PUBLIC_ROUTE_PREFIX } from "../mcp/route-paths.js";
18
19
  import { getConfiguredAppBasePath } from "./app-base-path.js";
19
20
  import { captureError } from "./capture-error.js";
20
21
  import { createCsrfMiddleware } from "./csrf.js";
@@ -48,7 +49,8 @@ function pathMatchesPrefix(reqPath: string, prefix: string): boolean {
48
49
  function supportsAppBasePathMount(path: string): boolean {
49
50
  return (
50
51
  pathMatchesPrefix(path, FRAMEWORK_PREFIX) ||
51
- pathMatchesPrefix(path, WELL_KNOWN_PREFIX)
52
+ pathMatchesPrefix(path, WELL_KNOWN_PREFIX) ||
53
+ pathMatchesPrefix(path, MCP_PUBLIC_ROUTE_PREFIX)
52
54
  );
53
55
  }
54
56
 
@@ -164,6 +166,9 @@ export function getH3App(nitroApp: any): H3AppShim {
164
166
  registerMiddleware(nitroApp, WELL_KNOWN_PREFIX, readinessGate, {
165
167
  prepend: true,
166
168
  });
169
+ registerMiddleware(nitroApp, MCP_PUBLIC_ROUTE_PREFIX, readinessGate, {
170
+ prepend: true,
171
+ });
167
172
 
168
173
  // CSRF (see csrf.ts): registered here — synchronously, on the very
169
174
  // first `getH3App()` call for this nitroApp — rather than inside
@@ -196,7 +201,8 @@ export function getH3App(nitroApp: any): H3AppShim {
196
201
  const reqPath = event.url?.pathname ?? "";
197
202
  if (
198
203
  resolveMountMatch(reqPath, FRAMEWORK_PREFIX) ||
199
- resolveMountMatch(reqPath, WELL_KNOWN_PREFIX)
204
+ resolveMountMatch(reqPath, WELL_KNOWN_PREFIX) ||
205
+ resolveMountMatch(reqPath, MCP_PUBLIC_ROUTE_PREFIX)
200
206
  ) {
201
207
  await awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath);
202
208
  }
@@ -170,6 +170,12 @@ function getConfiguredOriginAllowlist(): Set<string> {
170
170
  return out;
171
171
  }
172
172
 
173
+ /** Return whether a candidate is one of this deployment's configured origins. */
174
+ export function isConfiguredAppOrigin(value: string | undefined): boolean {
175
+ const origin = normalizeOrigin(value);
176
+ return !!origin && getConfiguredOriginAllowlist().has(origin);
177
+ }
178
+
173
179
  function getWorkspaceCallbackOrigin(): string | undefined {
174
180
  const publicAuthOrigin = firstOriginFromEnv(EXPLICIT_PUBLIC_ORIGIN_ENV_KEYS, {
175
181
  allowLoopback: true,
@@ -2,6 +2,7 @@ import { defineEventHandler, getHeader, getMethod } from "h3";
2
2
  import type { EventHandler, H3Event } from "h3";
3
3
 
4
4
  import { getDatabaseRuntimeFingerprint } from "../db/runtime-diagnostics.js";
5
+ import { isMcpPublicPath } from "../mcp/route-paths.js";
5
6
  import { track } from "../tracking/index.js";
6
7
  import { getAppName } from "./app-name.js";
7
8
 
@@ -74,7 +75,11 @@ function statusClass(statusCode: number): string {
74
75
  }
75
76
 
76
77
  function routeKind(pathname: string): string {
77
- if (pathname === "/_agent-native" || pathname.startsWith("/_agent-native/")) {
78
+ if (
79
+ isMcpPublicPath(pathname) ||
80
+ pathname === "/_agent-native" ||
81
+ pathname.startsWith("/_agent-native/")
82
+ ) {
78
83
  return "framework";
79
84
  }
80
85
  if (pathname === "/api" || pathname.startsWith("/api/")) return "api";
@@ -5,7 +5,7 @@
5
5
  * Auth: `Authorization: Bearer <token>` — accepts the SAME tokens the MCP /
6
6
  * action surface accepts: a legacy `sessions` bearer (desktop/native) OR a
7
7
  * connect-minted MCP OAuth access token (the `agent-native connect` token,
8
- * audience-bound to this app's `{origin}/_agent-native/mcp` resource). A
8
+ * audience-bound to this app's `{origin}/mcp` resource). A
9
9
  * normal browser session cookie is also accepted. Rejects unauthenticated
10
10
  * callers with 401.
11
11
  * Body: raw `image/png` bytes, or JSON `{ "pngBase64": "..." }`. Capped at
@@ -74,13 +74,13 @@ async function resolveUploadSession(
74
74
  if (!authHeader || !bearer) return null;
75
75
 
76
76
  try {
77
- const [{ getMcpOAuthResource }, { verifyAuth, resolveOrgIdFromDomain }] =
77
+ const [{ getMcpOAuthAudiences }, { verifyAuth, resolveOrgIdFromDomain }] =
78
78
  await Promise.all([
79
79
  import("../mcp/oauth-route.js"),
80
80
  import("../mcp/build-server.js"),
81
81
  ]);
82
82
  const result = await verifyAuth(authHeader, undefined, {
83
- resourceUrl: getMcpOAuthResource(event),
83
+ resourceUrl: getMcpOAuthAudiences(event),
84
84
  allowDevOpen: false,
85
85
  });
86
86
  const identity = result.authed ? result.identity : undefined;
@@ -56,6 +56,10 @@ import { createHash } from "node:crypto";
56
56
 
57
57
  import { defineEventHandler, getHeader, setResponseHeader } from "h3";
58
58
 
59
+ import {
60
+ isMcpProtocolPath,
61
+ MCP_PUBLIC_ROUTE_PREFIX,
62
+ } from "../mcp/route-paths.js";
59
63
  import {
60
64
  isMcpEmbedCorsOrigin,
61
65
  MCP_EMBED_CORS_ALLOW_HEADERS,
@@ -101,8 +105,10 @@ function isMcpEndpointRequest(event: any): boolean {
101
105
  const pathname =
102
106
  event?.url?.pathname ??
103
107
  String(event?.node?.req?.url ?? event?.path ?? "/").split("?")[0];
108
+ const normalizedPathname = pathname.replace(/\/+$/, "");
104
109
  return (
105
- pathname === "/_agent-native/mcp" || pathname.endsWith("/_agent-native/mcp")
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 DEFAULT_SSR_CACHE_CONTROL = "public, max-age=0, must-revalidate";
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 DEFAULT_SSR_CDN_CACHE_CONTROL =
4
- "public, s-maxage=600, stale-while-revalidate=604800, stale-if-error=3600";
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
- "public, durable, s-maxage=600, stale-while-revalidate=604800, stale-if-error=3600";
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 `/_agent-native/mcp` endpoint is also a standard protected MCP
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
- `/_agent-native/mcp/oauth/authorize` / `/_agent-native/mcp/oauth/token`.
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 remain server-protected. The
142
- client session gate is therefore the authoritative decision point for whether
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/_agent-native/mcp`. Dispatch's Agents page
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/_agent-native/mcp` or
29
- `https://<your-host>/_agent-native/mcp`.
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/_agent-native/mcp
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/_agent-native/mcp
83
- https://<your-app>.agent-native.com/_agent-native/mcp
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>/_agent-native/mcp/connect`, which shows
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
- `/_agent-native/mcp` endpoint accepts it like any bearer — no new endpoint.
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
- `/_agent-native/mcp` (live registry + HMR + correct deep links stay the single
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. Big payloads and long lists
124
+ ## 6. SSR shell caching load-bearing, do not undo
125
+
126
+ Every SSR HTML page and React Router `.data` response is one impersonal,
127
+ public shell, hard-cached at the CDN and served identically to every visitor —
128
+ logged in or not. This is the single biggest lever on first-response latency:
129
+ one shared cache entry serves the whole site instead of a per-user render on
130
+ every request. Adding `private`, `no-store`, `Vary: Cookie`, a session read, or
131
+ an auth branch to the SSR path defeats the cache for **every visitor**, not
132
+ just one.
133
+
134
+ If you're debugging a slow first response, check whether something
135
+ re-personalized the shell before concluding the render itself is slow — the
136
+ fix is client-side data loading after the shell paints, never per-user SSR.
137
+ See the `authentication` skill for the full model and `guard:ssr-cache-shell`
138
+ plus `ssr-handler.spec.ts` (`packages/core/src/server/ssr-handler.ts`) for the
139
+ enforced contract.
140
+
141
+ ## 7. Big payloads and long lists
125
142
 
126
143
  - **Paginate or window** unbounded lists (messages, responses, events, activity).
127
144
  Don't load the entire history on open; load a recent window and fetch older on
@@ -144,3 +161,5 @@ index the growing tables first.
144
161
  - [ ] Client fires independent queries in parallel, not a waterfall.
145
162
  - [ ] No heavy recompute on every read; no aggressive polling of heavy endpoints.
146
163
  - [ ] Unbounded lists are paginated/windowed; large blobs aren't inlined on the hot path.
164
+ - [ ] SSR HTML/`.data` path stays session-blind and cacheable — no `private`,
165
+ `no-store`, `Vary: Cookie`, or auth branch added to it.
@@ -147,6 +147,16 @@ export default defineEventHandler(async (event) => {
147
147
 
148
148
  - Never create unprotected routes that modify data.
149
149
 
150
+ **Exception — the SSR HTML/`.data` catch-all is deliberately session-blind.**
151
+ The rule above is for routes that read or mutate user data. The SSR page
152
+ render and React Router `.data` route are different: they serve one
153
+ impersonal, public-cacheable shell to every visitor by design, and loaders on
154
+ that path render no user data. Do not "fix" this by adding `getSession`,
155
+ `private`, or `no-store` to it — that regresses the CDN cache contract for the
156
+ whole site. Data scoping lives in actions and API routes; the client gates
157
+ private UI after the shell loads. See the `authentication` skill and
158
+ `guard:ssr-cache-shell` / `ssr-handler.spec.ts`.
159
+
150
160
  ## Human-in-the-Loop Approval for High-Consequence Actions
151
161
 
152
162
  For a small set of outward-facing, hard-to-undo operations — sending an email, charging a card, deleting an account, posting publicly — auth and access control are necessary but not sufficient: you also do not want the **agent** to perform them autonomously. Set `needsApproval` on the `defineAction` so the agent cannot run the action without a human approving the specific call.
@@ -147,6 +147,16 @@ export default defineEventHandler(async (event) => {
147
147
 
148
148
  - Never create unprotected routes that modify data.
149
149
 
150
+ **Exception — the SSR HTML/`.data` catch-all is deliberately session-blind.**
151
+ The rule above is for routes that read or mutate user data. The SSR page
152
+ render and React Router `.data` route are different: they serve one
153
+ impersonal, public-cacheable shell to every visitor by design, and loaders on
154
+ that path render no user data. Do not "fix" this by adding `getSession`,
155
+ `private`, or `no-store` to it — that regresses the CDN cache contract for the
156
+ whole site. Data scoping lives in actions and API routes; the client gates
157
+ private UI after the shell loads. See the `authentication` skill and
158
+ `guard:ssr-cache-shell` / `ssr-handler.spec.ts`.
159
+
150
160
  ## Human-in-the-Loop Approval for High-Consequence Actions
151
161
 
152
162
  For a small set of outward-facing, hard-to-undo operations — sending an email, charging a card, deleting an account, posting publicly — auth and access control are necessary but not sufficient: you also do not want the **agent** to perform them autonomously. Set `needsApproval` on the `defineAction` so the agent cannot run the action without a human approving the specific call.
@@ -245,14 +245,73 @@
245
245
  transform-origin: top left;
246
246
  }
247
247
 
248
- /* IMPORTANT: Keep rrweb's stock SVG arrow. Only suppress its permanently
249
- visible purple ::after disc, which can otherwise read as the cursor itself
250
- when the arrow is small. The stock .active animation still supplies the
251
- brief click halo. Do not replace the arrow with an app-colored dot. */
248
+ /* INTENTIONAL DO NOT REMOVE OR REPLACE WITH rrweb's STOCK CURSOR.
249
+ The recorded visitor cursor is a core session-replay affordance: users need
250
+ to see the Mac-style arrow where the visitor clicked, including on dark
251
+ recordings. rrweb's bundled cursor is a small black sprite that disappears
252
+ against those pages. This high-contrast arrow stays inside the replayer
253
+ wrapper and scales with the fit-to-stage transform. */
254
+ .an-replay-stage-root .replayer-mouse {
255
+ position: absolute;
256
+ z-index: 2;
257
+ width: 1.125rem;
258
+ height: 1.5rem;
259
+ border-radius: 0;
260
+ background: transparent;
261
+ background-image: none;
262
+ box-shadow: none;
263
+ transform: none;
264
+ transition:
265
+ left 80ms linear,
266
+ top 80ms linear;
267
+ pointer-events: none;
268
+ }
269
+
270
+ .an-replay-stage-root .replayer-mouse::before {
271
+ content: "";
272
+ position: absolute;
273
+ inset: 0;
274
+ background: hsl(0 0% 100%);
275
+ clip-path: polygon(0 0, 0 77%, 30% 57%, 48% 100%, 68% 92%, 50% 51%, 92% 51%);
276
+ filter: drop-shadow(0 0 1px hsl(0 0% 0% / 0.95))
277
+ drop-shadow(0 1px 3px hsl(0 0% 0% / 0.35));
278
+ }
279
+
252
280
  .an-replay-stage-root .replayer-mouse::after {
281
+ content: "";
282
+ position: absolute;
283
+ left: -0.5rem;
284
+ top: -0.5rem;
285
+ width: 1rem;
286
+ height: 1rem;
287
+ border: 2px solid hsl(217 91% 60%);
288
+ border-radius: 9999px;
289
+ background: transparent;
253
290
  opacity: 0;
254
291
  }
255
292
 
293
+ /* rrweb toggles `.active` on mouse interactions; pulse a click ripple. */
294
+ .an-replay-stage-root .replayer-mouse.active::after {
295
+ animation: an-replay-mouse-click 0.4s ease-out 1;
296
+ }
297
+
298
+ @keyframes an-replay-mouse-click {
299
+ 0% {
300
+ opacity: 0.5;
301
+ transform: scale(1);
302
+ }
303
+ 100% {
304
+ opacity: 0;
305
+ transform: scale(3.5);
306
+ }
307
+ }
308
+
309
+ .an-replay-stage-root .replayer-mouse-tail {
310
+ position: absolute;
311
+ inset: 0;
312
+ pointer-events: none;
313
+ }
314
+
256
315
  .analytics-session-snippet .plan-code-surface {
257
316
  border: 0;
258
317
  border-radius: 0;
@@ -986,11 +986,14 @@ function ReplayPlayer({
986
986
  />
987
987
  <button
988
988
  type="button"
989
- // IMPORTANT: Keep the viewer's real OS pointer visible while
990
- // the synthetic rrweb pointer replays underneath it. Hiding
991
- // this during playback makes the page feel broken whenever
992
- // the viewer moves their mouse over the full-stage control.
993
- className="absolute inset-0 z-20 cursor-pointer 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"
989
+ className={cn(
990
+ "absolute inset-0 z-20 rounded-[inherit] border-0 bg-transparent p-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-default",
991
+ // INTENTIONAL DO NOT REMOVE `cursor-none` while playing.
992
+ // The recorded cursor is the meaningful pointer here;
993
+ // hiding the viewer's stationary pointer keeps the
994
+ // Mac-style replay cursor easy to follow.
995
+ playing ? "cursor-none" : "cursor-pointer",
996
+ )}
994
997
  disabled={disabled}
995
998
  aria-label={
996
999
  playing ? t("sessions.pause") : t("sessions.play")
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-13
4
+ ---
5
+
6
+ Daily dashboard emails recover more reliably from serverless browser failures and report image errors accurately.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-13
4
+ ---
5
+
6
+ Session replays keep a visible Mac-style cursor over the visitor's recorded actions