@agent-native/core-corpus 0.205.0 → 0.206.0-nightly-20261009011246

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 (203) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -1
  3. package/corpus/templates/analytics/.agents/skills/onboarding-journeys/SKILL.md +30 -13
  4. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +10 -0
  5. package/corpus/templates/analytics/actions/get-onboarding-journey.ts +1 -1
  6. package/corpus/templates/analytics/app/i18n/en-US.ts +2 -0
  7. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +1 -1
  8. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +50 -46
  9. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +15 -3
  10. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +83 -220
  11. package/corpus/templates/analytics/changelog/2026-10-08-chart-time-ranges-move-to-chart-options.md +6 -0
  12. package/corpus/templates/analytics/changelog/2026-10-08-fix-bigquery-onboarding-journey.md +6 -0
  13. package/corpus/templates/analytics/changelog/2026-10-08-fix-session-replay-agent-links.md +6 -0
  14. package/corpus/templates/analytics/changelog/2026-10-08-new-ask-chat-starts-without-waiting-for-history.md +6 -0
  15. package/corpus/templates/analytics/changelog/2026-10-08-onboarding-journey-screenshots-include-dialogs-at-the-record.md +7 -0
  16. package/corpus/templates/analytics/changelog/2026-10-08-onboarding-journey-screenshots-now-align-with-the-selected-s.md +6 -0
  17. package/corpus/templates/analytics/changelog/2026-10-08-onboarding-journeys-preserve-each-skipped-setup-step.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-10-08-onboarding-journeys-use-the-current-builder-setup-label.md +6 -0
  19. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +1 -1
  20. package/corpus/templates/analytics/package.json +1 -1
  21. package/corpus/templates/analytics/scripts/journey-capture-plan.ts +2 -0
  22. package/corpus/templates/analytics/scripts/journey-capture.ts +819 -83
  23. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +2 -2
  24. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +10 -0
  25. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +7 -5
  26. package/corpus/templates/analytics/server/lib/journey-steps.ts +74 -16
  27. package/corpus/templates/analytics/server/lib/journey-tree.ts +1 -1
  28. package/corpus/templates/analytics/server/lib/onboarding-journey.ts +12 -0
  29. package/corpus/templates/analytics/server/plugins/auth.ts +2 -0
  30. package/corpus/templates/analytics/shared/replay-playback.ts +277 -0
  31. package/corpus/templates/assets/changelog/2026-10-08-new-chat-home-shows-before-chat-history-loads.md +6 -0
  32. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +8 -0
  33. package/corpus/templates/calendar/AGENTS.md +1 -0
  34. package/corpus/templates/calendar/CHANGELOG.md +9 -0
  35. package/corpus/templates/calendar/actions/update-calendar-visual-preferences.ts +13 -1
  36. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +62 -8
  37. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +103 -3
  38. package/corpus/templates/calendar/app/components/calendar/all-day-resize.ts +32 -0
  39. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -5
  40. package/corpus/templates/calendar/app/components/layout/HeaderActions.tsx +16 -0
  41. package/corpus/templates/calendar/app/i18n/en-US.ts +3 -0
  42. package/corpus/templates/calendar/app/lib/rsvp-status.tsx +16 -4
  43. package/corpus/templates/calendar/app/pages/CalendarView.tsx +22 -7
  44. package/corpus/templates/calendar/app/routes/_app.extensions.$id.tsx +2 -1
  45. package/corpus/templates/calendar/changelog/2026-10-05-notifications-sent-by-the-agent-or-an-automation-show-up-aga.md +6 -0
  46. package/corpus/templates/calendar/changelog/2026-10-05-on-phones-the-calendar-header-shows-the-full-date-range-agai.md +6 -0
  47. package/corpus/templates/calendar/changelog/2026-10-08-calendar-highlights-proposed-times-and-links-to-google-calen.md +6 -0
  48. package/corpus/templates/calendar/changelog/2026-10-08-the-week-view-s-all-day-section-can-be-resized.md +6 -0
  49. package/corpus/templates/calendar/shared/calendar-view-preferences.ts +13 -0
  50. package/corpus/templates/clips/.agents/skills/video-editing/SKILL.md +17 -18
  51. package/corpus/templates/clips/actions/consume-ai-request.ts +47 -0
  52. package/corpus/templates/clips/actions/finalize-recording.ts +66 -2
  53. package/corpus/templates/clips/actions/lib/ai-request-status.ts +69 -27
  54. package/corpus/templates/clips/actions/lib/silence-trim-ranges.ts +89 -0
  55. package/corpus/templates/clips/actions/list-ai-requests.ts +85 -14
  56. package/corpus/templates/clips/actions/remove-filler-words.ts +2 -2
  57. package/corpus/templates/clips/actions/remove-silences.ts +187 -43
  58. package/corpus/templates/clips/actions/update-ai-request-status.ts +33 -2
  59. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +24 -4
  60. package/corpus/templates/clips/app/hooks/use-auto-title.ts +507 -15
  61. package/corpus/templates/clips/app/i18n/en-US.ts +2 -0
  62. package/corpus/templates/clips/app/lib/upload-request.ts +5 -0
  63. package/corpus/templates/clips/app/routes/_app.home.tsx +0 -20
  64. package/corpus/templates/clips/app/routes/_app.r.$recordingId.tsx +42 -1
  65. package/corpus/templates/clips/changelog/2026-10-08-clip-uploads-recover-more-reliably-from-temporary-server-int.md +6 -0
  66. package/corpus/templates/clips/changelog/2026-10-08-clips-marks-recordings-as-failed-when-storage-setup-is-missi.md +6 -0
  67. package/corpus/templates/clips/changelog/2026-10-08-clips-respects-skip-after-storage-connects-and-gives-accurat.md +6 -0
  68. package/corpus/templates/clips/changelog/2026-10-08-root-opens-directly-to-recordings.md +6 -0
  69. package/corpus/templates/clips/changelog/2026-10-08-skip-setup-to-start-recording-storage-setup-remains-availabl.md +6 -0
  70. package/corpus/templates/clips/changelog/2026-10-08-the-clips-agent-can-add-split-markers-at-timestamps-so-segme.md +6 -0
  71. package/corpus/templates/clips/changelog/2026-10-08-transcript-cleanup-applies-silence-cuts-consistently-and-off.md +6 -0
  72. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +641 -56
  73. package/corpus/templates/clips/server/lib/initial-tool-names.ts +25 -0
  74. package/corpus/templates/clips/server/lib/recording-failures.ts +14 -4
  75. package/corpus/templates/clips/server/lib/recording-upload-state.ts +101 -0
  76. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -25
  77. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +552 -97
  78. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +22 -12
  79. package/corpus/templates/clips/shared/ai-request-status.ts +11 -1
  80. package/corpus/templates/content/app/hooks/use-documents.ts +41 -28
  81. package/corpus/templates/content/app/lib/content-landing.ts +47 -1
  82. package/corpus/templates/content/app/lib/page-open-reads.ts +27 -2
  83. package/corpus/templates/content/app/root.tsx +3 -20
  84. package/corpus/templates/content/changelog/2026-10-05-a-page-opened-from-a-link-or-a-refresh-starts-loading-sooner.md +6 -0
  85. package/corpus/templates/content/package.json +4 -0
  86. package/corpus/templates/content/shared/import/finalize.ts +296 -0
  87. package/corpus/templates/content/shared/import/html-fragment.ts +169 -0
  88. package/corpus/templates/content/shared/import/markdown-import.fixtures.ts +123 -0
  89. package/corpus/templates/content/shared/import/markdown.ts +1950 -0
  90. package/corpus/templates/content/shared/import/notes.ts +58 -0
  91. package/corpus/templates/content/shared/import/paths.ts +98 -0
  92. package/corpus/templates/content/shared/import/types.ts +117 -0
  93. package/corpus/templates/content/shared/nfm.ts +9 -2
  94. package/corpus/templates/crm/changelog/2026-10-08-new-ask-chat-starts-without-waiting-for-history.md +6 -0
  95. package/corpus/templates/design/.agents/skills/journey-storyboards/SKILL.md +20 -9
  96. package/corpus/templates/design/AGENTS.md +1 -1
  97. package/corpus/templates/design/actions/add-session-replay-screenshots-to-board.ts +17 -24
  98. package/corpus/templates/design/actions/create-file.ts +14 -0
  99. package/corpus/templates/design/actions/create-journey-canvas.ts +15 -12
  100. package/corpus/templates/design/actions/generate-home-suggestions.ts +41 -32
  101. package/corpus/templates/design/app/pages/Index.tsx +1 -1
  102. package/corpus/templates/design/changelog/2026-10-08-fix-onboarding-storyboard-context.md +6 -0
  103. package/corpus/templates/design/changelog/2026-10-08-replay-screenshots-use-the-encrypted-upload-fallback-only-wh.md +6 -0
  104. package/corpus/templates/design/server/lib/replay-screenshot-blobs.ts +36 -9
  105. package/corpus/templates/design/server/lib/replay-screenshot-private-blob.ts +29 -0
  106. package/corpus/templates/design/server/routes/api/design-board-replay-screenshots/[screenshotId].get.ts +3 -27
  107. package/corpus/templates/design/shared/journey-canvas.ts +63 -15
  108. package/corpus/templates/design/shared/journey-layout.ts +7 -3
  109. package/corpus/templates/forms/.agents/skills/form-responses/SKILL.md +15 -0
  110. package/corpus/templates/forms/AGENTS.md +4 -0
  111. package/corpus/templates/forms/actions/create-form.ts +2 -0
  112. package/corpus/templates/forms/actions/delete-form.ts +2 -0
  113. package/corpus/templates/forms/actions/export-responses.ts +2 -0
  114. package/corpus/templates/forms/actions/list-responses.ts +2 -0
  115. package/corpus/templates/forms/actions/patch-form-fields.ts +2 -0
  116. package/corpus/templates/forms/actions/promote-community-submission.ts +2 -0
  117. package/corpus/templates/forms/actions/response-insights.ts +2 -0
  118. package/corpus/templates/forms/actions/restore-form.ts +2 -0
  119. package/corpus/templates/forms/actions/retry-response-deliveries.ts +2 -0
  120. package/corpus/templates/forms/actions/show-response-insight.ts +3 -0
  121. package/corpus/templates/forms/actions/update-form.ts +2 -0
  122. package/corpus/templates/forms/actions/view-screen.ts +38 -13
  123. package/corpus/templates/forms/app/routes/_app.home.tsx +0 -5
  124. package/corpus/templates/forms/changelog/2026-10-05-reviewer-roles-protect-form-edits.md +6 -0
  125. package/corpus/templates/forms/server/db/index.ts +12 -1
  126. package/corpus/templates/forms/server/lib/app-roles.ts +112 -1
  127. package/corpus/templates/forms/shared/app-roles.ts +1 -1
  128. package/corpus/templates/plan/app/pages/PlanChatPage.tsx +7 -15
  129. package/corpus/templates/plan/app/routes/chat.tsx +2 -2
  130. package/corpus/templates/slides/.agents/skills/apply-slide-comments/SKILL.md +55 -0
  131. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +49 -141
  132. package/corpus/templates/slides/.agents/skills/create-deck/references/reference-inputs.md +72 -0
  133. package/corpus/templates/slides/.agents/skills/create-deck/references/slide-templates.md +93 -0
  134. package/corpus/templates/slides/.agents/skills/create-deck/references/source-material.md +16 -0
  135. package/corpus/templates/slides/.agents/skills/slide-design/SKILL.md +10 -5
  136. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +60 -153
  137. package/corpus/templates/slides/.agents/skills/slide-editing/references/animations.md +28 -0
  138. package/corpus/templates/slides/.agents/skills/slide-editing/references/freeform-objects.md +22 -0
  139. package/corpus/templates/slides/.agents/skills/slide-editing/references/style-only-edits.md +74 -0
  140. package/corpus/templates/slides/.agents/skills/slide-editing/references/video.md +23 -0
  141. package/corpus/templates/slides/AGENTS.md +3 -2
  142. package/corpus/templates/slides/actions/add-slide.ts +12 -2
  143. package/corpus/templates/slides/actions/create-deck.ts +28 -9
  144. package/corpus/templates/slides/actions/export-html.ts +9 -2
  145. package/corpus/templates/slides/actions/export-pptx.ts +14 -6
  146. package/corpus/templates/slides/actions/generate-home-suggestions.ts +41 -32
  147. package/corpus/templates/slides/actions/patch-deck.ts +15 -1
  148. package/corpus/templates/slides/actions/update-slide.ts +15 -1
  149. package/corpus/templates/slides/agent-native.app-skill.json +5 -0
  150. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +5 -0
  151. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +18 -0
  152. package/corpus/templates/slides/app/components/editor/AlignmentGuides.tsx +11 -4
  153. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +4 -0
  154. package/corpus/templates/slides/app/components/editor/FollowingSlideStack.tsx +4 -0
  155. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +4 -0
  156. package/corpus/templates/slides/app/components/editor/ImageCropOverlay.tsx +11 -25
  157. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +6 -7
  158. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1441 -1124
  159. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +2 -4
  160. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +38 -77
  161. package/corpus/templates/slides/app/components/editor/fit-text-object.ts +31 -0
  162. package/corpus/templates/slides/app/components/editor/in-place-text-session.ts +45 -0
  163. package/corpus/templates/slides/app/components/editor/list-editing.ts +3 -0
  164. package/corpus/templates/slides/app/components/editor/rich-text-selection.ts +3 -0
  165. package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +56 -0
  166. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +1473 -194
  167. package/corpus/templates/slides/app/components/editor/slide-object-transform.browser-host.ts +10 -0
  168. package/corpus/templates/slides/app/components/editor/slide-pointer-target.ts +432 -0
  169. package/corpus/templates/slides/app/components/editor/slide-style.ts +4 -6
  170. package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +74 -14
  171. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +7 -1
  172. package/corpus/templates/slides/app/components/presentation/PresenterView.tsx +5 -0
  173. package/corpus/templates/slides/app/context/DeckContext.tsx +52 -10
  174. package/corpus/templates/slides/app/global.css +118 -24
  175. package/corpus/templates/slides/app/hooks/use-undo-selection.ts +66 -0
  176. package/corpus/templates/slides/app/lib/contrast-audit.ts +24 -1
  177. package/corpus/templates/slides/app/lib/export-pdf-client.ts +8 -0
  178. package/corpus/templates/slides/app/lib/export-pptx-client.ts +183 -20
  179. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +9 -1
  180. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +1 -1
  181. package/corpus/templates/slides/app/lib/undo-reveal.ts +312 -0
  182. package/corpus/templates/slides/app/pages/DeckEditor.tsx +15 -0
  183. package/corpus/templates/slides/app/pages/Index.tsx +1 -1
  184. package/corpus/templates/slides/app/routes/slide.tsx +7 -0
  185. package/corpus/templates/slides/changelog/2026-10-07-clicking-dragging-and-selecting-in-the-slide-editor-now-work.md +6 -0
  186. package/corpus/templates/slides/changelog/2026-10-07-footers-can-use-slide-number-tokens-so-page-numbers-like-04-.md +6 -0
  187. package/corpus/templates/slides/changelog/2026-10-07-text-boxes-grow-with-their-text-and-the-selection-outline-fo.md +6 -0
  188. package/corpus/templates/slides/changelog/2026-10-07-the-ai-can-now-plan-slide-height-before-writing-and-apply-co.md +6 -0
  189. package/corpus/templates/slides/changelog/2026-10-08-alt-dragging-several-selected-objects-now-duplicates-them-in.md +6 -0
  190. package/corpus/templates/slides/changelog/2026-10-08-clicking-just-outside-a-text-box-inside-a-group-now-selects-.md +6 -0
  191. package/corpus/templates/slides/changelog/2026-10-08-css-animations-written-in-a-slide-s-style-block-now-play-in-.md +6 -0
  192. package/corpus/templates/slides/changelog/2026-10-08-objects-rotated-scaled-or-moved-with-the-css-rotate-scale-an.md +6 -0
  193. package/corpus/templates/slides/changelog/2026-10-08-powerpoint-and-google-slides-export-now-keeps-radial-gradien.md +6 -0
  194. package/corpus/templates/slides/changelog/2026-10-08-snap-guides-span-the-objects-they-align-and-show-equal-spaci.md +6 -0
  195. package/corpus/templates/slides/changelog/2026-10-08-the-ai-now-gets-a-warning-when-a-slide-has-typed-page-number.md +6 -0
  196. package/corpus/templates/slides/changelog/2026-10-08-undo-and-redo-select-the-objects-they-changed.md +6 -0
  197. package/corpus/templates/slides/interaction-oracle.md +258 -0
  198. package/corpus/templates/slides/interaction-parity.md +104 -22
  199. package/corpus/templates/slides/server/lib/generation-completion.ts +10 -1
  200. package/corpus/templates/slides/server/lib/slide-hygiene.ts +731 -0
  201. package/corpus/templates/slides/server/plugins/agent-chat.ts +1 -1
  202. package/corpus/templates/slides/shared/slide-number.ts +124 -0
  203. package/package.json +1 -1
