@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.
Files changed (583) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +25 -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/agent/production-agent.ts +21 -0
  139. package/corpus/core/src/cli/connect.ts +50 -24
  140. package/corpus/core/src/cli/mcp-config-writers.ts +10 -0
  141. package/corpus/core/src/cli/mcp.ts +5 -5
  142. package/corpus/core/src/cli/pr-visual-recap-workflow.ts +1 -1
  143. package/corpus/core/src/cli/skills-content/assets-skill.ts +1 -1
  144. package/corpus/core/src/cli/skills-content/design-exploration-skill.ts +1 -1
  145. package/corpus/core/src/cli/skills-content/help.ts +1 -1
  146. package/corpus/core/src/cli/skills-content/plan-setup-auth.ts +1 -1
  147. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +1 -1
  148. package/corpus/core/src/cli/skills-content/visual-recap-skill.ts +2 -2
  149. package/corpus/core/src/cli/skills.ts +23 -12
  150. package/corpus/core/src/client/analytics.ts +13 -0
  151. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +5 -0
  152. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +17 -0
  153. package/corpus/core/src/embedding/agent.ts +8 -6
  154. package/corpus/core/src/localization/default-messages.ts +7 -0
  155. package/corpus/core/src/mcp/ask-app-inline-tasks.ts +125 -0
  156. package/corpus/core/src/mcp/build-server.ts +65 -3
  157. package/corpus/core/src/mcp/builtin-tools.ts +186 -22
  158. package/corpus/core/src/mcp/connect-route.ts +17 -14
  159. package/corpus/core/src/mcp/oauth-route.ts +38 -13
  160. package/corpus/core/src/mcp/route-paths.ts +34 -0
  161. package/corpus/core/src/mcp/server.ts +21 -10
  162. package/corpus/core/src/mcp/stdio.ts +34 -16
  163. package/corpus/core/src/mcp/workspace-resolve.ts +2 -1
  164. package/corpus/core/src/mcp-client/manager.ts +5 -3
  165. package/corpus/core/src/mcp-client/remote-store.ts +10 -10
  166. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +13 -0
  167. package/corpus/core/src/server/agent-chat-plugin.ts +42 -9
  168. package/corpus/core/src/server/agent-teams.ts +17 -0
  169. package/corpus/core/src/server/auth.ts +22 -6
  170. package/corpus/core/src/server/core-routes-plugin.ts +30 -24
  171. package/corpus/core/src/server/csrf.ts +17 -0
  172. package/corpus/core/src/server/framework-request-handler.ts +8 -2
  173. package/corpus/core/src/server/google-oauth.ts +12 -2
  174. package/corpus/core/src/server/http-response-telemetry.ts +6 -1
  175. package/corpus/core/src/server/recap-image-route.ts +3 -3
  176. package/corpus/core/src/server/security-headers.ts +7 -1
  177. package/corpus/core/src/server/ssr-handler.ts +2 -0
  178. package/corpus/core/src/shared/cache-control.ts +6 -4
  179. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  180. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  181. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  182. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  183. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  184. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +10 -0
  185. package/corpus/templates/analytics/app/assets/replay-cursor.svg +17 -0
  186. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +4 -3
  187. package/corpus/templates/analytics/app/global.css +71 -4
  188. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +32 -4
  189. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +1 -1
  190. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +49 -11
  191. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +4 -6
  192. package/corpus/templates/analytics/changelog/2026-07-13-all-time-dashboard-filters-no-longer-send-invalid-dates-to-b.md +6 -0
  193. package/corpus/templates/analytics/changelog/2026-07-13-daily-dashboard-emails-recover-more-reliably-from-serverless.md +6 -0
  194. package/corpus/templates/analytics/changelog/2026-07-13-error-issue-titles-wrap-instead-of-overflowing.md +6 -0
  195. package/corpus/templates/analytics/changelog/2026-07-13-saving-a-new-dashboard-view-no-longer-fails-with-a-server-er.md +6 -0
  196. package/corpus/templates/analytics/changelog/2026-07-13-session-replay-cursors-stay-hidden-until-their-first-recorde.md +6 -0
  197. package/corpus/templates/analytics/changelog/2026-07-13-session-replay-links-now-support-cmd-click-and-middle-click-.md +6 -0
  198. package/corpus/templates/analytics/changelog/2026-07-13-session-replays-keep-a-visible-mac-style-cursor-over-the-vis.md +6 -0
  199. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +21 -2
  200. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +57 -1
  201. package/corpus/templates/analytics/server/lib/dashboard-report.ts +266 -28
  202. package/corpus/templates/analytics/server/lib/dashboards-store.ts +43 -4
  203. package/corpus/templates/analytics/server/lib/error-capture.ts +24 -5
  204. package/corpus/templates/analytics/server/plugins/agent-chat.ts +5 -0
  205. package/corpus/templates/analytics/server/routes/[...page].get.ts +0 -2
  206. package/corpus/templates/assets/.agents/skills/security/SKILL.md +10 -0
  207. package/corpus/templates/assets/agent-native.app-skill.json +1 -1
  208. package/corpus/templates/brain/.agents/skills/security/SKILL.md +10 -0
  209. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +10 -0
  210. package/corpus/templates/calendar/AGENTS.md +2 -1
  211. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +0 -19
  212. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +14 -5
  213. package/corpus/templates/calendar/changelog/2026-07-13-your-local-time-now-follows-your-browser-timezone-and-event-.md +6 -0
  214. package/corpus/templates/chat/.agents/skills/security/SKILL.md +10 -0
  215. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +7 -2
  216. package/corpus/templates/clips/.agents/skills/security/SKILL.md +10 -0
  217. package/corpus/templates/clips/AGENTS.md +7 -0
  218. package/corpus/templates/clips/actions/list-meetings.ts +19 -4
  219. package/corpus/templates/clips/actions/start-meeting-recording.ts +7 -1
  220. package/corpus/templates/clips/app/components/library/recording-card.tsx +27 -26
  221. package/corpus/templates/clips/app/components/library/space-card.tsx +4 -6
  222. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +75 -78
  223. package/corpus/templates/clips/app/components/recorder/confetti-canvas.tsx +18 -1
  224. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +6 -12
  225. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +19 -2
  226. package/corpus/templates/clips/app/lib/camera-composite.ts +70 -10
  227. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +1 -1
  228. package/corpus/templates/clips/app/routes/record.tsx +5 -25
  229. package/corpus/templates/clips/changelog/2026-07-13-clips-desktop-now-requires-macos-13-for-native-capture.md +6 -0
  230. package/corpus/templates/clips/changelog/2026-07-13-clips-hide-solo-meeting-reminders.md +6 -0
  231. package/corpus/templates/clips/changelog/2026-07-13-clips-now-removes-duplicate-mic-and-system-transcript-turns-.md +6 -0
  232. package/corpus/templates/clips/changelog/2026-07-13-desktop-recordings-run-cooler-and-quieter-live-transcription.md +6 -0
  233. package/corpus/templates/clips/changelog/2026-07-13-meeting-recordings-now-stop-after-a-calendar-meeting-ends-an.md +6 -0
  234. package/corpus/templates/clips/changelog/2026-07-13-meeting-transcripts-now-use-a-clean-agent-chat-style-reading.md +6 -0
  235. package/corpus/templates/clips/changelog/2026-07-13-screen-recordings-use-less-processing-power-during-longer-ca.md +6 -0
  236. package/corpus/templates/clips/chrome-extension/src/background.ts +5 -3
  237. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +17 -14
  238. package/corpus/templates/clips/chrome-extension/src/overlay.ts +8 -2
  239. package/corpus/templates/clips/desktop/README.md +3 -0
  240. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -0
  241. package/corpus/templates/clips/desktop/src/lib/recorder.ts +8 -2
  242. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  243. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +5 -0
  244. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +134 -5
  245. package/corpus/templates/clips/desktop/src/lib/upload-video-stream.ts +28 -0
  246. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +10 -3
  247. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +42 -9
  248. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +10 -2
  249. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +6 -1
  250. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +77 -1
  251. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +104 -25
  252. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +4 -0
  253. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +287 -32
  254. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  255. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +28 -0
  256. package/corpus/templates/clips/server/routes/[...page].get.ts +1 -59
  257. package/corpus/templates/clips/shared/recording-capture.ts +37 -0
  258. package/corpus/templates/content/.agents/skills/security/SKILL.md +10 -0
  259. package/corpus/templates/content/agent-native.app-skill.json +1 -1
  260. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +18 -16
  261. package/corpus/templates/content/server/routes/[...page].get.ts +1 -15
  262. package/corpus/templates/design/.agents/skills/security/SKILL.md +10 -0
  263. package/corpus/templates/design/actions/connect-assets-mcp.ts +1 -1
  264. package/corpus/templates/design/agent-native.app-skill.json +1 -1
  265. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +88 -12
  266. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1 -0
  267. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +4 -1
  268. package/corpus/templates/design/changelog/2026-07-13-adding-shapes-preserves-canvas-background.md +6 -0
  269. package/corpus/templates/design/changelog/2026-07-13-clicking-quickly-between-overlapping-elements-no-longer-bounc.md +6 -0
  270. package/corpus/templates/design/server/plugins/assets-mcp.ts +1 -1
  271. package/corpus/templates/design/server/routes/[...page].get.ts +0 -2
  272. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +10 -0
  273. package/corpus/templates/forms/.agents/skills/security/SKILL.md +10 -0
  274. package/corpus/templates/macros/.agents/skills/security/SKILL.md +10 -0
  275. package/corpus/templates/mail/.agents/skills/security/SKILL.md +10 -0
  276. package/corpus/templates/plan/.agents/skills/security/SKILL.md +10 -0
  277. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +1 -1
  278. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +2 -2
  279. package/corpus/templates/plan/agent-native.app-skill.json +1 -1
  280. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +6 -1
  281. package/corpus/templates/plan/app/pages/PlansPage.tsx +15 -6
  282. package/corpus/templates/plan/changelog/2026-07-13-fixed-local-plan-previews-continuously-flickering-while-revi.md +6 -0
  283. package/corpus/templates/plan/server/routes/[...page].get.ts +0 -2
  284. package/corpus/templates/slides/.agents/skills/security/SKILL.md +10 -0
  285. package/dist/a2a/client.d.ts +2 -0
  286. package/dist/a2a/client.d.ts.map +1 -1
  287. package/dist/a2a/client.js +2 -0
  288. package/dist/a2a/client.js.map +1 -1
  289. package/dist/a2a/handlers.d.ts.map +1 -1
  290. package/dist/a2a/handlers.js +84 -7
  291. package/dist/a2a/handlers.js.map +1 -1
  292. package/dist/agent/production-agent.d.ts +9 -0
  293. package/dist/agent/production-agent.d.ts.map +1 -1
  294. package/dist/agent/production-agent.js +12 -0
  295. package/dist/agent/production-agent.js.map +1 -1
  296. package/dist/cli/connect.d.ts +2 -2
  297. package/dist/cli/connect.d.ts.map +1 -1
  298. package/dist/cli/connect.js +45 -23
  299. package/dist/cli/connect.js.map +1 -1
  300. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  301. package/dist/cli/mcp-config-writers.js +7 -0
  302. package/dist/cli/mcp-config-writers.js.map +1 -1
  303. package/dist/cli/mcp.js +5 -3
  304. package/dist/cli/mcp.js.map +1 -1
  305. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  306. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  307. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  308. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  309. package/dist/cli/skills-content/assets-skill.d.ts +1 -1
  310. package/dist/cli/skills-content/assets-skill.d.ts.map +1 -1
  311. package/dist/cli/skills-content/assets-skill.js +1 -1
  312. package/dist/cli/skills-content/assets-skill.js.map +1 -1
  313. package/dist/cli/skills-content/design-exploration-skill.d.ts +1 -1
  314. package/dist/cli/skills-content/design-exploration-skill.d.ts.map +1 -1
  315. package/dist/cli/skills-content/design-exploration-skill.js +1 -1
  316. package/dist/cli/skills-content/design-exploration-skill.js.map +1 -1
  317. package/dist/cli/skills-content/help.d.ts +1 -1
  318. package/dist/cli/skills-content/help.d.ts.map +1 -1
  319. package/dist/cli/skills-content/help.js +1 -1
  320. package/dist/cli/skills-content/help.js.map +1 -1
  321. package/dist/cli/skills-content/plan-setup-auth.d.ts +1 -1
  322. package/dist/cli/skills-content/plan-setup-auth.d.ts.map +1 -1
  323. package/dist/cli/skills-content/plan-setup-auth.js +1 -1
  324. package/dist/cli/skills-content/plan-setup-auth.js.map +1 -1
  325. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  326. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  327. package/dist/cli/skills-content/visual-plan-skill.js +1 -1
  328. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  329. package/dist/cli/skills-content/visual-recap-skill.d.ts +1 -1
  330. package/dist/cli/skills-content/visual-recap-skill.d.ts.map +1 -1
  331. package/dist/cli/skills-content/visual-recap-skill.js +2 -2
  332. package/dist/cli/skills-content/visual-recap-skill.js.map +1 -1
  333. package/dist/cli/skills.d.ts.map +1 -1
  334. package/dist/cli/skills.js +16 -12
  335. package/dist/cli/skills.js.map +1 -1
  336. package/dist/client/analytics.d.ts.map +1 -1
  337. package/dist/client/analytics.js +11 -0
  338. package/dist/client/analytics.js.map +1 -1
  339. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  340. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  341. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  342. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  343. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  344. package/dist/client/resources/mcp-integration-catalog.js +14 -0
  345. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  346. package/dist/collab/awareness.d.ts +2 -2
  347. package/dist/collab/awareness.d.ts.map +1 -1
  348. package/dist/collab/routes.d.ts +1 -1
  349. package/dist/collab/struct-routes.d.ts +1 -1
  350. package/dist/embedding/agent.d.ts.map +1 -1
  351. package/dist/embedding/agent.js +6 -7
  352. package/dist/embedding/agent.js.map +1 -1
  353. package/dist/localization/default-messages.d.ts +5 -0
  354. package/dist/localization/default-messages.d.ts.map +1 -1
  355. package/dist/localization/default-messages.js +5 -0
  356. package/dist/localization/default-messages.js.map +1 -1
  357. package/dist/mcp/ask-app-inline-tasks.d.ts +47 -0
  358. package/dist/mcp/ask-app-inline-tasks.d.ts.map +1 -0
  359. package/dist/mcp/ask-app-inline-tasks.js +87 -0
  360. package/dist/mcp/ask-app-inline-tasks.js.map +1 -0
  361. package/dist/mcp/build-server.d.ts.map +1 -1
  362. package/dist/mcp/build-server.js +56 -3
  363. package/dist/mcp/build-server.js.map +1 -1
  364. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  365. package/dist/mcp/builtin-tools.js +141 -21
  366. package/dist/mcp/builtin-tools.js.map +1 -1
  367. package/dist/mcp/connect-route.d.ts +12 -10
  368. package/dist/mcp/connect-route.d.ts.map +1 -1
  369. package/dist/mcp/connect-route.js +17 -14
  370. package/dist/mcp/connect-route.js.map +1 -1
  371. package/dist/mcp/oauth-route.d.ts +1 -1
  372. package/dist/mcp/oauth-route.d.ts.map +1 -1
  373. package/dist/mcp/oauth-route.js +30 -13
  374. package/dist/mcp/oauth-route.js.map +1 -1
  375. package/dist/mcp/route-paths.d.ts +13 -0
  376. package/dist/mcp/route-paths.d.ts.map +1 -0
  377. package/dist/mcp/route-paths.js +27 -0
  378. package/dist/mcp/route-paths.js.map +1 -0
  379. package/dist/mcp/server.d.ts +2 -1
  380. package/dist/mcp/server.d.ts.map +1 -1
  381. package/dist/mcp/server.js +14 -6
  382. package/dist/mcp/server.js.map +1 -1
  383. package/dist/mcp/stdio.d.ts +7 -6
  384. package/dist/mcp/stdio.d.ts.map +1 -1
  385. package/dist/mcp/stdio.js +27 -15
  386. package/dist/mcp/stdio.js.map +1 -1
  387. package/dist/mcp/workspace-resolve.d.ts +2 -1
  388. package/dist/mcp/workspace-resolve.d.ts.map +1 -1
  389. package/dist/mcp/workspace-resolve.js +2 -1
  390. package/dist/mcp/workspace-resolve.js.map +1 -1
  391. package/dist/mcp-client/manager.js +6 -3
  392. package/dist/mcp-client/manager.js.map +1 -1
  393. package/dist/mcp-client/remote-store.js +5 -7
  394. package/dist/mcp-client/remote-store.js.map +1 -1
  395. package/dist/notifications/routes.d.ts +3 -3
  396. package/dist/progress/routes.d.ts +1 -1
  397. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  398. package/dist/resources/handlers.d.ts +2 -2
  399. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  400. package/dist/server/agent-chat/action-filters-a2a.js +11 -1
  401. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  402. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  403. package/dist/server/agent-chat-plugin.js +43 -11
  404. package/dist/server/agent-chat-plugin.js.map +1 -1
  405. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  406. package/dist/server/agent-teams.d.ts.map +1 -1
  407. package/dist/server/agent-teams.js +15 -1
  408. package/dist/server/agent-teams.js.map +1 -1
  409. package/dist/server/auth.d.ts.map +1 -1
  410. package/dist/server/auth.js +16 -6
  411. package/dist/server/auth.js.map +1 -1
  412. package/dist/server/core-routes-plugin.d.ts +4 -3
  413. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  414. package/dist/server/core-routes-plugin.js +20 -15
  415. package/dist/server/core-routes-plugin.js.map +1 -1
  416. package/dist/server/csrf.d.ts.map +1 -1
  417. package/dist/server/csrf.js +11 -0
  418. package/dist/server/csrf.js.map +1 -1
  419. package/dist/server/framework-request-handler.d.ts.map +1 -1
  420. package/dist/server/framework-request-handler.js +8 -2
  421. package/dist/server/framework-request-handler.js.map +1 -1
  422. package/dist/server/google-oauth.d.ts +2 -0
  423. package/dist/server/google-oauth.d.ts.map +1 -1
  424. package/dist/server/google-oauth.js +11 -2
  425. package/dist/server/google-oauth.js.map +1 -1
  426. package/dist/server/http-response-telemetry.d.ts.map +1 -1
  427. package/dist/server/http-response-telemetry.js +4 -1
  428. package/dist/server/http-response-telemetry.js.map +1 -1
  429. package/dist/server/recap-image-route.js +3 -3
  430. package/dist/server/recap-image-route.js.map +1 -1
  431. package/dist/server/security-headers.d.ts.map +1 -1
  432. package/dist/server/security-headers.js +4 -1
  433. package/dist/server/security-headers.js.map +1 -1
  434. package/dist/server/ssr-handler.d.ts.map +1 -1
  435. package/dist/server/ssr-handler.js +3 -1
  436. package/dist/server/ssr-handler.js.map +1 -1
  437. package/dist/shared/cache-control.d.ts +7 -6
  438. package/dist/shared/cache-control.d.ts.map +1 -1
  439. package/dist/shared/cache-control.js +4 -3
  440. package/dist/shared/cache-control.js.map +1 -1
  441. package/dist/templates/default/.agents/skills/security/SKILL.md +10 -0
  442. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  443. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  444. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  445. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +10 -0
  446. package/docs/content/actions.mdx +1 -1
  447. package/docs/content/authentication.mdx +1 -1
  448. package/docs/content/dispatch.mdx +3 -3
  449. package/docs/content/external-agents.mdx +30 -19
  450. package/docs/content/locales/ar-SA/actions.mdx +1 -1
  451. package/docs/content/locales/ar-SA/authentication.mdx +1 -1
  452. package/docs/content/locales/ar-SA/dispatch.mdx +3 -3
  453. package/docs/content/locales/ar-SA/external-agents.mdx +23 -19
  454. package/docs/content/locales/ar-SA/mcp-clients.mdx +31 -3
  455. package/docs/content/locales/ar-SA/mcp-protocol.mdx +29 -15
  456. package/docs/content/locales/ar-SA/plan-plugin.mdx +3 -3
  457. package/docs/content/locales/ar-SA/server.mdx +2 -2
  458. package/docs/content/locales/ar-SA/skills-guide.mdx +1 -1
  459. package/docs/content/locales/ar-SA/template-assets.mdx +1 -1
  460. package/docs/content/locales/ar-SA/template-dispatch.mdx +2 -2
  461. package/docs/content/locales/ar-SA/template-plan.mdx +3 -3
  462. package/docs/content/locales/de-DE/actions.mdx +1 -1
  463. package/docs/content/locales/de-DE/authentication.mdx +1 -1
  464. package/docs/content/locales/de-DE/dispatch.mdx +3 -3
  465. package/docs/content/locales/de-DE/external-agents.mdx +23 -19
  466. package/docs/content/locales/de-DE/mcp-clients.mdx +37 -3
  467. package/docs/content/locales/de-DE/mcp-protocol.mdx +29 -15
  468. package/docs/content/locales/de-DE/plan-plugin.mdx +3 -3
  469. package/docs/content/locales/de-DE/server.mdx +2 -2
  470. package/docs/content/locales/de-DE/skills-guide.mdx +1 -1
  471. package/docs/content/locales/de-DE/template-assets.mdx +1 -1
  472. package/docs/content/locales/de-DE/template-dispatch.mdx +2 -2
  473. package/docs/content/locales/de-DE/template-plan.mdx +3 -3
  474. package/docs/content/locales/es-ES/actions.mdx +1 -1
  475. package/docs/content/locales/es-ES/authentication.mdx +1 -1
  476. package/docs/content/locales/es-ES/dispatch.mdx +3 -3
  477. package/docs/content/locales/es-ES/external-agents.mdx +32 -19
  478. package/docs/content/locales/es-ES/mcp-clients.mdx +17 -3
  479. package/docs/content/locales/es-ES/mcp-protocol.mdx +38 -15
  480. package/docs/content/locales/es-ES/plan-plugin.mdx +3 -3
  481. package/docs/content/locales/es-ES/server.mdx +2 -2
  482. package/docs/content/locales/es-ES/skills-guide.mdx +1 -1
  483. package/docs/content/locales/es-ES/template-assets.mdx +1 -1
  484. package/docs/content/locales/es-ES/template-dispatch.mdx +2 -2
  485. package/docs/content/locales/es-ES/template-plan.mdx +3 -3
  486. package/docs/content/locales/fr-FR/actions.mdx +1 -1
  487. package/docs/content/locales/fr-FR/authentication.mdx +1 -1
  488. package/docs/content/locales/fr-FR/dispatch.mdx +3 -3
  489. package/docs/content/locales/fr-FR/external-agents.mdx +23 -19
  490. package/docs/content/locales/fr-FR/mcp-clients.mdx +17 -3
  491. package/docs/content/locales/fr-FR/mcp-protocol.mdx +29 -15
  492. package/docs/content/locales/fr-FR/plan-plugin.mdx +3 -3
  493. package/docs/content/locales/fr-FR/server.mdx +2 -2
  494. package/docs/content/locales/fr-FR/skills-guide.mdx +1 -1
  495. package/docs/content/locales/fr-FR/template-assets.mdx +1 -1
  496. package/docs/content/locales/fr-FR/template-dispatch.mdx +2 -2
  497. package/docs/content/locales/fr-FR/template-plan.mdx +3 -3
  498. package/docs/content/locales/hi-IN/actions.mdx +1 -1
  499. package/docs/content/locales/hi-IN/authentication.mdx +1 -1
  500. package/docs/content/locales/hi-IN/dispatch.mdx +3 -3
  501. package/docs/content/locales/hi-IN/external-agents.mdx +31 -19
  502. package/docs/content/locales/hi-IN/mcp-clients.mdx +17 -3
  503. package/docs/content/locales/hi-IN/mcp-protocol.mdx +36 -15
  504. package/docs/content/locales/hi-IN/plan-plugin.mdx +3 -3
  505. package/docs/content/locales/hi-IN/server.mdx +2 -2
  506. package/docs/content/locales/hi-IN/skills-guide.mdx +1 -1
  507. package/docs/content/locales/hi-IN/template-assets.mdx +1 -1
  508. package/docs/content/locales/hi-IN/template-dispatch.mdx +2 -2
  509. package/docs/content/locales/hi-IN/template-plan.mdx +3 -3
  510. package/docs/content/locales/ja-JP/actions.mdx +1 -1
  511. package/docs/content/locales/ja-JP/authentication.mdx +1 -1
  512. package/docs/content/locales/ja-JP/dispatch.mdx +3 -3
  513. package/docs/content/locales/ja-JP/external-agents.mdx +23 -19
  514. package/docs/content/locales/ja-JP/mcp-clients.mdx +34 -3
  515. package/docs/content/locales/ja-JP/mcp-protocol.mdx +29 -15
  516. package/docs/content/locales/ja-JP/plan-plugin.mdx +3 -3
  517. package/docs/content/locales/ja-JP/server.mdx +2 -2
  518. package/docs/content/locales/ja-JP/skills-guide.mdx +1 -1
  519. package/docs/content/locales/ja-JP/template-assets.mdx +1 -1
  520. package/docs/content/locales/ja-JP/template-dispatch.mdx +2 -2
  521. package/docs/content/locales/ja-JP/template-plan.mdx +3 -3
  522. package/docs/content/locales/ko-KR/actions.mdx +1 -1
  523. package/docs/content/locales/ko-KR/authentication.mdx +1 -1
  524. package/docs/content/locales/ko-KR/dispatch.mdx +3 -3
  525. package/docs/content/locales/ko-KR/external-agents.mdx +30 -19
  526. package/docs/content/locales/ko-KR/mcp-clients.mdx +33 -3
  527. package/docs/content/locales/ko-KR/mcp-protocol.mdx +36 -15
  528. package/docs/content/locales/ko-KR/plan-plugin.mdx +3 -3
  529. package/docs/content/locales/ko-KR/server.mdx +2 -2
  530. package/docs/content/locales/ko-KR/skills-guide.mdx +1 -1
  531. package/docs/content/locales/ko-KR/template-assets.mdx +1 -1
  532. package/docs/content/locales/ko-KR/template-dispatch.mdx +2 -2
  533. package/docs/content/locales/ko-KR/template-plan.mdx +3 -3
  534. package/docs/content/locales/pt-BR/actions.mdx +1 -1
  535. package/docs/content/locales/pt-BR/authentication.mdx +1 -1
  536. package/docs/content/locales/pt-BR/dispatch.mdx +3 -3
  537. package/docs/content/locales/pt-BR/external-agents.mdx +32 -19
  538. package/docs/content/locales/pt-BR/mcp-clients.mdx +34 -3
  539. package/docs/content/locales/pt-BR/mcp-protocol.mdx +32 -15
  540. package/docs/content/locales/pt-BR/plan-plugin.mdx +3 -3
  541. package/docs/content/locales/pt-BR/server.mdx +2 -2
  542. package/docs/content/locales/pt-BR/skills-guide.mdx +1 -1
  543. package/docs/content/locales/pt-BR/template-assets.mdx +1 -1
  544. package/docs/content/locales/pt-BR/template-dispatch.mdx +2 -2
  545. package/docs/content/locales/pt-BR/template-plan.mdx +3 -3
  546. package/docs/content/locales/zh-CN/actions.mdx +1 -1
  547. package/docs/content/locales/zh-CN/authentication.mdx +1 -1
  548. package/docs/content/locales/zh-CN/dispatch.mdx +3 -3
  549. package/docs/content/locales/zh-CN/external-agents.mdx +23 -19
  550. package/docs/content/locales/zh-CN/mcp-clients.mdx +28 -3
  551. package/docs/content/locales/zh-CN/mcp-protocol.mdx +29 -15
  552. package/docs/content/locales/zh-CN/plan-plugin.mdx +3 -3
  553. package/docs/content/locales/zh-CN/server.mdx +2 -2
  554. package/docs/content/locales/zh-CN/skills-guide.mdx +1 -1
  555. package/docs/content/locales/zh-CN/template-assets.mdx +1 -1
  556. package/docs/content/locales/zh-CN/template-dispatch.mdx +2 -2
  557. package/docs/content/locales/zh-CN/template-plan.mdx +3 -3
  558. package/docs/content/locales/zh-TW/actions.mdx +1 -1
  559. package/docs/content/locales/zh-TW/authentication.mdx +1 -1
  560. package/docs/content/locales/zh-TW/dispatch.mdx +3 -3
  561. package/docs/content/locales/zh-TW/external-agents.mdx +23 -19
  562. package/docs/content/locales/zh-TW/mcp-clients.mdx +28 -3
  563. package/docs/content/locales/zh-TW/mcp-protocol.mdx +30 -15
  564. package/docs/content/locales/zh-TW/plan-plugin.mdx +3 -3
  565. package/docs/content/locales/zh-TW/server.mdx +2 -2
  566. package/docs/content/locales/zh-TW/skills-guide.mdx +1 -1
  567. package/docs/content/locales/zh-TW/template-assets.mdx +1 -1
  568. package/docs/content/locales/zh-TW/template-dispatch.mdx +2 -2
  569. package/docs/content/locales/zh-TW/template-plan.mdx +3 -3
  570. package/docs/content/mcp-clients.mdx +31 -4
  571. package/docs/content/mcp-protocol.mdx +35 -15
  572. package/docs/content/plan-plugin.mdx +3 -3
  573. package/docs/content/server.mdx +2 -2
  574. package/docs/content/skills-guide.mdx +1 -1
  575. package/docs/content/template-assets.mdx +1 -1
  576. package/docs/content/template-dispatch.mdx +2 -2
  577. package/docs/content/template-plan.mdx +3 -3
  578. package/package.json +2 -2
  579. package/src/templates/default/.agents/skills/security/SKILL.md +10 -0
  580. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +15 -6
  581. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +16 -10
  582. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +20 -1
  583. 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
