@agent-native/core 0.80.8 → 0.80.9

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 (281) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +6 -0
  4. package/corpus/core/docs/content/locales/de-DE/template-design.mdx +8 -0
  5. package/corpus/core/docs/content/locales/es-ES/template-design.mdx +10 -2
  6. package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +10 -2
  7. package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +7 -0
  8. package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +7 -0
  9. package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +7 -0
  10. package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +9 -2
  11. package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +6 -0
  12. package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +6 -0
  13. package/corpus/core/docs/content/template-design.mdx +9 -2
  14. package/corpus/core/package.json +1 -1
  15. package/corpus/core/src/cli/mcp.ts +10 -0
  16. package/corpus/core/src/cli/skills.ts +58 -12
  17. package/corpus/core/src/client/error-format.ts +25 -0
  18. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +13 -11
  19. package/corpus/core/src/client/guided-questions.tsx +32 -4
  20. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +33 -1
  21. package/corpus/core/src/client/resources/BuiltinCapabilityDetail.tsx +8 -0
  22. package/corpus/core/src/client/resources/use-builtin-capabilities.ts +4 -2
  23. package/corpus/core/src/client/session-replay.ts +34 -0
  24. package/corpus/core/src/client/sharing/ShareButton.tsx +106 -21
  25. package/corpus/core/src/coding-tools/index.ts +1 -1
  26. package/corpus/core/src/mcp/index.ts +2 -0
  27. package/corpus/core/src/mcp/screen-memory-stdio.ts +290 -0
  28. package/corpus/core/src/mcp-client/builtin-capabilities.ts +13 -1
  29. package/corpus/core/src/mcp-client/index.ts +9 -0
  30. package/corpus/core/src/mcp-client/screen-memory-local.ts +461 -0
  31. package/corpus/core/src/onboarding/types.ts +7 -0
  32. package/corpus/core/src/server/agent-chat-plugin.ts +25 -0
  33. package/corpus/core/src/server/agents-bundle.ts +35 -7
  34. package/corpus/core/src/styles/agent-native.css +5 -0
  35. package/corpus/core/src/templates/default/app/global.css +35 -35
  36. package/corpus/templates/analytics/AGENTS.md +6 -0
  37. package/corpus/templates/analytics/actions/github-repo-files.ts +9 -0
  38. package/corpus/templates/analytics/app/components/layout/Layout.tsx +4 -4
  39. package/corpus/templates/analytics/app/global.css +144 -40
  40. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +1 -1
  41. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +1 -1
  42. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +1 -1
  43. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +4 -4
  44. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -9
  45. package/corpus/templates/analytics/changelog/2026-06-29-agents-can-search-and-read-connected-github-repositories-whe.md +6 -0
  46. package/corpus/templates/analytics/changelog/2026-06-29-sessions-and-explorer-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
  47. package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -1
  48. package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +1 -1
  49. package/corpus/templates/assets/app/global.css +99 -35
  50. package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -2
  51. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +4 -4
  52. package/corpus/templates/assets/app/routes/library.tsx +4 -4
  53. package/corpus/templates/assets/changelog/2026-06-29-asset-library-and-detail-layouts-adapt-when-the-agent-sidebar.md +6 -0
  54. package/corpus/templates/brain/app/components/layout/Layout.tsx +1 -1
  55. package/corpus/templates/brain/app/global.css +63 -35
  56. package/corpus/templates/brain/app/routes/search.tsx +1 -1
  57. package/corpus/templates/brain/app/routes/settings.tsx +1 -1
  58. package/corpus/templates/brain/app/routes/sources.tsx +2 -2
  59. package/corpus/templates/brain/changelog/2026-06-29-search-settings-and-source-layouts-adapt-when-the-agent-sidebar.md +6 -0
  60. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +4 -4
  61. package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +3 -2
  62. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +4 -2
  63. package/corpus/templates/calendar/app/global.css +69 -35
  64. package/corpus/templates/calendar/changelog/2026-06-29-event-and-find-time-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
  65. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  66. package/corpus/templates/chat/app/global.css +35 -35
  67. package/corpus/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  68. package/corpus/templates/clips/AGENTS.md +13 -0
  69. package/corpus/templates/clips/actions/get-screen-memory-status.ts +12 -0
  70. package/corpus/templates/clips/actions/query-screen-memory-context.ts +29 -0
  71. package/corpus/templates/clips/actions/view-screen.ts +2 -2
  72. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  73. package/corpus/templates/clips/app/global.css +47 -35
  74. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +3 -3
  75. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +45 -18
  76. package/corpus/templates/clips/changelog/2026-06-29-meeting-detail-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-06-29-screen-memory-keeps-a-local-rolling-screen-buffer-for-agent-context.md +5 -0
  78. package/corpus/templates/clips/changelog/2026-06-29-video-chat-is-easier-to-find-on-recording-pages-and-s3-setup.md +6 -0
  79. package/corpus/templates/clips/chrome-extension/src/styles.css +39 -39
  80. package/corpus/templates/clips/desktop/src/app.tsx +290 -1
  81. package/corpus/templates/clips/desktop/src/shared/config.ts +83 -0
  82. package/corpus/templates/clips/desktop/src/styles.css +67 -52
  83. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +50 -0
  84. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +17 -0
  85. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +13 -13
  86. package/corpus/templates/clips/desktop/src-tauri/src/screen_memory.rs +990 -0
  87. package/corpus/templates/clips/server/plugins/onboarding.ts +2 -0
  88. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +3 -3
  89. package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
  90. package/corpus/templates/content/app/global.css +29 -15
  91. package/corpus/templates/content/changelog/2026-06-29-database-gallery-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  92. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +25 -20
  93. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  94. package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +8 -0
  95. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +13 -0
  96. package/corpus/templates/design/AGENTS.md +20 -12
  97. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1054 -0
  98. package/corpus/templates/design/actions/apply-visual-edit.ts +24 -4
  99. package/corpus/templates/design/actions/export-coding-handoff.ts +12 -4
  100. package/corpus/templates/design/actions/generate-design.ts +6 -21
  101. package/corpus/templates/design/actions/generate-screens.ts +43 -2
  102. package/corpus/templates/design/actions/get-design.ts +1 -0
  103. package/corpus/templates/design/actions/present-design-variants.ts +355 -30
  104. package/corpus/templates/design/actions/view-screen.ts +75 -31
  105. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +329 -69
  106. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +1 -1
  107. package/corpus/templates/design/app/components/design/EditPanel.tsx +479 -77
  108. package/corpus/templates/design/app/components/design/LayersPanel.tsx +380 -216
  109. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1050 -196
  110. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +83 -206
  111. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +1 -1
  112. package/corpus/templates/design/app/components/design/index.ts +0 -1
  113. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +225 -133
  114. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +122 -11
  115. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +24 -5
  116. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -1
  117. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +37 -12
  118. package/corpus/templates/design/app/components/design/inspector/index.ts +1 -0
  119. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +12 -5
  120. package/corpus/templates/design/app/components/design/types.ts +9 -0
  121. package/corpus/templates/design/app/components/layout/Layout.tsx +23 -5
  122. package/corpus/templates/design/app/global.css +77 -49
  123. package/corpus/templates/design/app/hooks/use-question-flow.ts +2 -2
  124. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +8 -1
  125. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  126. package/corpus/templates/design/app/i18n-data.ts +45 -3
  127. package/corpus/templates/design/app/pages/DesignEditor.tsx +2602 -657
  128. package/corpus/templates/design/app/root.tsx +1 -1
  129. package/corpus/templates/design/changelog/2026-06-29-containers-no-longer-block-selecting-nested-elements-and-nor.md +6 -0
  130. package/corpus/templates/design/changelog/2026-06-29-design-agents-now-generate-and-refine-variants-from-stronger.md +6 -0
  131. package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +6 -0
  132. package/corpus/templates/design/changelog/2026-06-29-design-questions-now-appear-as-a-cleaner-canvas-intake-with-.md +6 -0
  133. package/corpus/templates/design/changelog/2026-06-29-design-variant-directions-now-appear-as-board-screens-with-chat-buttons.md +5 -0
  134. package/corpus/templates/design/changelog/2026-06-29-element-selection-no-longer-snaps-back-to-the-previous-layer.md +6 -0
  135. package/corpus/templates/design/changelog/2026-06-29-frame-resize-measurements-now-stay-beside-the-cursor-while-d.md +6 -0
  136. package/corpus/templates/design/changelog/2026-06-29-inspector-number-fields-have-cleaner-tooltips-and-draggable-.md +6 -0
  137. package/corpus/templates/design/changelog/2026-06-29-layer-locking-layer-nesting-generated-question-intake-and-im.md +6 -0
  138. package/corpus/templates/design/changelog/2026-06-29-layer-names-in-the-sidebar-can-scroll-horizontally-instead-o.md +6 -0
  139. package/corpus/templates/design/changelog/2026-06-29-layer-nesting-in-the-sidebar-now-uses-tighter-spacing-so-nam.md +6 -0
  140. package/corpus/templates/design/changelog/2026-06-29-layers-no-longer-repeat-document-wrapper-rows-when-a-screen-.md +6 -0
  141. package/corpus/templates/design/changelog/2026-06-29-overview-previews-now-keep-element-hover-and-selection-tied-.md +6 -0
  142. package/corpus/templates/design/changelog/2026-06-29-pressing-escape-now-cancels-a-stuck-screen-drag-in-the-overv.md +6 -0
  143. package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +6 -0
  144. package/corpus/templates/design/changelog/2026-06-29-screen-overview-only-highlights-screens-when-the-frame-or-ti.md +6 -0
  145. package/corpus/templates/design/changelog/2026-06-29-screen-overview-previews-now-resize-to-match-the-selected-de.md +6 -0
  146. package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-now-uses-a-pointer-cursor-instead-.md +6 -0
  147. package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-outlines-now-stay-locked-to-the-se.md +6 -0
  148. package/corpus/templates/design/changelog/2026-06-29-screen-overview-zoom-now-reports-real-screen-scale-separatel.md +6 -0
  149. package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-feels-smoother-and-selection-outline.md +6 -0
  150. package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-now-stays-on-the-overview-canvas-ins.md +6 -0
  151. package/corpus/templates/design/changelog/2026-06-29-selecting-a-nested-layer-from-all-screens-now-keeps-you-in-a.md +6 -0
  152. package/corpus/templates/design/changelog/2026-06-29-share-now-groups-link-sharing-exports-and-agent-handoff.md +6 -0
  153. package/corpus/templates/design/changelog/2026-06-29-the-design-editor-loading-skeleton-now-uses-a-softer-charcoa.md +6 -0
  154. package/corpus/templates/design/changelog/2026-06-29-the-device-preview-menu-now-sits-next-to-the-preview-button-.md +6 -0
  155. package/corpus/templates/design/changelog/2026-06-29-the-inspector-stays-read-only-while-an-empty-design-is-still.md +6 -0
  156. package/corpus/templates/design/changelog/2026-06-29-the-missing-design-view-now-matches-the-rest-of-the-editor-c.md +6 -0
  157. package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-icon-and-tool-option-menus-better-match-the-edi.md +6 -0
  158. package/corpus/templates/design/changelog/2026-06-29-typography-controls-now-keep-the-font-name-visible-and-move-.md +6 -0
  159. package/corpus/templates/design/e2e/README.md +3 -3
  160. package/corpus/templates/design/e2e/global-setup.ts +11 -22
  161. package/corpus/templates/design/e2e/helpers.ts +122 -11
  162. package/corpus/templates/design/playwright.config.ts +9 -3
  163. package/corpus/templates/design/server/lib/coding-handoff.ts +126 -2
  164. package/corpus/templates/design/server/plugins/core-routes.ts +1 -2
  165. package/corpus/templates/design/server/routes/api/design-handoff/[id].zip.get.ts +86 -0
  166. package/corpus/templates/design/shared/code-layer.ts +125 -22
  167. package/corpus/templates/design/shared/generation-session.ts +41 -0
  168. package/corpus/templates/dispatch/app/global.css +79 -35
  169. package/corpus/templates/dispatch/app/routes/integrations.tsx +8 -7
  170. package/corpus/templates/dispatch/changelog/2026-06-29-integration-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  171. package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -2
  172. package/corpus/templates/forms/app/global.css +64 -35
  173. package/corpus/templates/forms/app/pages/FormsListPage.tsx +2 -2
  174. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +3 -3
  175. package/corpus/templates/forms/changelog/2026-06-29-form-list-and-insight-layouts-adapt-when-the-agent-sidebar.md +6 -0
  176. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -1
  177. package/corpus/templates/macros/app/global.css +25 -9
  178. package/corpus/templates/macros/changelog/2026-06-29-macro-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  179. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +6 -2
  180. package/corpus/templates/mail/app/global.css +42 -36
  181. package/corpus/templates/mail/app/pages/InboxPage.tsx +1 -1
  182. package/corpus/templates/mail/changelog/2026-06-29-the-contact-panel-now-adapts-to-the-available-mail-pane-width.md +6 -0
  183. package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -1
  184. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +6 -7
  185. package/corpus/templates/plan/app/global.css +74 -42
  186. package/corpus/templates/plan/changelog/2026-06-29-plan-document-blocks-adapt-to-the-available-document-width.md +6 -0
  187. package/corpus/templates/plan/changelog/2026-06-29-plan-titles-and-summaries-can-be-edited-inline-without-focus.md +6 -0
  188. package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -1
  189. package/corpus/templates/slides/app/global.css +49 -33
  190. package/corpus/templates/slides/changelog/2026-06-29-slide-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  191. package/corpus/templates/videos/app/components/layout/Layout.tsx +3 -1
  192. package/corpus/templates/videos/app/global.css +35 -35
  193. package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  194. package/dist/cli/mcp.d.ts.map +1 -1
  195. package/dist/cli/mcp.js +10 -0
  196. package/dist/cli/mcp.js.map +1 -1
  197. package/dist/cli/skills.d.ts.map +1 -1
  198. package/dist/cli/skills.js +58 -12
  199. package/dist/cli/skills.js.map +1 -1
  200. package/dist/client/error-format.d.ts.map +1 -1
  201. package/dist/client/error-format.js +17 -0
  202. package/dist/client/error-format.js.map +1 -1
  203. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  204. package/dist/client/extensions/ExtensionViewer.js +3 -4
  205. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  206. package/dist/client/guided-questions.d.ts +4 -0
  207. package/dist/client/guided-questions.d.ts.map +1 -1
  208. package/dist/client/guided-questions.js +16 -7
  209. package/dist/client/guided-questions.js.map +1 -1
  210. package/dist/client/onboarding/OnboardingPanel.js +26 -1
  211. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  212. package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -1
  213. package/dist/client/resources/BuiltinCapabilityDetail.js +1 -1
  214. package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -1
  215. package/dist/client/resources/use-builtin-capabilities.d.ts +1 -1
  216. package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -1
  217. package/dist/client/resources/use-builtin-capabilities.js +2 -1
  218. package/dist/client/resources/use-builtin-capabilities.js.map +1 -1
  219. package/dist/client/session-replay.d.ts.map +1 -1
  220. package/dist/client/session-replay.js +31 -0
  221. package/dist/client/session-replay.js.map +1 -1
  222. package/dist/client/sharing/ShareButton.d.ts +14 -0
  223. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  224. package/dist/client/sharing/ShareButton.js +36 -7
  225. package/dist/client/sharing/ShareButton.js.map +1 -1
  226. package/dist/coding-tools/index.js +1 -1
  227. package/dist/coding-tools/index.js.map +1 -1
  228. package/dist/collab/routes.d.ts +1 -1
  229. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  230. package/dist/mcp/index.d.ts +2 -0
  231. package/dist/mcp/index.d.ts.map +1 -1
  232. package/dist/mcp/index.js +1 -0
  233. package/dist/mcp/index.js.map +1 -1
  234. package/dist/mcp/screen-memory-stdio.d.ts +6 -0
  235. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -0
  236. package/dist/mcp/screen-memory-stdio.js +213 -0
  237. package/dist/mcp/screen-memory-stdio.js.map +1 -0
  238. package/dist/mcp-client/builtin-capabilities.d.ts +1 -1
  239. package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -1
  240. package/dist/mcp-client/builtin-capabilities.js +10 -0
  241. package/dist/mcp-client/builtin-capabilities.js.map +1 -1
  242. package/dist/mcp-client/index.d.ts +1 -0
  243. package/dist/mcp-client/index.d.ts.map +1 -1
  244. package/dist/mcp-client/index.js +1 -0
  245. package/dist/mcp-client/index.js.map +1 -1
  246. package/dist/mcp-client/screen-memory-local.d.ts +61 -0
  247. package/dist/mcp-client/screen-memory-local.d.ts.map +1 -0
  248. package/dist/mcp-client/screen-memory-local.js +336 -0
  249. package/dist/mcp-client/screen-memory-local.js.map +1 -0
  250. package/dist/notifications/routes.d.ts +2 -2
  251. package/dist/observability/routes.d.ts +8 -8
  252. package/dist/onboarding/types.d.ts +7 -0
  253. package/dist/onboarding/types.d.ts.map +1 -1
  254. package/dist/onboarding/types.js.map +1 -1
  255. package/dist/resources/handlers.d.ts +2 -2
  256. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  257. package/dist/server/agent-chat-plugin.js +26 -0
  258. package/dist/server/agent-chat-plugin.js.map +1 -1
  259. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  260. package/dist/server/agents-bundle.d.ts.map +1 -1
  261. package/dist/server/agents-bundle.js +22 -7
  262. package/dist/server/agents-bundle.js.map +1 -1
  263. package/dist/server/transcribe-voice.d.ts +1 -1
  264. package/dist/styles/agent-native.css +5 -0
  265. package/dist/templates/default/app/global.css +35 -35
  266. package/docs/content/locales/ar-SA/template-design.mdx +6 -0
  267. package/docs/content/locales/de-DE/template-design.mdx +8 -0
  268. package/docs/content/locales/es-ES/template-design.mdx +10 -2
  269. package/docs/content/locales/fr-FR/template-design.mdx +10 -2
  270. package/docs/content/locales/hi-IN/template-design.mdx +7 -0
  271. package/docs/content/locales/ja-JP/template-design.mdx +7 -0
  272. package/docs/content/locales/ko-KR/template-design.mdx +7 -0
  273. package/docs/content/locales/pt-BR/template-design.mdx +9 -2
  274. package/docs/content/locales/zh-CN/template-design.mdx +6 -0
  275. package/docs/content/locales/zh-TW/template-design.mdx +6 -0
  276. package/docs/content/template-design.mdx +9 -2
  277. package/package.json +1 -1
  278. package/src/templates/default/app/global.css +35 -35
  279. package/corpus/templates/design/app/components/design/VariantGrid.tsx +0 -189
  280. package/corpus/templates/design/app/components/design/VariantHandoffCard.tsx +0 -115
  281. package/corpus/templates/design/app/hooks/use-variant-flow.ts +0 -342
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsSessionId,\n getAnalyticsAnonymousId,\n scrubUrl,\n} from \"./analytics.js\";\n\ntype ReplayEvent = Record<string, unknown>;\ntype QueuedReplayEvent = {\n json: string;\n timestampMs: number;\n};\ntype ReplayStopFn = () => void;\nexport type SessionReplayUrlMatcher =\n | string\n | RegExp\n | ((url: string) => boolean);\n\ninterface RrwebRecordOptions {\n emit: (event: ReplayEvent) => void;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockClass?: string | RegExp;\n blockSelector?: string;\n ignoreClass?: string | RegExp;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n sampling?: Record<string, unknown>;\n}\n\ninterface RrwebRecordModule {\n record: (options: RrwebRecordOptions) => ReplayStopFn | undefined;\n}\n\ninterface SessionReplayState {\n active: boolean;\n startPromise: Promise<SessionReplayStartResult> | null;\n replayId: string | null;\n startedAtMs: number | null;\n sequence: number;\n /** Pre-serialized + scrubbed event JSON strings, ready to splice at flush. */\n queue: QueuedReplayEvent[];\n queuedBytes: number;\n flushTimer: number | null;\n maxDurationTimer: number | null;\n flushing: boolean;\n stopRecorder: ReplayStopFn | null;\n restoreUrlMonitor: (() => void) | null;\n removeLifecycleListeners: (() => void) | null;\n options: NormalizedSessionReplayOptions | null;\n lastAuthenticatedProperties: Record<string, unknown> | null;\n}\n\ninterface StoredReplaySession {\n sessionId?: string;\n replayId?: string;\n startedAtMs?: number;\n sequence?: number;\n}\n\n/** rrweb `sampling` shape (mousemove/scroll/media throttles, input strategy). */\nexport type ReplayEventSampling = Record<string, unknown>;\n\nexport interface SessionReplayOptions {\n enabled?: boolean;\n publicKey?: string;\n endpoint?: string;\n requireSignedInUser?: boolean;\n sampleRate?: number;\n samplingSalt?: string;\n allowUrls?: SessionReplayUrlMatcher[];\n blockUrls?: SessionReplayUrlMatcher[];\n flushIntervalMs?: number;\n maxDurationMs?: number;\n maxEventsPerBatch?: number;\n maxBatchBytes?: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector?: string;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n /**\n * rrweb per-event throttling (distinct from `sampleRate`, which decides\n * whether a whole session records). Throttles high-frequency event types\n * (mousemove/scroll/input) to keep the recorded page responsive and the\n * payloads small. Passed straight through to `rrweb.record({ sampling })`.\n */\n eventSampling?: ReplayEventSampling;\n extraProperties?:\n | Record<string, unknown>\n | (() => Record<string, unknown> | undefined);\n}\n\nexport interface SessionReplayStartResult {\n started: boolean;\n reason?:\n | \"disabled\"\n | \"not-browser\"\n | \"missing-public-key\"\n | \"missing-session-id\"\n | \"missing-user-id\"\n | \"sampled-out\"\n | \"url-blocked\"\n | \"already-active\"\n | \"import-failed\"\n | \"record-failed\";\n replayId?: string;\n sessionId?: string;\n sampled?: boolean;\n}\n\ninterface NormalizedSessionReplayOptions {\n publicKey: string;\n endpoint: string;\n requireSignedInUser: boolean;\n sampleRate: number;\n samplingSalt: string;\n allowUrls: SessionReplayUrlMatcher[];\n blockUrls: SessionReplayUrlMatcher[];\n flushIntervalMs: number;\n maxDurationMs: number;\n maxEventsPerBatch: number;\n maxBatchBytes: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n recordCanvas: boolean;\n recordCrossOriginIframes: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n eventSampling: ReplayEventSampling;\n extraProperties?: SessionReplayOptions[\"extraProperties\"];\n}\n\nconst DEFAULT_REPLAY_PATH = \"/api/analytics/replay\";\nconst DEFAULT_SAMPLING_SALT = \"agent-native-session-replay\";\n\n/**\n * Default rrweb event throttling. Without this, rrweb captures every\n * mousemove/scroll which dominates event volume and main-thread cost on\n * interactive pages. These caps keep replays faithful while staying light.\n */\nconst DEFAULT_EVENT_SAMPLING: ReplayEventSampling = {\n mousemove: 50,\n mouseInteraction: true,\n scroll: 100,\n media: 800,\n input: \"last\",\n};\nconst SESSION_REPLAY_STATE_KEY = Symbol.for(\n \"agent-native.client.sessionReplay\",\n);\nconst SESSION_REPLAY_ID_STORAGE_KEY = \"agent-native.session_replay_id\";\nconst DEFAULT_BLOCK_SELECTOR = [\n \"[data-sensitive]\",\n \"[data-an-block]\",\n \"[data-an-private]\",\n \"[data-private]\",\n \".an-block\",\n \".an-replay-block\",\n \".an-private\",\n \".rr-block\",\n \"[autocomplete='cc-number']\",\n \"[autocomplete='cc-csc']\",\n \"[autocomplete='cc-exp']\",\n \"[name*='password' i]\",\n \"[name*='credit' i]\",\n \"[name*='card' i]\",\n \"[name*='ssn' i]\",\n].join(\", \");\nconst DEFAULT_IGNORE_SELECTOR = \".an-ignore, [data-an-ignore]\";\nconst DEFAULT_MASK_TEXT_CLASS = \"an-mask\";\nconst DEFAULT_MASK_TEXT_SELECTOR = \"[data-an-mask]\";\nconst DEFAULT_FLUSH_INTERVAL_MS = 5000;\nconst DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_EVENTS_PER_BATCH = 50;\nconst DEFAULT_MAX_BATCH_BYTES = 256 * 1024;\nconst URL_LIKE_KEYS = new Set([\n \"url\",\n \"uri\",\n \"href\",\n \"src\",\n \"currentUrl\",\n \"referrer\",\n \"from\",\n \"to\",\n]);\n\nfunction getState(): SessionReplayState {\n const g = globalThis as typeof globalThis & {\n [SESSION_REPLAY_STATE_KEY]?: SessionReplayState;\n };\n if (!g[SESSION_REPLAY_STATE_KEY]) {\n g[SESSION_REPLAY_STATE_KEY] = {\n active: false,\n startPromise: null,\n replayId: null,\n startedAtMs: null,\n sequence: 0,\n queue: [],\n queuedBytes: 0,\n flushTimer: null,\n maxDurationTimer: null,\n flushing: false,\n stopRecorder: null,\n restoreUrlMonitor: null,\n removeLifecycleListeners: null,\n options: null,\n lastAuthenticatedProperties: null,\n };\n }\n return g[SESSION_REPLAY_STATE_KEY]!;\n}\n\nfunction safeStorageGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeStorageSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // private browsing / storage disabled -- replay still works for this page\n }\n}\n\nfunction generateReplayId(): string {\n try {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n } catch {\n // fall through\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readStoredReplaySession(): StoredReplaySession | null {\n const raw = safeStorageGet(SESSION_REPLAY_ID_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredReplaySession;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredReplaySession(value: StoredReplaySession): void {\n safeStorageSet(SESSION_REPLAY_ID_STORAGE_KEY, JSON.stringify(value));\n}\n\nfunction getOrCreateReplaySession(sessionId: string): {\n replayId: string;\n startedAtMs: number;\n sequence: number;\n} {\n const parsed = readStoredReplaySession();\n if (parsed?.sessionId === sessionId && parsed.replayId) {\n const startedAtMs =\n typeof parsed.startedAtMs === \"number\" &&\n Number.isFinite(parsed.startedAtMs) &&\n parsed.startedAtMs > 0\n ? parsed.startedAtMs\n : Date.now();\n const sequence =\n typeof parsed.sequence === \"number\" &&\n Number.isFinite(parsed.sequence) &&\n parsed.sequence >= 0\n ? Math.floor(parsed.sequence)\n : 0;\n return { replayId: parsed.replayId, startedAtMs, sequence };\n }\n const replayId = generateReplayId();\n const startedAtMs = Date.now();\n writeStoredReplaySession({ sessionId, replayId, startedAtMs, sequence: 0 });\n return { replayId, startedAtMs, sequence: 0 };\n}\n\nfunction persistReplaySequence(\n sessionId: string,\n replayId: string,\n startedAtMs: number | null,\n sequence: number,\n): void {\n writeStoredReplaySession({\n sessionId,\n replayId,\n startedAtMs: startedAtMs ?? Date.now(),\n sequence,\n });\n}\n\nfunction clampSamplingRate(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction readEnvString(key: string): string | undefined {\n return (import.meta.env as Record<string, string | undefined>)?.[key]?.trim();\n}\n\nfunction readEnvNumber(key: string): number | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readEnvBoolean(key: string): boolean | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n if (/^(1|true|yes|on)$/i.test(raw)) return true;\n if (/^(0|false|no|off)$/i.test(raw)) return false;\n return undefined;\n}\n\nfunction readFirstEnvString(keys: string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvString(key);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction readFirstEnvNumber(keys: string[]): number | undefined {\n for (const key of keys) {\n const value = readEnvNumber(key);\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction replayEndpointFromAnalyticsEndpoint(value: string): string | null {\n try {\n const url = new URL(value);\n if (url.pathname.endsWith(\"/api/analytics/track\")) {\n url.pathname = url.pathname.replace(\n /\\/api\\/analytics\\/track$/,\n \"/api/analytics/replay\",\n );\n return url.toString();\n }\n if (url.pathname.endsWith(\"/track\")) {\n url.pathname = url.pathname.replace(/\\/track$/, \"/api/analytics/replay\");\n return url.toString();\n }\n } catch {\n // Fall through to the relative path cases below.\n }\n if (value.endsWith(\"/api/analytics/track\")) {\n return value.replace(/\\/api\\/analytics\\/track$/, \"/api/analytics/replay\");\n }\n if (value.endsWith(\"/track\")) {\n return value.replace(/\\/track$/, \"/api/analytics/replay\");\n }\n return null;\n}\n\nfunction defaultReplayEndpoint(): string {\n const analyticsEndpoint = readEnvString(\n \"VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT\",\n );\n const derived = analyticsEndpoint\n ? replayEndpointFromAnalyticsEndpoint(analyticsEndpoint)\n : null;\n if (derived) return derived;\n return typeof window !== \"undefined\"\n ? `${window.location.origin}${DEFAULT_REPLAY_PATH}`\n : DEFAULT_REPLAY_PATH;\n}\n\nexport function getSessionReplaySamplingScore(\n sessionId: string,\n salt = DEFAULT_SAMPLING_SALT,\n): number {\n let hash = 2166136261;\n const input = `${salt}:${sessionId}`;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 4294967296;\n}\n\nexport function shouldSampleSessionReplay(\n sessionId: string,\n sampleRate = 1,\n salt = DEFAULT_SAMPLING_SALT,\n): boolean {\n const rate = clampSamplingRate(sampleRate);\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return getSessionReplaySamplingScore(sessionId, salt) < rate;\n}\n\nfunction matcherAllows(matcher: SessionReplayUrlMatcher, url: string): boolean {\n if (typeof matcher === \"string\") return url.includes(matcher);\n if (matcher instanceof RegExp) return matcher.test(url);\n return matcher(url);\n}\n\nfunction isUrlRecordable(\n url: string,\n options: Pick<NormalizedSessionReplayOptions, \"allowUrls\" | \"blockUrls\">,\n): boolean {\n if (options.allowUrls.length > 0) {\n const allowed = options.allowUrls.some((matcher) =>\n matcherAllows(matcher, url),\n );\n if (!allowed) return false;\n }\n return !options.blockUrls.some((matcher) => matcherAllows(matcher, url));\n}\n\nfunction normalizeOptions(\n options: SessionReplayOptions,\n): NormalizedSessionReplayOptions | null {\n const publicKey =\n options.publicKey ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_PUBLIC_KEY\",\n \"VITE_SESSION_REPLAY_PUBLIC_KEY\",\n ]) ||\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return null;\n const endpoint =\n options.endpoint ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_ANALYTICS_REPLAY_ENDPOINT\",\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_ENDPOINT\",\n \"VITE_SESSION_REPLAY_INGEST_URL\",\n ]) ||\n defaultReplayEndpoint();\n return {\n publicKey,\n endpoint,\n requireSignedInUser:\n options.requireSignedInUser ??\n readEnvBoolean(\"VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n readEnvBoolean(\"VITE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n false,\n sampleRate: clampSamplingRate(\n options.sampleRate ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE\",\n \"VITE_SESSION_REPLAY_SAMPLE_RATE\",\n ]),\n ),\n samplingSalt: options.samplingSalt || DEFAULT_SAMPLING_SALT,\n allowUrls: options.allowUrls ?? [],\n blockUrls: options.blockUrls ?? [],\n flushIntervalMs: Math.max(\n 250,\n options.flushIntervalMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n \"VITE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n ]) ??\n DEFAULT_FLUSH_INTERVAL_MS,\n ),\n maxDurationMs: Math.max(\n 1000,\n options.maxDurationMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_MAX_DURATION_MS\",\n \"VITE_SESSION_REPLAY_MAX_DURATION_MS\",\n ]) ??\n DEFAULT_MAX_DURATION_MS,\n ),\n maxEventsPerBatch: Math.max(\n 1,\n options.maxEventsPerBatch ?? DEFAULT_MAX_EVENTS_PER_BATCH,\n ),\n maxBatchBytes: Math.max(\n 1024,\n options.maxBatchBytes ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n \"VITE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n ]) ??\n DEFAULT_MAX_BATCH_BYTES,\n ),\n checkoutEveryNth: options.checkoutEveryNth,\n checkoutEveryNms: options.checkoutEveryNms,\n blockSelector: options.blockSelector || DEFAULT_BLOCK_SELECTOR,\n ignoreSelector: options.ignoreSelector || DEFAULT_IGNORE_SELECTOR,\n maskTextClass: options.maskTextClass || DEFAULT_MASK_TEXT_CLASS,\n maskTextSelector: options.maskTextSelector || DEFAULT_MASK_TEXT_SELECTOR,\n maskAllInputs: options.maskAllInputs ?? true,\n recordCanvas: options.recordCanvas ?? false,\n recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,\n collectFonts: options.collectFonts ?? false,\n inlineImages: options.inlineImages ?? false,\n eventSampling: options.eventSampling ?? DEFAULT_EVENT_SAMPLING,\n extraProperties: options.extraProperties,\n };\n}\n\nfunction scrubStringValue(key: string, value: string): string {\n const lowerKey = key.toLowerCase();\n const isUrlKey = URL_LIKE_KEYS.has(key) || URL_LIKE_KEYS.has(lowerKey);\n if (\n isUrlKey ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"/\")\n ) {\n return scrubUrl(value) ?? value;\n }\n return value;\n}\n\nfunction scrubReplayValue(\n value: unknown,\n key = \"\",\n depth = 0,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === \"string\") return scrubStringValue(key, value);\n if (!value || typeof value !== \"object\") return value;\n if (depth > 12) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => scrubReplayValue(item, key, depth + 1, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = scrubReplayValue(childValue, childKey, depth + 1, seen);\n }\n return out;\n}\n\n/**\n * JSON.stringify replacer that scrubs URL-like string values inline. Folding\n * the scrub into the single serialization pass avoids a separate deep-clone of\n * every emitted event (FullSnapshots are large DOM trees) on the hot path.\n */\nfunction scrubReplayReplacer(key: string, value: unknown): unknown {\n return typeof value === \"string\" ? scrubStringValue(key, value) : value;\n}\n\n/**\n * Serialize + scrub one event in a single pass. The resulting string is stored\n * directly on the queue and reused verbatim at flush, so each event is\n * stringified exactly once (was: deep-clone + size-stringify + flush-stringify).\n */\nfunction serializeReplayEvent(event: ReplayEvent): string {\n try {\n return JSON.stringify(event, scrubReplayReplacer);\n } catch {\n return \"\";\n }\n}\n\nfunction replayEventTimestampMs(event: ReplayEvent): number {\n const timestamp = event.timestamp;\n if (typeof timestamp === \"number\" && Number.isFinite(timestamp)) {\n return timestamp;\n }\n if (typeof timestamp === \"string\" && timestamp.trim()) {\n const parsed = Date.parse(timestamp);\n if (Number.isFinite(parsed)) return parsed;\n }\n return Date.now();\n}\n\nfunction enqueueReplayEvent(\n state: SessionReplayState,\n event: ReplayEvent,\n): void {\n if (!state.options) return;\n const serialized = serializeReplayEvent(event);\n if (!serialized) return;\n const estimatedBytes = serialized.length;\n if (\n state.queue.length > 0 &&\n state.queuedBytes + estimatedBytes > state.options.maxBatchBytes\n ) {\n void flushSessionReplay(\"max-bytes\");\n }\n state.queue.push({\n json: serialized,\n timestampMs: replayEventTimestampMs(event),\n });\n state.queuedBytes += estimatedBytes;\n if (state.queue.length >= state.options.maxEventsPerBatch) {\n void flushSessionReplay(\"max-events\");\n }\n}\n\nfunction replayExtraProperties(\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const source = options.extraProperties;\n if (!source) return undefined;\n try {\n const props = typeof source === \"function\" ? source() : source;\n if (!props || typeof props !== \"object\") return undefined;\n return scrubReplayValue(props) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction replayString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction replayEmail(value: unknown): string | undefined {\n const raw = replayString(value);\n return raw && raw.includes(\"@\") ? raw : undefined;\n}\n\nfunction replayUserEmail(\n properties: Record<string, unknown> | undefined,\n): string | undefined {\n return (\n replayEmail(properties?.userEmail ?? properties?.user_email) ||\n replayEmail(properties?.email) ||\n replayEmail(properties?.userId ?? properties?.user_id)\n );\n}\n\nfunction replayPropertiesForUpload(\n state: SessionReplayState,\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const properties = replayExtraProperties(options);\n if (replayUserEmail(properties)) {\n state.lastAuthenticatedProperties = properties ? { ...properties } : null;\n return properties;\n }\n if (options.requireSignedInUser && state.lastAuthenticatedProperties) {\n return state.lastAuthenticatedProperties;\n }\n return properties;\n}\n\nfunction buildReplayBody(\n state: SessionReplayState,\n reason: string,\n events: QueuedReplayEvent[],\n): string | null {\n const options = state.options;\n if (!options || !state.replayId) return null;\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return null;\n const properties = replayPropertiesForUpload(state, options);\n const userEmail = replayUserEmail(properties);\n if (options.requireSignedInUser && !userEmail) return null;\n const userId =\n userEmail || replayString(properties?.userId ?? properties?.user_id);\n const eventTimestamps = events.map((event) => event.timestampMs);\n const nowMs = Date.now();\n const startedAtMs =\n state.startedAtMs ??\n (eventTimestamps.length ? Math.min(...eventTimestamps) : nowMs);\n const endedAtMs = eventTimestamps.length\n ? Math.max(...eventTimestamps)\n : nowMs;\n const envelope = {\n publicKey: options.publicKey,\n type: \"session_replay\",\n replayId: state.replayId,\n sessionId,\n ...(userId ? { userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n anonymousId: getAnalyticsAnonymousId(),\n sequence: state.sequence,\n reason,\n status: isFinalFlushReason(reason) ? \"completed\" : \"active\",\n eventCount: events.length,\n startedAt: new Date(startedAtMs).toISOString(),\n endedAt: new Date(endedAtMs).toISOString(),\n durationMs: Math.max(0, endedAtMs - startedAtMs),\n privacyMode: \"mask-inputs-and-selected-text\",\n url:\n typeof window !== \"undefined\"\n ? scrubUrl(window.location.href)\n : undefined,\n timestamp: new Date().toISOString(),\n properties,\n };\n state.sequence += 1;\n persistReplaySequence(\n sessionId,\n state.replayId,\n state.startedAtMs,\n state.sequence,\n );\n // Events are already serialized+scrubbed JSON strings; splice them into the\n // envelope without re-serializing the (potentially large) events array.\n const envelopeJson = JSON.stringify(envelope);\n return `${envelopeJson.slice(0, -1)},\"events\":[${events\n .map((event) => event.json)\n .join(\",\")}]}`;\n}\n\ninterface ReplayUploadBody {\n body: BodyInit;\n headers: Record<string, string>;\n compressed: boolean;\n}\n\nasync function gzipReplayBody(body: string): Promise<Blob | null> {\n if (\n typeof CompressionStream === \"undefined\" ||\n typeof Blob === \"undefined\" ||\n typeof Response === \"undefined\"\n ) {\n return null;\n }\n try {\n const stream = new Blob([body], { type: \"application/json\" })\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n const compressed = await new Response(stream).arrayBuffer();\n return new Blob([compressed], { type: \"application/json\" });\n } catch {\n return null;\n }\n}\n\nasync function buildReplayUploadBody(body: string): Promise<ReplayUploadBody> {\n const compressed = await gzipReplayBody(body);\n if (compressed) {\n return {\n body: compressed,\n compressed: true,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"gzip\",\n },\n };\n }\n return {\n body,\n compressed: false,\n headers: {\n \"Content-Type\": \"text/plain;charset=UTF-8\",\n },\n };\n}\n\nasync function sendReplayUpload(\n options: NormalizedSessionReplayOptions,\n body: string,\n): Promise<void> {\n const upload = await buildReplayUploadBody(body);\n if (!upload.compressed && navigator.sendBeacon) {\n const sent = navigator.sendBeacon(options.endpoint, body);\n if (sent) return;\n }\n await fetch(options.endpoint, {\n method: \"POST\",\n body: upload.body,\n keepalive: true,\n headers: {\n ...upload.headers,\n \"X-Agent-Native-Analytics-Key\": options.publicKey,\n },\n }).catch(() => {});\n}\n\nfunction isFinalFlushReason(reason: string): boolean {\n return [\n \"auth-cleared\",\n \"manual\",\n \"pagehide\",\n \"beforeunload\",\n \"url-blocked\",\n \"max-duration\",\n ].includes(reason);\n}\n\nexport async function flushSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.options || state.queue.length === 0 || state.flushing) return;\n const events = state.queue.splice(0, state.queue.length);\n state.queuedBytes = 0;\n const body = buildReplayBody(state, reason, events);\n if (!body || !state.options) {\n state.queue = events.concat(state.queue);\n state.queuedBytes += events.reduce(\n (total, event) => total + event.json.length,\n 0,\n );\n return;\n }\n state.flushing = true;\n try {\n await sendReplayUpload(state.options, body);\n } finally {\n state.flushing = false;\n }\n}\n\nfunction installUrlMonitor(state: SessionReplayState): void {\n if (!state.options || state.restoreUrlMonitor) return;\n const options = state.options;\n const check = () => {\n if (!isUrlRecordable(window.location.href, options)) {\n stopSessionReplay(\"url-blocked\");\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.addEventListener(\"popstate\", check);\n state.restoreUrlMonitor = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", check);\n state.restoreUrlMonitor = null;\n };\n}\n\nfunction installLifecycleListeners(state: SessionReplayState): void {\n if (state.removeLifecycleListeners) return;\n const flushOnHidden = () => {\n if (document.visibilityState === \"hidden\") {\n void flushSessionReplay(\"visibility-hidden\");\n }\n };\n const flushOnUnload = () => {\n void flushSessionReplay(\"pagehide\");\n };\n document.addEventListener(\"visibilitychange\", flushOnHidden);\n window.addEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = () => {\n document.removeEventListener(\"visibilitychange\", flushOnHidden);\n window.removeEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = null;\n };\n}\n\nexport async function startSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n if (options.enabled === false) return { started: false, reason: \"disabled\" };\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return { started: false, reason: \"not-browser\" };\n }\n const normalized = normalizeOptions(options);\n if (!normalized) return { started: false, reason: \"missing-public-key\" };\n\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return { started: false, reason: \"missing-session-id\" };\n const sampled = shouldSampleSessionReplay(\n sessionId,\n normalized.sampleRate,\n normalized.samplingSalt,\n );\n if (!sampled) {\n return { started: false, reason: \"sampled-out\", sessionId, sampled };\n }\n const initialProperties = replayExtraProperties(normalized);\n if (normalized.requireSignedInUser) {\n if (!replayUserEmail(initialProperties)) {\n return {\n started: false,\n reason: \"missing-user-id\",\n sessionId,\n sampled,\n };\n }\n }\n if (!isUrlRecordable(window.location.href, normalized)) {\n return { started: false, reason: \"url-blocked\", sessionId, sampled };\n }\n\n const state = getState();\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n if (state.startPromise) return state.startPromise;\n\n let startPromise: Promise<SessionReplayStartResult>;\n startPromise = startSessionReplayRecorder(\n state,\n normalized,\n sessionId,\n sampled,\n initialProperties,\n ).finally(() => {\n if (state.startPromise === startPromise) {\n state.startPromise = null;\n }\n });\n state.startPromise = startPromise;\n return startPromise;\n}\n\nasync function startSessionReplayRecorder(\n state: SessionReplayState,\n normalized: NormalizedSessionReplayOptions,\n sessionId: string,\n sampled: boolean,\n initialProperties: Record<string, unknown> | undefined,\n): Promise<SessionReplayStartResult> {\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n\n let rrweb: RrwebRecordModule;\n try {\n rrweb = (await import(\"@rrweb/record\")) as RrwebRecordModule;\n } catch {\n return { started: false, reason: \"import-failed\", sessionId, sampled };\n }\n\n const replaySession = getOrCreateReplaySession(sessionId);\n state.options = normalized;\n state.replayId = replaySession.replayId;\n state.startedAtMs = replaySession.startedAtMs;\n state.sequence = replaySession.sequence;\n state.queue = [];\n state.queuedBytes = 0;\n state.stopRecorder = null;\n state.lastAuthenticatedProperties = replayUserEmail(initialProperties)\n ? { ...initialProperties }\n : null;\n state.active = true;\n\n try {\n const stopRecorder = rrweb.record({\n emit: (event) => enqueueReplayEvent(state, event),\n sampling: normalized.eventSampling,\n checkoutEveryNth: normalized.checkoutEveryNth,\n checkoutEveryNms: normalized.checkoutEveryNms,\n blockSelector: normalized.blockSelector,\n ignoreSelector: normalized.ignoreSelector,\n maskTextClass: normalized.maskTextClass,\n maskTextSelector: normalized.maskTextSelector,\n maskAllInputs: normalized.maskAllInputs,\n recordCanvas: normalized.recordCanvas,\n recordCrossOriginIframes: normalized.recordCrossOriginIframes,\n collectFonts: normalized.collectFonts,\n inlineImages: normalized.inlineImages,\n maskInputOptions: {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n },\n });\n if (typeof stopRecorder !== \"function\") {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n state.stopRecorder = stopRecorder;\n state.flushTimer = window.setInterval(\n () => void flushSessionReplay(\"interval\"),\n normalized.flushIntervalMs,\n );\n state.maxDurationTimer = window.setTimeout(\n () => stopSessionReplay(\"max-duration\"),\n normalized.maxDurationMs,\n );\n installUrlMonitor(state);\n installLifecycleListeners(state);\n return {\n started: true,\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n } catch {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n}\n\nexport async function stopSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.active) return;\n state.active = false;\n try {\n state.stopRecorder?.();\n } catch {\n // best-effort recorder shutdown\n }\n state.stopRecorder = null;\n if (state.flushTimer) {\n window.clearInterval(state.flushTimer);\n state.flushTimer = null;\n }\n if (state.maxDurationTimer) {\n window.clearTimeout(state.maxDurationTimer);\n state.maxDurationTimer = null;\n }\n state.restoreUrlMonitor?.();\n state.removeLifecycleListeners?.();\n await flushSessionReplay(reason);\n}\n\nexport function maybeStartSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n return startSessionReplay(options);\n}\n\nexport function isSessionReplayActive(): boolean {\n return getState().active;\n}\n"]}
1
+ {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsSessionId,\n getAnalyticsAnonymousId,\n scrubUrl,\n} from \"./analytics.js\";\n\ntype ReplayEvent = Record<string, unknown>;\ntype QueuedReplayEvent = {\n json: string;\n timestampMs: number;\n};\ntype ReplayStopFn = () => void;\nexport type SessionReplayUrlMatcher =\n | string\n | RegExp\n | ((url: string) => boolean);\n\ninterface RrwebRecordOptions {\n emit: (event: ReplayEvent) => void;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockClass?: string | RegExp;\n blockSelector?: string;\n ignoreClass?: string | RegExp;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n sampling?: Record<string, unknown>;\n}\n\ninterface RrwebRecordModule {\n record: (options: RrwebRecordOptions) => ReplayStopFn | undefined;\n}\n\ninterface SessionReplayState {\n active: boolean;\n startPromise: Promise<SessionReplayStartResult> | null;\n replayId: string | null;\n startedAtMs: number | null;\n sequence: number;\n /** Pre-serialized + scrubbed event JSON strings, ready to splice at flush. */\n queue: QueuedReplayEvent[];\n queuedBytes: number;\n flushTimer: number | null;\n maxDurationTimer: number | null;\n flushing: boolean;\n stopRecorder: ReplayStopFn | null;\n restoreUrlMonitor: (() => void) | null;\n removeLifecycleListeners: (() => void) | null;\n options: NormalizedSessionReplayOptions | null;\n lastAuthenticatedProperties: Record<string, unknown> | null;\n}\n\ninterface StoredReplaySession {\n sessionId?: string;\n replayId?: string;\n startedAtMs?: number;\n sequence?: number;\n}\n\n/** rrweb `sampling` shape (mousemove/scroll/media throttles, input strategy). */\nexport type ReplayEventSampling = Record<string, unknown>;\n\nexport interface SessionReplayOptions {\n enabled?: boolean;\n publicKey?: string;\n endpoint?: string;\n requireSignedInUser?: boolean;\n sampleRate?: number;\n samplingSalt?: string;\n allowUrls?: SessionReplayUrlMatcher[];\n blockUrls?: SessionReplayUrlMatcher[];\n flushIntervalMs?: number;\n maxDurationMs?: number;\n maxEventsPerBatch?: number;\n maxBatchBytes?: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector?: string;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n /**\n * rrweb per-event throttling (distinct from `sampleRate`, which decides\n * whether a whole session records). Throttles high-frequency event types\n * (mousemove/scroll/input) to keep the recorded page responsive and the\n * payloads small. Passed straight through to `rrweb.record({ sampling })`.\n */\n eventSampling?: ReplayEventSampling;\n extraProperties?:\n | Record<string, unknown>\n | (() => Record<string, unknown> | undefined);\n}\n\nexport interface SessionReplayStartResult {\n started: boolean;\n reason?:\n | \"disabled\"\n | \"not-browser\"\n | \"missing-public-key\"\n | \"missing-session-id\"\n | \"missing-user-id\"\n | \"sampled-out\"\n | \"url-blocked\"\n | \"already-active\"\n | \"import-failed\"\n | \"record-failed\";\n replayId?: string;\n sessionId?: string;\n sampled?: boolean;\n}\n\ninterface NormalizedSessionReplayOptions {\n publicKey: string;\n endpoint: string;\n requireSignedInUser: boolean;\n sampleRate: number;\n samplingSalt: string;\n allowUrls: SessionReplayUrlMatcher[];\n blockUrls: SessionReplayUrlMatcher[];\n flushIntervalMs: number;\n maxDurationMs: number;\n maxEventsPerBatch: number;\n maxBatchBytes: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n recordCanvas: boolean;\n recordCrossOriginIframes: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n eventSampling: ReplayEventSampling;\n extraProperties?: SessionReplayOptions[\"extraProperties\"];\n}\n\nconst DEFAULT_REPLAY_PATH = \"/api/analytics/replay\";\nconst DEFAULT_SAMPLING_SALT = \"agent-native-session-replay\";\n\n/**\n * Default rrweb event throttling. Without this, rrweb captures every\n * mousemove/scroll which dominates event volume and main-thread cost on\n * interactive pages. These caps keep replays faithful while staying light.\n */\nconst DEFAULT_EVENT_SAMPLING: ReplayEventSampling = {\n mousemove: 50,\n mouseInteraction: true,\n scroll: 100,\n media: 800,\n input: \"last\",\n};\nconst SESSION_REPLAY_STATE_KEY = Symbol.for(\n \"agent-native.client.sessionReplay\",\n);\nconst SESSION_REPLAY_ID_STORAGE_KEY = \"agent-native.session_replay_id\";\nconst DEFAULT_BLOCK_SELECTOR = [\n \"[data-sensitive]\",\n \"[data-an-block]\",\n \"[data-an-private]\",\n \"[data-private]\",\n \".an-block\",\n \".an-replay-block\",\n \".an-private\",\n \".rr-block\",\n \"[autocomplete='cc-number']\",\n \"[autocomplete='cc-csc']\",\n \"[autocomplete='cc-exp']\",\n \"[name*='password' i]\",\n \"[name*='credit' i]\",\n \"[name*='card' i]\",\n \"[name*='ssn' i]\",\n].join(\", \");\nconst DEFAULT_IGNORE_SELECTOR = \".an-ignore, [data-an-ignore]\";\nconst DEFAULT_MASK_TEXT_CLASS = \"an-mask\";\nconst DEFAULT_MASK_TEXT_SELECTOR = \"[data-an-mask]\";\nconst DEFAULT_FLUSH_INTERVAL_MS = 5000;\nconst DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_EVENTS_PER_BATCH = 50;\nconst DEFAULT_MAX_BATCH_BYTES = 256 * 1024;\nconst MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES = 60 * 1024;\nconst URL_LIKE_KEYS = new Set([\n \"url\",\n \"uri\",\n \"href\",\n \"src\",\n \"currentUrl\",\n \"referrer\",\n \"from\",\n \"to\",\n]);\n\nfunction getState(): SessionReplayState {\n const g = globalThis as typeof globalThis & {\n [SESSION_REPLAY_STATE_KEY]?: SessionReplayState;\n };\n if (!g[SESSION_REPLAY_STATE_KEY]) {\n g[SESSION_REPLAY_STATE_KEY] = {\n active: false,\n startPromise: null,\n replayId: null,\n startedAtMs: null,\n sequence: 0,\n queue: [],\n queuedBytes: 0,\n flushTimer: null,\n maxDurationTimer: null,\n flushing: false,\n stopRecorder: null,\n restoreUrlMonitor: null,\n removeLifecycleListeners: null,\n options: null,\n lastAuthenticatedProperties: null,\n };\n }\n return g[SESSION_REPLAY_STATE_KEY]!;\n}\n\nfunction safeStorageGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeStorageSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // private browsing / storage disabled -- replay still works for this page\n }\n}\n\nfunction generateReplayId(): string {\n try {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n } catch {\n // fall through\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readStoredReplaySession(): StoredReplaySession | null {\n const raw = safeStorageGet(SESSION_REPLAY_ID_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredReplaySession;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredReplaySession(value: StoredReplaySession): void {\n safeStorageSet(SESSION_REPLAY_ID_STORAGE_KEY, JSON.stringify(value));\n}\n\nfunction getOrCreateReplaySession(sessionId: string): {\n replayId: string;\n startedAtMs: number;\n sequence: number;\n} {\n const parsed = readStoredReplaySession();\n if (parsed?.sessionId === sessionId && parsed.replayId) {\n const startedAtMs =\n typeof parsed.startedAtMs === \"number\" &&\n Number.isFinite(parsed.startedAtMs) &&\n parsed.startedAtMs > 0\n ? parsed.startedAtMs\n : Date.now();\n const sequence =\n typeof parsed.sequence === \"number\" &&\n Number.isFinite(parsed.sequence) &&\n parsed.sequence >= 0\n ? Math.floor(parsed.sequence)\n : 0;\n return { replayId: parsed.replayId, startedAtMs, sequence };\n }\n const replayId = generateReplayId();\n const startedAtMs = Date.now();\n writeStoredReplaySession({ sessionId, replayId, startedAtMs, sequence: 0 });\n return { replayId, startedAtMs, sequence: 0 };\n}\n\nfunction persistReplaySequence(\n sessionId: string,\n replayId: string,\n startedAtMs: number | null,\n sequence: number,\n): void {\n writeStoredReplaySession({\n sessionId,\n replayId,\n startedAtMs: startedAtMs ?? Date.now(),\n sequence,\n });\n}\n\nfunction clampSamplingRate(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction readEnvString(key: string): string | undefined {\n return (import.meta.env as Record<string, string | undefined>)?.[key]?.trim();\n}\n\nfunction readEnvNumber(key: string): number | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readEnvBoolean(key: string): boolean | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n if (/^(1|true|yes|on)$/i.test(raw)) return true;\n if (/^(0|false|no|off)$/i.test(raw)) return false;\n return undefined;\n}\n\nfunction readFirstEnvString(keys: string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvString(key);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction readFirstEnvNumber(keys: string[]): number | undefined {\n for (const key of keys) {\n const value = readEnvNumber(key);\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction replayEndpointFromAnalyticsEndpoint(value: string): string | null {\n try {\n const url = new URL(value);\n if (url.pathname.endsWith(\"/api/analytics/track\")) {\n url.pathname = url.pathname.replace(\n /\\/api\\/analytics\\/track$/,\n \"/api/analytics/replay\",\n );\n return url.toString();\n }\n if (url.pathname.endsWith(\"/track\")) {\n url.pathname = url.pathname.replace(/\\/track$/, \"/api/analytics/replay\");\n return url.toString();\n }\n } catch {\n // Fall through to the relative path cases below.\n }\n if (value.endsWith(\"/api/analytics/track\")) {\n return value.replace(/\\/api\\/analytics\\/track$/, \"/api/analytics/replay\");\n }\n if (value.endsWith(\"/track\")) {\n return value.replace(/\\/track$/, \"/api/analytics/replay\");\n }\n return null;\n}\n\nfunction defaultReplayEndpoint(): string {\n const analyticsEndpoint = readEnvString(\n \"VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT\",\n );\n const derived = analyticsEndpoint\n ? replayEndpointFromAnalyticsEndpoint(analyticsEndpoint)\n : null;\n if (derived) return derived;\n return typeof window !== \"undefined\"\n ? `${window.location.origin}${DEFAULT_REPLAY_PATH}`\n : DEFAULT_REPLAY_PATH;\n}\n\nexport function getSessionReplaySamplingScore(\n sessionId: string,\n salt = DEFAULT_SAMPLING_SALT,\n): number {\n let hash = 2166136261;\n const input = `${salt}:${sessionId}`;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 4294967296;\n}\n\nexport function shouldSampleSessionReplay(\n sessionId: string,\n sampleRate = 1,\n salt = DEFAULT_SAMPLING_SALT,\n): boolean {\n const rate = clampSamplingRate(sampleRate);\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return getSessionReplaySamplingScore(sessionId, salt) < rate;\n}\n\nfunction matcherAllows(matcher: SessionReplayUrlMatcher, url: string): boolean {\n if (typeof matcher === \"string\") return url.includes(matcher);\n if (matcher instanceof RegExp) return matcher.test(url);\n return matcher(url);\n}\n\nfunction isUrlRecordable(\n url: string,\n options: Pick<NormalizedSessionReplayOptions, \"allowUrls\" | \"blockUrls\">,\n): boolean {\n if (options.allowUrls.length > 0) {\n const allowed = options.allowUrls.some((matcher) =>\n matcherAllows(matcher, url),\n );\n if (!allowed) return false;\n }\n return !options.blockUrls.some((matcher) => matcherAllows(matcher, url));\n}\n\nfunction normalizeOptions(\n options: SessionReplayOptions,\n): NormalizedSessionReplayOptions | null {\n const publicKey =\n options.publicKey ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_PUBLIC_KEY\",\n \"VITE_SESSION_REPLAY_PUBLIC_KEY\",\n ]) ||\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return null;\n const endpoint =\n options.endpoint ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_ANALYTICS_REPLAY_ENDPOINT\",\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_ENDPOINT\",\n \"VITE_SESSION_REPLAY_INGEST_URL\",\n ]) ||\n defaultReplayEndpoint();\n return {\n publicKey,\n endpoint,\n requireSignedInUser:\n options.requireSignedInUser ??\n readEnvBoolean(\"VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n readEnvBoolean(\"VITE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n false,\n sampleRate: clampSamplingRate(\n options.sampleRate ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE\",\n \"VITE_SESSION_REPLAY_SAMPLE_RATE\",\n ]),\n ),\n samplingSalt: options.samplingSalt || DEFAULT_SAMPLING_SALT,\n allowUrls: options.allowUrls ?? [],\n blockUrls: options.blockUrls ?? [],\n flushIntervalMs: Math.max(\n 250,\n options.flushIntervalMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n \"VITE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n ]) ??\n DEFAULT_FLUSH_INTERVAL_MS,\n ),\n maxDurationMs: Math.max(\n 1000,\n options.maxDurationMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_MAX_DURATION_MS\",\n \"VITE_SESSION_REPLAY_MAX_DURATION_MS\",\n ]) ??\n DEFAULT_MAX_DURATION_MS,\n ),\n maxEventsPerBatch: Math.max(\n 1,\n options.maxEventsPerBatch ?? DEFAULT_MAX_EVENTS_PER_BATCH,\n ),\n maxBatchBytes: Math.max(\n 1024,\n options.maxBatchBytes ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n \"VITE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n ]) ??\n DEFAULT_MAX_BATCH_BYTES,\n ),\n checkoutEveryNth: options.checkoutEveryNth,\n checkoutEveryNms: options.checkoutEveryNms,\n blockSelector: options.blockSelector || DEFAULT_BLOCK_SELECTOR,\n ignoreSelector: options.ignoreSelector || DEFAULT_IGNORE_SELECTOR,\n maskTextClass: options.maskTextClass || DEFAULT_MASK_TEXT_CLASS,\n maskTextSelector: options.maskTextSelector || DEFAULT_MASK_TEXT_SELECTOR,\n maskAllInputs: options.maskAllInputs ?? true,\n recordCanvas: options.recordCanvas ?? false,\n recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,\n collectFonts: options.collectFonts ?? false,\n inlineImages: options.inlineImages ?? false,\n eventSampling: options.eventSampling ?? DEFAULT_EVENT_SAMPLING,\n extraProperties: options.extraProperties,\n };\n}\n\nfunction scrubStringValue(key: string, value: string): string {\n const lowerKey = key.toLowerCase();\n const isUrlKey = URL_LIKE_KEYS.has(key) || URL_LIKE_KEYS.has(lowerKey);\n if (\n isUrlKey ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"/\")\n ) {\n return scrubUrl(value) ?? value;\n }\n return value;\n}\n\nfunction scrubReplayValue(\n value: unknown,\n key = \"\",\n depth = 0,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === \"string\") return scrubStringValue(key, value);\n if (!value || typeof value !== \"object\") return value;\n if (depth > 12) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => scrubReplayValue(item, key, depth + 1, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = scrubReplayValue(childValue, childKey, depth + 1, seen);\n }\n return out;\n}\n\n/**\n * JSON.stringify replacer that scrubs URL-like string values inline. Folding\n * the scrub into the single serialization pass avoids a separate deep-clone of\n * every emitted event (FullSnapshots are large DOM trees) on the hot path.\n */\nfunction scrubReplayReplacer(key: string, value: unknown): unknown {\n return typeof value === \"string\" ? scrubStringValue(key, value) : value;\n}\n\n/**\n * Serialize + scrub one event in a single pass. The resulting string is stored\n * directly on the queue and reused verbatim at flush, so each event is\n * stringified exactly once (was: deep-clone + size-stringify + flush-stringify).\n */\nfunction serializeReplayEvent(event: ReplayEvent): string {\n try {\n return JSON.stringify(event, scrubReplayReplacer);\n } catch {\n return \"\";\n }\n}\n\nfunction replayEventTimestampMs(event: ReplayEvent): number {\n const timestamp = event.timestamp;\n if (typeof timestamp === \"number\" && Number.isFinite(timestamp)) {\n return timestamp;\n }\n if (typeof timestamp === \"string\" && timestamp.trim()) {\n const parsed = Date.parse(timestamp);\n if (Number.isFinite(parsed)) return parsed;\n }\n return Date.now();\n}\n\nfunction enqueueReplayEvent(\n state: SessionReplayState,\n event: ReplayEvent,\n): void {\n if (!state.options) return;\n const serialized = serializeReplayEvent(event);\n if (!serialized) return;\n const estimatedBytes = serialized.length;\n if (\n state.queue.length > 0 &&\n state.queuedBytes + estimatedBytes > state.options.maxBatchBytes\n ) {\n void flushSessionReplay(\"max-bytes\");\n }\n state.queue.push({\n json: serialized,\n timestampMs: replayEventTimestampMs(event),\n });\n state.queuedBytes += estimatedBytes;\n if (state.queue.length >= state.options.maxEventsPerBatch) {\n void flushSessionReplay(\"max-events\");\n }\n}\n\nfunction replayExtraProperties(\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const source = options.extraProperties;\n if (!source) return undefined;\n try {\n const props = typeof source === \"function\" ? source() : source;\n if (!props || typeof props !== \"object\") return undefined;\n return scrubReplayValue(props) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction replayString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction replayEmail(value: unknown): string | undefined {\n const raw = replayString(value);\n return raw && raw.includes(\"@\") ? raw : undefined;\n}\n\nfunction replayUserEmail(\n properties: Record<string, unknown> | undefined,\n): string | undefined {\n return (\n replayEmail(properties?.userEmail ?? properties?.user_email) ||\n replayEmail(properties?.email) ||\n replayEmail(properties?.userId ?? properties?.user_id)\n );\n}\n\nfunction replayPropertiesForUpload(\n state: SessionReplayState,\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const properties = replayExtraProperties(options);\n if (replayUserEmail(properties)) {\n state.lastAuthenticatedProperties = properties ? { ...properties } : null;\n return properties;\n }\n if (options.requireSignedInUser && state.lastAuthenticatedProperties) {\n return state.lastAuthenticatedProperties;\n }\n return properties;\n}\n\nfunction buildReplayBody(\n state: SessionReplayState,\n reason: string,\n events: QueuedReplayEvent[],\n): string | null {\n const options = state.options;\n if (!options || !state.replayId) return null;\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return null;\n const properties = replayPropertiesForUpload(state, options);\n const userEmail = replayUserEmail(properties);\n if (options.requireSignedInUser && !userEmail) return null;\n const userId =\n userEmail || replayString(properties?.userId ?? properties?.user_id);\n const eventTimestamps = events.map((event) => event.timestampMs);\n const nowMs = Date.now();\n const startedAtMs =\n state.startedAtMs ??\n (eventTimestamps.length ? Math.min(...eventTimestamps) : nowMs);\n const endedAtMs = eventTimestamps.length\n ? Math.max(...eventTimestamps)\n : nowMs;\n const envelope = {\n publicKey: options.publicKey,\n type: \"session_replay\",\n replayId: state.replayId,\n sessionId,\n ...(userId ? { userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n anonymousId: getAnalyticsAnonymousId(),\n sequence: state.sequence,\n reason,\n status: isFinalFlushReason(reason) ? \"completed\" : \"active\",\n eventCount: events.length,\n startedAt: new Date(startedAtMs).toISOString(),\n endedAt: new Date(endedAtMs).toISOString(),\n durationMs: Math.max(0, endedAtMs - startedAtMs),\n privacyMode: \"mask-inputs-and-selected-text\",\n url:\n typeof window !== \"undefined\"\n ? scrubUrl(window.location.href)\n : undefined,\n timestamp: new Date().toISOString(),\n properties,\n };\n state.sequence += 1;\n persistReplaySequence(\n sessionId,\n state.replayId,\n state.startedAtMs,\n state.sequence,\n );\n // Events are already serialized+scrubbed JSON strings; splice them into the\n // envelope without re-serializing the (potentially large) events array.\n const envelopeJson = JSON.stringify(envelope);\n return `${envelopeJson.slice(0, -1)},\"events\":[${events\n .map((event) => event.json)\n .join(\",\")}]}`;\n}\n\ninterface ReplayUploadBody {\n body: BodyInit;\n headers: Record<string, string>;\n compressed: boolean;\n}\n\nfunction isCrossOriginReplayEndpoint(endpoint: string): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return (\n new URL(endpoint, window.location.href).origin !== window.location.origin\n );\n } catch {\n return false;\n }\n}\n\nfunction replayUploadByteLength(body: string): number {\n if (typeof TextEncoder !== \"undefined\") {\n return new TextEncoder().encode(body).byteLength;\n }\n return body.length;\n}\n\nasync function gzipReplayBody(body: string): Promise<Blob | null> {\n if (\n typeof CompressionStream === \"undefined\" ||\n typeof Blob === \"undefined\" ||\n typeof Response === \"undefined\"\n ) {\n return null;\n }\n try {\n const stream = new Blob([body], { type: \"application/json\" })\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n const compressed = await new Response(stream).arrayBuffer();\n return new Blob([compressed], { type: \"application/json\" });\n } catch {\n return null;\n }\n}\n\nasync function buildReplayUploadBody(body: string): Promise<ReplayUploadBody> {\n const compressed = await gzipReplayBody(body);\n if (compressed) {\n return {\n body: compressed,\n compressed: true,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Encoding\": \"gzip\",\n },\n };\n }\n return {\n body,\n compressed: false,\n headers: {\n \"Content-Type\": \"text/plain;charset=UTF-8\",\n },\n };\n}\n\nasync function sendReplayUpload(\n options: NormalizedSessionReplayOptions,\n body: string,\n): Promise<void> {\n if (isCrossOriginReplayEndpoint(options.endpoint)) {\n if (navigator.sendBeacon) {\n const sent = navigator.sendBeacon(options.endpoint, body);\n if (sent) return;\n }\n await fetch(options.endpoint, {\n method: \"POST\",\n body,\n keepalive:\n replayUploadByteLength(body) <= MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES,\n headers: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n }).catch(() => {});\n return;\n }\n\n const upload = await buildReplayUploadBody(body);\n if (!upload.compressed && navigator.sendBeacon) {\n const sent = navigator.sendBeacon(options.endpoint, body);\n if (sent) return;\n }\n await fetch(options.endpoint, {\n method: \"POST\",\n body: upload.body,\n keepalive: true,\n headers: {\n ...upload.headers,\n \"X-Agent-Native-Analytics-Key\": options.publicKey,\n },\n }).catch(() => {});\n}\n\nfunction isFinalFlushReason(reason: string): boolean {\n return [\n \"auth-cleared\",\n \"manual\",\n \"pagehide\",\n \"beforeunload\",\n \"url-blocked\",\n \"max-duration\",\n ].includes(reason);\n}\n\nexport async function flushSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.options || state.queue.length === 0 || state.flushing) return;\n const events = state.queue.splice(0, state.queue.length);\n state.queuedBytes = 0;\n const body = buildReplayBody(state, reason, events);\n if (!body || !state.options) {\n state.queue = events.concat(state.queue);\n state.queuedBytes += events.reduce(\n (total, event) => total + event.json.length,\n 0,\n );\n return;\n }\n state.flushing = true;\n try {\n await sendReplayUpload(state.options, body);\n } finally {\n state.flushing = false;\n }\n}\n\nfunction installUrlMonitor(state: SessionReplayState): void {\n if (!state.options || state.restoreUrlMonitor) return;\n const options = state.options;\n const check = () => {\n if (!isUrlRecordable(window.location.href, options)) {\n stopSessionReplay(\"url-blocked\");\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.addEventListener(\"popstate\", check);\n state.restoreUrlMonitor = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", check);\n state.restoreUrlMonitor = null;\n };\n}\n\nfunction installLifecycleListeners(state: SessionReplayState): void {\n if (state.removeLifecycleListeners) return;\n const flushOnHidden = () => {\n if (document.visibilityState === \"hidden\") {\n void flushSessionReplay(\"visibility-hidden\");\n }\n };\n const flushOnUnload = () => {\n void flushSessionReplay(\"pagehide\");\n };\n document.addEventListener(\"visibilitychange\", flushOnHidden);\n window.addEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = () => {\n document.removeEventListener(\"visibilitychange\", flushOnHidden);\n window.removeEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = null;\n };\n}\n\nexport async function startSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n if (options.enabled === false) return { started: false, reason: \"disabled\" };\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return { started: false, reason: \"not-browser\" };\n }\n const normalized = normalizeOptions(options);\n if (!normalized) return { started: false, reason: \"missing-public-key\" };\n\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return { started: false, reason: \"missing-session-id\" };\n const sampled = shouldSampleSessionReplay(\n sessionId,\n normalized.sampleRate,\n normalized.samplingSalt,\n );\n if (!sampled) {\n return { started: false, reason: \"sampled-out\", sessionId, sampled };\n }\n const initialProperties = replayExtraProperties(normalized);\n if (normalized.requireSignedInUser) {\n if (!replayUserEmail(initialProperties)) {\n return {\n started: false,\n reason: \"missing-user-id\",\n sessionId,\n sampled,\n };\n }\n }\n if (!isUrlRecordable(window.location.href, normalized)) {\n return { started: false, reason: \"url-blocked\", sessionId, sampled };\n }\n\n const state = getState();\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n if (state.startPromise) return state.startPromise;\n\n let startPromise: Promise<SessionReplayStartResult>;\n startPromise = startSessionReplayRecorder(\n state,\n normalized,\n sessionId,\n sampled,\n initialProperties,\n ).finally(() => {\n if (state.startPromise === startPromise) {\n state.startPromise = null;\n }\n });\n state.startPromise = startPromise;\n return startPromise;\n}\n\nasync function startSessionReplayRecorder(\n state: SessionReplayState,\n normalized: NormalizedSessionReplayOptions,\n sessionId: string,\n sampled: boolean,\n initialProperties: Record<string, unknown> | undefined,\n): Promise<SessionReplayStartResult> {\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n\n let rrweb: RrwebRecordModule;\n try {\n rrweb = (await import(\"@rrweb/record\")) as RrwebRecordModule;\n } catch {\n return { started: false, reason: \"import-failed\", sessionId, sampled };\n }\n\n const replaySession = getOrCreateReplaySession(sessionId);\n state.options = normalized;\n state.replayId = replaySession.replayId;\n state.startedAtMs = replaySession.startedAtMs;\n state.sequence = replaySession.sequence;\n state.queue = [];\n state.queuedBytes = 0;\n state.stopRecorder = null;\n state.lastAuthenticatedProperties = replayUserEmail(initialProperties)\n ? { ...initialProperties }\n : null;\n state.active = true;\n\n try {\n const stopRecorder = rrweb.record({\n emit: (event) => enqueueReplayEvent(state, event),\n sampling: normalized.eventSampling,\n checkoutEveryNth: normalized.checkoutEveryNth,\n checkoutEveryNms: normalized.checkoutEveryNms,\n blockSelector: normalized.blockSelector,\n ignoreSelector: normalized.ignoreSelector,\n maskTextClass: normalized.maskTextClass,\n maskTextSelector: normalized.maskTextSelector,\n maskAllInputs: normalized.maskAllInputs,\n recordCanvas: normalized.recordCanvas,\n recordCrossOriginIframes: normalized.recordCrossOriginIframes,\n collectFonts: normalized.collectFonts,\n inlineImages: normalized.inlineImages,\n maskInputOptions: {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n },\n });\n if (typeof stopRecorder !== \"function\") {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n state.stopRecorder = stopRecorder;\n state.flushTimer = window.setInterval(\n () => void flushSessionReplay(\"interval\"),\n normalized.flushIntervalMs,\n );\n state.maxDurationTimer = window.setTimeout(\n () => stopSessionReplay(\"max-duration\"),\n normalized.maxDurationMs,\n );\n installUrlMonitor(state);\n installLifecycleListeners(state);\n return {\n started: true,\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n } catch {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n}\n\nexport async function stopSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.active) return;\n state.active = false;\n try {\n state.stopRecorder?.();\n } catch {\n // best-effort recorder shutdown\n }\n state.stopRecorder = null;\n if (state.flushTimer) {\n window.clearInterval(state.flushTimer);\n state.flushTimer = null;\n }\n if (state.maxDurationTimer) {\n window.clearTimeout(state.maxDurationTimer);\n state.maxDurationTimer = null;\n }\n state.restoreUrlMonitor?.();\n state.removeLifecycleListeners?.();\n await flushSessionReplay(reason);\n}\n\nexport function maybeStartSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n return startSessionReplay(options);\n}\n\nexport function isSessionReplayActive(): boolean {\n return getState().active;\n}\n"]}
@@ -71,6 +71,20 @@ export interface ShareButtonProps {
71
71
  description?: ReactNode;
72
72
  onCheckedChange: (checked: boolean) => void | Promise<void>;
73
73
  };
74
+ /** Optional extra tabs rendered beside the default sharing/access panel. */
75
+ shareTabs?: {
76
+ shareLabel?: ReactNode;
77
+ defaultValue?: string;
78
+ tabs: Array<{
79
+ value: string;
80
+ label: ReactNode;
81
+ content: ReactNode;
82
+ disabled?: boolean;
83
+ }>;
84
+ onValueChange?: (value: string) => void;
85
+ };
86
+ /** Optional className for the popover content, useful for wider custom tabs. */
87
+ popoverClassName?: string;
74
88
  }