package/corpus/README.md CHANGED
@@ -32,4 +32,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core-corpus/corpu
32
32
 
33
33
  ## Generated Counts
34
34
 
35
- - template files: 11555
35
+ - template files: 11622
@@ -85,7 +85,7 @@ Useful `properties`:
85
85
  - Time: `duration_ms` is the full run in milliseconds; `$ai_latency` is model time in seconds (run minus tool time).
86
86
  - Tools: `tool_calls`, `successful_tools`, `failed_tools`, `tools`, `tools_truncated`. The bounded `tools` array holds names, relative start times, durations, statuses, and coarse error classes, never args or results; failed runs and interrupted tools stay queryable.
87
87
  - Delegation: `delegated`, `delegation_protocol`, `caller_app`, `delegation_task_id`, `a2a_task_id`, `parent_run_id`, `parent_turn_id`. Agent Teams child runs use `delegation_protocol = 'agent-team'`, keep their own `run_id`, and link to the launching run through `parent_run_id`.
88
- - Errors: `status`, `error_message`/`$ai_error`.
88
+ - Errors: `status`, `$ai_error` (terminal code, cause, retryable, and a fixed code-derived message), `$ai_error_type`. Run failure messages are omitted from telemetry.
89
89
 
90
90
  ## Inline Charts In Chat