- 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.
@@ -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
- <a
1583
- href={replayHref}
1583
+ <Link
1584
+ to={replayHref}
1584
1585
  className="text-xs font-medium text-primary hover:underline"
1585
1586
  >
1586
1587
  {t("sessions.watchReplay")}
1587
- </a>
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
- /* 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. 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] = getParam(startKey) || resolveDefault(f.default, f.type);
83
- out[endKey] = getParam(endKey) || daysAgo(0);
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] = getParam(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] = v || resolveDefault(f.default, f.type);
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="truncate text-lg font-semibold text-foreground">
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
- width: playerWidth,
982
- height: playerHeight,
983
- transform: `translate(-50%, -50%) scale(${fitScale})`,
984
- transformOrigin: "center center",
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
- // 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"
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, useNavigate, useSearchParams } from "react-router";
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
- <button
391
+ <Link
393
392
  key={recording.id}
394
- type="button"
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
- </button>
447
+ </Link>
450
448
  );
451
449
  })}
452
450
  </div>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-13
4
+ ---
5
+
6
+ All-time dashboard filters no longer send invalid dates to BigQuery
@@ -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
+ Error issue titles wrap instead of overflowing
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-13
4
+ ---
5
+
6
+ Saving a new dashboard view no longer fails with a server error
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-13
4
+ ---
5
+
6
+ Session replay cursors stay hidden until their first recorded position