75
89
  type Visibility = "private" | "org" | "public";
76
90
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ShareButton.d.ts","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"AAeA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAiBf,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;oDACgD;IAChD,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;+EAE2E;IAC3E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;6DACyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;qEAEiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC;kEAC8D;IAC9D,iBAAiB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACrC;;;iBAGa;IACb,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC;;;8DAG0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,4DAA4D;IAC5D,4BAA4B,CAAC,EAAE,SAAS,CAAC;IACzC;;kDAE8C;IAC9C,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,oEAAoE;IACpE,8BAA8B,CAAC,EAAE,SAAS,CAAC;IAC3C,iEAAiE;IACjE,cAAc,CAAC,EAAE,OAAO,CACtB,MAAM,CAAC,UAAU,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAC7D,CAAC;IACF,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;sBAEkB;IAClB,mBAAmB,CAAC,EAAE;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,SAAS,CAAC;QACxB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;CACH;AAED,KAAK,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AA8F/C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA4HlD"}
1
+ {"version":3,"file":"ShareButton.d.ts","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"AAeA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAiBf,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;oDACgD;IAChD,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;+EAE2E;IAC3E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;6DACyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;qEAEiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC;kEAC8D;IAC9D,iBAAiB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACrC;;;iBAGa;IACb,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC;;;8DAG0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,4DAA4D;IAC5D,4BAA4B,CAAC,EAAE,SAAS,CAAC;IACzC;;kDAE8C;IAC9C,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,oEAAoE;IACpE,8BAA8B,CAAC,EAAE,SAAS,CAAC;IAC3C,iEAAiE;IACjE,cAAc,CAAC,EAAE,OAAO,CACtB,MAAM,CAAC,UAAU,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAC7D,CAAC;IACF,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;sBAEkB;IAClB,mBAAmB,CAAC,EAAE;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,SAAS,CAAC;QACxB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7D,CAAC;IACF,4EAA4E;IAC5E,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,SAAS,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,KAAK,CAAC;YACV,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,EAAE,SAAS,CAAC;YACjB,OAAO,EAAE,SAAS,CAAC;YACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;QACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACzC,CAAC;IACF,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,KAAK,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AA8F/C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA0IlD"}
@@ -60,6 +60,8 @@ const ROLE_OPTIONS = [
60
60
  */
61
61
  export function ShareButton(props) {
62
62
  const [open, setOpen] = useState(false);
63
+ const shareTabDefaultValue = props.shareTabs?.defaultValue ?? "share";
64
+ const [activeShareTab, setActiveShareTab] = useState(shareTabDefaultValue);
63
65
  const [pendingVisibility, setPendingVisibility] = useState(null);
64
66
  const appliedDefaultOpenRef = useRef(false);
65
67
  const visibilityRequestId = useRef(0);
@@ -74,8 +76,16 @@ export function ShareButton(props) {
74
76
  const handleOpenChange = (v) => {
75
77
  setOpen(v);
76
78
  props.onOpenChange?.(v);
77
- if (v && pendingVisibility === null)
78
- sharesQuery.refetch();
79
+ if (v) {
80
+ setActiveShareTab(shareTabDefaultValue);
81
+ props.shareTabs?.onValueChange?.(shareTabDefaultValue);
82
+ if (pendingVisibility === null)
83
+ sharesQuery.refetch();
84
+ }
85
+ };
86
+ const handleShareTabChange = (value) => {
87
+ setActiveShareTab(value);
88
+ props.shareTabs?.onValueChange?.(value);
79
89
  };
80
90
  useEffect(() => {
81
91
  if (!props.defaultOpen || appliedDefaultOpenRef.current)
@@ -128,7 +138,7 @@ export function ShareButton(props) {
128
138
  };
129
139
  // The default trigger stays text-only; the icon trigger keeps the share glyph.
130
140
  const iconOnly = props.trigger === "icon";
131
- return (_jsxs(Popover, { open: open, onOpenChange: handleOpenChange, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: cn(iconOnly ? BUTTON_GHOST_ICON : BUTTON_OUTLINE_SM, props.triggerClassName), "aria-label": iconOnly ? "Share" : undefined, children: [iconOnly ? _jsx(IconShare3, { size: 16, strokeWidth: 1.75 }) : null, !iconOnly && _jsx("span", { children: "Share" })] }) }), _jsx(PopoverContent, { align: "end", sideOffset: 6, className: cn("z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg", SHARE_POPOVER_SURFACE), onOpenAutoFocus: (e) => e.preventDefault(), children: _jsx(SharePanel, { ...props, sharesQuery: sharesQuery, visibilityOverride: pendingVisibility, onVisibilityChange: handleVisibilityChange, onClose: () => handleOpenChange(false) }) })] }));
141
+ return (_jsxs(Popover, { open: open, onOpenChange: handleOpenChange, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: cn(iconOnly ? BUTTON_GHOST_ICON : BUTTON_OUTLINE_SM, props.triggerClassName), "aria-label": iconOnly ? "Share" : undefined, children: [iconOnly ? _jsx(IconShare3, { size: 16, strokeWidth: 1.75 }) : null, !iconOnly && _jsx("span", { children: "Share" })] }) }), _jsx(PopoverContent, { align: "end", sideOffset: 6, className: cn("z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg", SHARE_POPOVER_SURFACE, props.popoverClassName), onOpenAutoFocus: (e) => e.preventDefault(), children: _jsx(SharePanel, { ...props, sharesQuery: sharesQuery, visibilityOverride: pendingVisibility, onVisibilityChange: handleVisibilityChange, onClose: () => handleOpenChange(false), activeTab: activeShareTab, onTabChange: handleShareTabChange }) })] }));
132
142
  }