91
91
 
@@ -2,9 +2,9 @@
2
2
  name: onboarding-journeys
3
3
  description: >-
4
4
  Build the onboarding journey tree (signup to first output, with % splits,
5
- drop-off per step, and example replays) and render a screenshot per step. Use
6
- when asked for an onboarding storyboard, where new users drop off, or frames
7
- for each onboarding step.
5
+ last-observed-step counts, and example replays) and render a screenshot per
6
+ step. Use when asked for an onboarding storyboard, where users stop being
7
+ observed, or frames for each onboarding step.
8
8
  scope: dev
9
9
  ---
10
10
 
@@ -38,7 +38,9 @@ type JourneyTree = { window: { from: string; to: string }; app: string; rootN: n
38
38
  ```
39
39
 
40
40
  - Nodes come parents first. `key` is the path of step keys joined with ` > `;
41
- `pctOf*` are percents (0-100).
41
+ `pctOf*` are percents (0-100). `dropoffN` / `dropoffPct` count sessions
42
+ whose last observed step is this node; they do not establish that a user
43
+ exited.
42
44
  - `dropoffN` is sessions whose last observed step is that node. It is not a
43
45
  confirmed exit: a blocked tracker or an event outside the window reads the
44
46
  same. A node at `maxDepth` where `n - dropoffN - sum(children n)` is above
@@ -51,18 +53,30 @@ type JourneyTree = { window: { from: string; to: string }; app: string; rootN: n
51
53
  - An example with `recordingId: null` has no replay the caller can open, and
52
54
  `viewportReason` says why the viewport is unknown (`no_recording`,
53
55
  `not_captured` for recordings before viewport capture, `unreadable`).
56
+ - `offsetMs` is milliseconds from the recording's `startedAt`, not the first
57
+ rrweb event.
58
+ - `replayUrl` uses that same offset in `atMs`; the session page converts it to
59
+ the first-event-relative player clock after replay events load.
54
60
  - Test identities are always excluded; `emailFilter` defaults to
55
61
  `exclude_builder`, as in the onboarding metrics. A session with any excluded
56
62
  identity is dropped whole.
57
63
 
58
64
  ## Capture
59
65
 
60
- The CLI mints a two-hour tokenized replay link per recording with
61
- `create-session-replay-agent-link`, opens each recording once in headless
62
- Chromium at `/sessions/:id?frame=1&agent_access=...`, seeks to each `offsetMs`,
63
- and uses the Sessions screenshot compositor. It writes `<nodeKey>-<n>.png` and
64
- `manifest.json` with `frames`, `failures` (explicit, with a reason), and
65
- `skipped`. Fix failures or report them; do not paint over a missing frame.
66
+ The CLI mints a two-hour recording-scoped replay link with
67
+ `create-session-replay-agent-link`, reads the token-gated manifest and every
68
+ chunk, then renders each recording once with the local `@rrweb/replay` player
69
+ in headless Chromium. Each JourneyTree `offsetMs` is relative to the recording's
70
+ `startedAt`; the CLI maps `startedAt + offsetMs` to rrweb's first-event-relative
71
+ playhead for seeking, viewport, and route evaluation while preserving the
72
+ original offset in frame metadata. If the target precedes the first replay
73
+ event, report a frame failure instead of clamping the seek to zero. The CLI
74
+ uses a native browser screenshot so dialogs and other top-layer content remain
75
+ visible. The token and replay events stay in memory; the CLI writes only PNGs
76
+ and `manifest.json` with `frames`, `failures` (explicit, with a reason), and
77
+ `skipped`. Manifest chunk counts and ordering must be complete; the CLI reads
78
+ bounded batches only through the requested offsets and validates every fetched
79
+ chunk. Fix failures or report them; do not paint over a missing frame.
66
80
 
67
81
  Authenticate to the deployed app, never a local database: run
68
82
  `npx -y @agent-native/core@latest connect https://analytics.agent-native.com --client codex`
@@ -70,9 +84,12 @@ Authenticate to the deployed app, never a local database: run
70
84
  `--token` / set `AGENT_NATIVE_TOKEN`. `--app-url` overrides the app. Frame mode
71
85
  needs a deployment that includes `/sessions/:id?frame=1`.
72
86
 
73
- Frame mode renders without a login; the signed link is the only credential. It
74
- masks and scrubs exactly as the Sessions viewer does. Do not add viewport
75
- clamping or pointer projection to it (see `session-replay`).
87
+ Replay fetches use the recording-scoped token without app cookies or a referrer.
88
+ The capture browser stays offline while rendering untrusted replay DOM, so
89
+ remote images and fonts are not fetched. The output manifest marks this as
90
+ `remoteAssets: "not-fetched"`. Keep recorded URLs and CSS intact for rrweb
91
+ playback; network controls belong at the capture boundary. `--upload` stores
92
+ PNGs through the private upload action, which checks recording access again.
76
93
 
77
94
  Viewport comes from the recording's first rrweb Meta event, stored by replay
78
95
  ingest in `session_recordings.metadata.viewport` (`first` and `last`). Older
@@ -447,6 +447,16 @@ agent answers about browser recordings in the Analytics template.
447
447
  Vite/Netlify env vars on the recorded site.
448
448
  - Inputs are masked by default. Page text is visible unless marked with
449
449
  `.an-mask` or `data-an-mask`.
450
+ - UI rendering a run failure message or diagnostic details spreads
451
+ `SESSION_REPLAY_MASK_PROPS` from `@agent-native/core/client/session-replay-privacy` on
452
+ the message element, including expanded details and failed tool rows. Keep
453
+ headlines and recovery controls outside the mask. The `data-an-mask` marker
454
+ remains active when an app supplies its own `maskTextSelector`; selectors
455
+ extend this privacy baseline. Do not rely on name redaction for run errors.
456
+ Masking covers text only; the recorder keeps attributes, so leave `title` off
457
+ masked failure text. Wrap failed content that can render links or embedded
458
+ frames, such as an MCP App or a failed activity summary, in
459
+ `SESSION_REPLAY_BLOCK_PROPS`.
450
460
  - Use `.an-block`, `.an-ignore`, `data-an-block`, or `data-an-ignore` for
451
461
  sensitive zones that should not be captured.
452
462
  - A definitive upload `409` abandons only the conflicted replay identity and
@@ -33,7 +33,7 @@ const isoDate = z
33
33
 
34
34
  export default defineAction({
35
35
  description:
36
- 'Build the onboarding journey tree for a date window: per-session step sequences (signup, onboarding questions, setup method, app entry, first action, first output) folded into a prefix tree. format "tree" returns { window, app, rootN, coverage, nodes }: each node has n, pctOfRoot, pctOfParent, dropoffN/dropoffPct (sessions whose last observed step is that node, not a confirmed exit) and example sessions with recordingId, offsetMs to seek to, and the recording\'s viewport. format "summary" returns the same counts as an indented text outline with no examples. Check coverage.truncated first: true means counts are a partial sample or the node list was cut (see notes). Use it to plan onboarding storyboards or find where new users stop; feed the tree to the journey:capture CLI to render frames.',
36
+ 'Build the onboarding journey tree for a date window: per-session step sequences (signup, onboarding questions, setup method, app entry, first action, first output) folded into a prefix tree. format "tree" returns { window, app, rootN, coverage, nodes }: each node has n, pctOfRoot, pctOfParent, dropoffN/dropoffPct (sessions whose last observed step is that node, not a confirmed exit) and example sessions with recordingId, a recording-start-relative offsetMs to seek to, and the recording\'s viewport. format "summary" returns the same counts as an indented text outline with no examples. Check coverage.truncated first: true means counts are a partial sample or the node list was cut (see notes). Use it to plan onboarding storyboards or find where new users stop; feed the tree to the journey:capture CLI to render frames.',
37
37
  schema: z.object({
38
38
  dateFrom: isoDate.describe(
39
39
  "Inclusive UTC start date, YYYY-MM-DD. Sessions that began earlier appear mid-journey, so start a day before the period you care about.",
@@ -1568,6 +1568,8 @@ export default {
1568
1568
  replayPlayer: "Replay player",
1569
1569
  replayLoading: "Loading replay...",
1570
1570
  replayLoadingProgress: "{{loaded}} of {{total}} replay chunks loaded",
1571
+ replayTargetFallback:
1572
+ "Requested recording offset {{requested}} is unavailable; showing the nearest replay frame at {{available}}.",
1571
1573
  replayUnavailable: "No playable replay for this session",
1572
1574
  replayUnavailableDescription:
1573
1575
  "This recording has metadata, but no playable replay events were found.",
@@ -149,7 +149,7 @@ export function DashboardChartCard({
149
149
  if (
150
150
  target instanceof Element &&
151
151
  target.closest(
152
- "button, a, input, textarea, select, [role='menuitem'], [data-no-panel-chat-select]",
152
+ "button, a, input, textarea, select, [role='menuitem'], [role='menuitemradio'], [data-no-panel-chat-select]",
153
153
  )
154
154
  ) {
155
155
  return;
@@ -30,6 +30,7 @@ import {
30
30
  AlertDialogHeader,
31
31
  AlertDialogTitle,
32
32
  } from "@/components/ui/alert-dialog";
33
+ import { Badge } from "@/components/ui/badge";
33
34
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
34
35
  import {
35
36
  Dialog,
@@ -42,16 +43,14 @@ import {
42
43
  DropdownMenuContent,
43
44
  DropdownMenuItem,
44
45
  DropdownMenuLabel,
46
+ DropdownMenuRadioGroup,
47
+ DropdownMenuRadioItem,
45
48
  DropdownMenuSeparator,
49
+ DropdownMenuSub,
50
+ DropdownMenuSubContent,
51
+ DropdownMenuSubTrigger,
46
52
  DropdownMenuTrigger,
47
53
  } from "@/components/ui/dropdown-menu";
48
- import {
49
- Select,
50
- SelectContent,
51
- SelectItem,
52
- SelectTrigger,
53
- SelectValue,
54
- } from "@/components/ui/select";
55
54
  import {
56
55
  Tooltip,
57
56
  TooltipContent,
@@ -150,6 +149,9 @@ export function SqlChartCard({
150
149
  }: SqlChartCardProps) {
151
150
  const t = useT();
152
151
  const timeRange = timeRangeDays(filters?.timeRange);
152
+ const timeRangeOverrideLabel = timeRangeFilter?.options?.find(
153
+ (option) => option.value === timeRangeOverride,
154
+ )?.label;
153
155
  const exportToGoogleSheets = useActionMutation(
154
156
  "export-dashboard-panel-to-google-sheet",
155
157
  );
@@ -263,7 +265,7 @@ export function SqlChartCard({
263
265
  if (
264
266
  target instanceof Element &&
265
267
  target.closest(
266
- "button, a, input, textarea, select, [role='menuitem'], [data-no-panel-chat-select]",
268
+ "button, a, input, textarea, select, [role='menuitem'], [role='menuitemradio'], [data-no-panel-chat-select]",
267
269
  )
268
270
  ) {
269
271
  return;
@@ -606,44 +608,17 @@ export function SqlChartCard({
606
608
  <CardTitle className="text-sm font-medium flex-1 truncate">
607
609
  {panel.title}
608
610
  </CardTitle>
609
- {timeRangeFilter?.options?.length ? (
610
- <Tooltip>
611
- <TooltipTrigger asChild>
612
- <Select
613
- value={timeRangeOverride ?? INHERIT_TIME_RANGE}
614
- onValueChange={(value) =>
615
- onTimeRangeOverrideChange?.(
616
- value === INHERIT_TIME_RANGE ? null : value,
617
- )
618
- }
619
- >
620
- <SelectTrigger
621
- size="sm"
622
- className="h-6 w-[100px] text-xs"
623
- aria-label={t("sqlDashboard.chartTimeRangeOverride")}
624
- >
625
- <SelectValue />
626
- </SelectTrigger>
627
- <SelectContent align="end">
628
- <SelectItem value={INHERIT_TIME_RANGE} className="text-xs">
629
- {t("sqlDashboard.chartTimeRangeInherit")}
630
- </SelectItem>
631
- {timeRangeFilter.options.map((opt) => (
632
- <SelectItem
633
- key={opt.value}
634
- value={opt.value}
635
- className="text-xs"
636
- >
637
- {opt.label}
638
- </SelectItem>
639
- ))}
640
- </SelectContent>
641
- </Select>
642
- </TooltipTrigger>
643
- <TooltipContent>
644
- {t("sqlDashboard.chartTimeRangeOverride")}
645
- </TooltipContent>
646
- </Tooltip>
611
+ {timeRangeOverrideLabel ? (
612
+ <Badge
613
+ variant="secondary"
614
+ className="max-w-32 shrink-0 truncate px-1.5 py-0 text-[10px] font-normal"
615
+ title={timeRangeOverrideLabel}
616
+ >
617
+ <span className="sr-only">
618
+ {t("sqlDashboard.chartTimeRangeOverride")}{" "}
619
+ </span>
620
+ {timeRangeOverrideLabel}
621
+ </Badge>
647
622
  ) : null}
648
623
  <div className="flex items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100">
649
624
  {!editable || onSaveSql ? (
@@ -689,6 +664,35 @@ export function SqlChartCard({
689
664
  {t("sqlDashboard.chatWithPanel")}
690
665
  </DropdownMenuItem>
691
666
  <DropdownMenuSeparator />
667
+ {timeRangeFilter?.options?.length ? (
668
+ <DropdownMenuSub>
669
+ <DropdownMenuSubTrigger>
670
+ {timeRangeFilter.label}
671
+ </DropdownMenuSubTrigger>
672
+ <DropdownMenuSubContent className="w-52">
673
+ <DropdownMenuRadioGroup
674
+ value={timeRangeOverride ?? INHERIT_TIME_RANGE}
675
+ onValueChange={(value) =>
676
+ onTimeRangeOverrideChange?.(
677
+ value === INHERIT_TIME_RANGE ? null : value,
678
+ )
679
+ }
680
+ >
681
+ <DropdownMenuRadioItem value={INHERIT_TIME_RANGE}>
682
+ {t("sqlDashboard.chartTimeRangeInherit")}
683
+ </DropdownMenuRadioItem>
684
+ {timeRangeFilter.options.map((opt) => (
685
+ <DropdownMenuRadioItem
686
+ key={opt.value}
687
+ value={opt.value}
688
+ >
689
+ {opt.label}
690
+ </DropdownMenuRadioItem>
691
+ ))}
692
+ </DropdownMenuRadioGroup>
693
+ </DropdownMenuSubContent>
694
+ </DropdownMenuSub>
695
+ ) : null}
692
696
  <DropdownMenuItem onSelect={() => setExpanded(true)}>
693
697
  <IconMaximize className="h-4 w-4 mr-2" />
694
698
  {t("sqlDashboard.fullScreen")}
@@ -301,10 +301,22 @@ const PanelCell = memo(function PanelCell({
301
301
  const [timeRangeOverride, setTimeRangeOverride] = useState<string | null>(
302
302
  null,
303
303
  );
304
+ const validTimeRangeOverride = timeRangeFilter?.options?.some(
305
+ (option) => option.value === timeRangeOverride,
306
+ )
307
+ ? timeRangeOverride
308
+ : null;
309
+ useEffect(() => {
310
+ if (timeRangeOverride !== null && validTimeRangeOverride === null) {
311
+ setTimeRangeOverride(null);
312
+ }
313
+ }, [timeRangeOverride, validTimeRangeOverride]);
304
314
  const effectiveVars = useMemo(
305
315
  () =>
306
- timeRangeOverride ? { ...vars, timeRange: timeRangeOverride } : vars,
307
- [vars, timeRangeOverride],
316
+ validTimeRangeOverride
317
+ ? { ...vars, timeRange: validTimeRangeOverride }
318
+ : vars,
319
+ [vars, validTimeRangeOverride],
308
320
  );
309
321
  const resolved = useMemo(
310
322
  () =>
@@ -395,7 +407,7 @@ const PanelCell = memo(function PanelCell({
395
407
  }
396
408
  filters={effectiveVars}
397
409
  timeRangeFilter={timeRangeFilter}
398
- timeRangeOverride={timeRangeOverride}
410
+ timeRangeOverride={validTimeRangeOverride}
399
411
  onTimeRangeOverrideChange={setTimeRangeOverride}
400
412
  extensionContext={
401
413
  panel.chartType === "extension"