133
143
  function useOrgMemberSearch(query, enabled) {
134
144
  const search = query.trim();
@@ -307,6 +317,9 @@ function SharePanel(props) {
307
317
  Boolean(props.shareUrlPlaceholder) ||
308
318
  Boolean(props.secondaryShareUrl);
309
319
  const shareUrlPlacement = props.shareUrlPlacement ?? "bottom";
320
+ const extraTabs = props.shareTabs?.tabs ?? [];
321
+ const hasTabs = extraTabs.length > 0;
322
+ const shareTabLabel = props.shareTabs?.shareLabel ?? "Share link";
310
323
  const serverShares = data?.shares ?? [];
311
324
  const shares = [
312
325
  ...serverShares
@@ -472,10 +485,7 @@ function SharePanel(props) {
472
485
  const titleText = resourceTitle
473
486
  ? `Share "${resourceTitle}"`
474
487
  : `Share ${resourceType}`;
475
- if (isLoading) {
476
- return (_jsxs("div", { children: [_jsx("div", { className: "mb-3 truncate text-base font-semibold", title: titleText, children: titleText }), _jsx("div", { className: "mb-4 h-9 rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: peopleAccessLabel }), _jsx("div", { className: "mb-4 h-7 rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: generalAccessLabel }), _jsx("div", { className: "mb-4 h-9 rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: onClose, className: BUTTON_PRIMARY_SM, children: "Done" }) })] }));
477
- }
478
- return (_jsxs("div", { children: [_jsx("div", { className: "mb-3 truncate text-base font-semibold", title: titleText, children: titleText }), showShareLinks && shareUrlPlacement === "top" ? shareLinks : null, canManage ? (_jsxs("div", { className: "mb-4 space-y-2", children: [_jsxs("div", { className: "flex items-stretch gap-2", children: [_jsx(MemberAutocomplete, { value: email, open: suggestionsOpen, onOpenChange: setSuggestionsOpen, onValueChange: (next) => {
488
+ const sharePanel = isLoading ? (_jsxs("div", { children: [!hasTabs ? (_jsx("div", { className: "mb-3 truncate text-base font-semibold", title: titleText, children: titleText })) : null, _jsx("div", { className: "mb-4 h-9 rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: peopleAccessLabel }), _jsx("div", { className: "mb-4 h-7 rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: generalAccessLabel }), _jsx("div", { className: "mb-4 h-9 rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: onClose, className: BUTTON_PRIMARY_SM, children: "Done" }) })] })) : (_jsxs("div", { children: [!hasTabs ? (_jsx("div", { className: "mb-3 truncate text-base font-semibold", title: titleText, children: titleText })) : null, showShareLinks && shareUrlPlacement === "top" ? shareLinks : null, canManage ? (_jsxs("div", { className: "mb-4 space-y-2", children: [_jsxs("div", { className: "flex items-stretch gap-2", children: [_jsx(MemberAutocomplete, { value: email, open: suggestionsOpen, onOpenChange: setSuggestionsOpen, onValueChange: (next) => {
479
489
  setEmail(next);
480
490
  if (shareError)
481
491
  setShareError(null);
@@ -491,6 +501,25 @@ function SharePanel(props) {
491
501
  : displayName(s.principalId, knownMembers), org: s.principalType === "org" }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: s.principalType === "org"
492
502
  ? s.principalId
493
503
  : displayName(s.principalId, knownMembers) }), canManage ? (_jsx(RoleSelect, { value: s.role, onChange: (r) => handleChangeRole(s, r), disabled: inFlight.has(keyOf(s)), plain: true })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: cap(s.role) })), canManage ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: () => handleRemove(s), disabled: inFlight.has(keyOf(s)), className: BUTTON_GHOST_ICON, children: _jsx(IconTrash, { size: 14 }) })) : null] }, keyOf(s)))), !shares.length && !data?.ownerEmail ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: "No one has access yet." })) : null] }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: generalAccessLabel }), _jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage, visibilityCopy: props.visibilityCopy, allowPublic: policy.allowPublic }), _jsxs("div", { className: "mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground", children: [_jsx("span", { children: meta.description }), visibility === "org" && props.hideInSearchControl ? (_jsx(AdvancedAccessPopover, { control: props.hideInSearchControl, canManage: canManage, onToggle: handleHideInSearch })) : null] })] })] }), props.accessNote ? (_jsx("div", { className: "mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground", children: props.accessNote })) : null, showShareLinks && shareUrlPlacement === "bottom" ? shareLinks : null, _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: handleDone, className: BUTTON_PRIMARY_SM, children: "Done" }) })] }));
504
+ if (!hasTabs)
505
+ return sharePanel;
506
+ const tabs = [
507
+ {
508
+ value: "share",
509
+ label: shareTabLabel,
510
+ content: sharePanel,
511
+ disabled: false,
512
+ },
513
+ ...extraTabs,
514
+ ];
515
+ const activeTab = tabs.some((tab) => tab.value === props.activeTab)
516
+ ? props.activeTab
517
+ : "share";
518
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("div", { role: "tablist", "aria-label": "Share options", className: "flex gap-1 rounded-xl bg-muted/70 p-1", children: tabs.map((tab) => {
519
+ const active = tab.value === activeTab;
520
+ return (_jsx("button", { type: "button", role: "tab", "aria-selected": active, disabled: tab.disabled, onClick: () => props.onTabChange(tab.value), className: cn("h-11 min-w-0 flex-1 rounded-lg px-3 text-sm font-medium text-muted-foreground transition-colors hover:bg-background/70 hover:text-foreground disabled:pointer-events-none disabled:opacity-50", active &&
521
+ "bg-background text-foreground shadow-sm ring-2 ring-primary"), children: _jsx("span", { className: "block truncate", children: tab.label }) }, tab.value));
522
+ }) }), _jsx("div", { role: "tabpanel", children: tabs.find((tab) => tab.value === activeTab)?.content })] }));
494
523
  }
495
524
  function AdvancedAccessPopover({ control, canManage, onToggle, }) {
496
525
  return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", disabled: !canManage, className: "inline-flex items-center gap-1 rounded-sm px-1 py-0.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50", children: ["Advanced", _jsx(IconChevronDown, { size: 12, strokeWidth: 1.8 })] }) }), _jsx(PopoverContent, { align: "start", sideOffset: 6, onOpenAutoFocus: (event) => event.preventDefault(), className: cn("z-[2300] w-72 p-3 shadow-lg", SHARE_POPOVER_SURFACE), children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: "Advanced access" }), _jsx("div", { className: "mt-1 text-xs leading-5 text-muted-foreground", children: "Control how organization access appears in search." })] }), _jsxs("button", { type: "button", role: "switch", "aria-checked": control.checked, disabled: !canManage || control.pending, onClick: onToggle, className: cn("flex w-full items-start gap-3 rounded-md border border-border/70 bg-card px-3 py-2.5 text-start transition-colors hover:bg-accent/45 disabled:cursor-not-allowed disabled:opacity-60", control.checked && "border-border bg-accent/35 text-foreground"), children: [_jsx("span", { "aria-hidden": true, className: cn("relative mt-0.5 inline-flex h-5 w-9 shrink-0 items-center rounded-full border border-border bg-muted-foreground/25 transition-colors", control.checked && "border-primary/70 bg-primary"), children: _jsx("span", { className: cn("ml-0.5 size-4 rounded-full bg-popover shadow-sm transition-transform", control.checked && "translate-x-4") }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsxs("span", { className: "flex items-center gap-1.5 text-sm font-medium text-foreground", children: [_jsx(IconSearchOff, { size: 14, strokeWidth: 1.8 }), control.label ?? "Hide in search"] }), _jsx("span", { className: "mt-0.5 block text-xs leading-5 text-muted-foreground", children: control.description ??