@agent-native/core 0.84.55 → 0.84.57

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 (111) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/docs/content/locales/ar-SA/template-analytics.mdx +2 -0
  4. package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +2 -0
  5. package/corpus/core/docs/content/locales/de-DE/template-analytics.mdx +2 -0
  6. package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +2 -0
  7. package/corpus/core/docs/content/locales/es-ES/template-analytics.mdx +2 -0
  8. package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +2 -0
  9. package/corpus/core/docs/content/locales/fr-FR/template-analytics.mdx +2 -0
  10. package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +2 -0
  11. package/corpus/core/docs/content/locales/hi-IN/template-analytics.mdx +2 -0
  12. package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +2 -0
  13. package/corpus/core/docs/content/locales/ja-JP/template-analytics.mdx +2 -0
  14. package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +2 -0
  15. package/corpus/core/docs/content/locales/ko-KR/template-analytics.mdx +2 -0
  16. package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +2 -0
  17. package/corpus/core/docs/content/locales/pt-BR/template-analytics.mdx +2 -0
  18. package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +2 -0
  19. package/corpus/core/docs/content/locales/zh-CN/template-analytics.mdx +2 -0
  20. package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +2 -0
  21. package/corpus/core/docs/content/locales/zh-TW/template-analytics.mdx +2 -0
  22. package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +2 -0
  23. package/corpus/core/docs/content/template-analytics.mdx +2 -0
  24. package/corpus/core/docs/content/template-clips.mdx +22 -10
  25. package/corpus/core/docs/content/tracking.mdx +2 -0
  26. package/corpus/core/package.json +1 -1
  27. package/corpus/core/src/cli/recap.ts +146 -5
  28. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +8 -0
  29. package/corpus/templates/analytics/AGENTS.md +5 -0
  30. package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +31 -0
  31. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  32. package/corpus/templates/analytics/app/i18n-data.ts +20 -0
  33. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +65 -3
  34. package/corpus/templates/analytics/changelog/2026-07-02-session-replays-can-be-copied-as-temporary-private-links-for-agents.md +6 -0
  35. package/corpus/templates/analytics/server/handlers/session-replay.ts +78 -0
  36. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +313 -0
  37. package/corpus/templates/analytics/server/lib/session-replay.ts +198 -3
  38. package/corpus/templates/analytics/server/routes/[...page].get.ts +104 -1
  39. package/corpus/templates/analytics/server/routes/api/session-replay/agent-context.json.get.ts +48 -0
  40. package/corpus/templates/analytics/server/routes/api/session-replay/agent-events.json.get.ts +63 -0
  41. package/corpus/templates/analytics/shared/session-replay-agent-access.ts +10 -0
  42. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +14 -8
  43. package/corpus/templates/clips/AGENTS.md +3 -2
  44. package/corpus/templates/clips/actions/create-recording-agent-link.ts +90 -0
  45. package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -46
  46. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +5 -3
  47. package/corpus/templates/clips/app/i18n/ar-SA.ts +1 -1
  48. package/corpus/templates/clips/app/i18n/de-DE.ts +1 -1
  49. package/corpus/templates/clips/app/i18n/en-US.ts +1 -1
  50. package/corpus/templates/clips/app/i18n/es-ES.ts +1 -1
  51. package/corpus/templates/clips/app/i18n/fr-FR.ts +1 -1
  52. package/corpus/templates/clips/app/i18n/hi-IN.ts +1 -1
  53. package/corpus/templates/clips/app/i18n/ja-JP.ts +1 -1
  54. package/corpus/templates/clips/app/i18n/ko-KR.ts +1 -1
  55. package/corpus/templates/clips/app/i18n/pt-BR.ts +1 -1
  56. package/corpus/templates/clips/app/i18n/zh-CN.ts +1 -1
  57. package/corpus/templates/clips/app/i18n/zh-TW.ts +1 -1
  58. package/corpus/templates/clips/app/routes/share.$shareId.tsx +100 -46
  59. package/corpus/templates/clips/changelog/2026-07-02-private-recordings-can-be-shared-with-agents-through-temporary-links-without-making-them-public.md +6 -0
  60. package/corpus/templates/clips/server/lib/public-agent-context.ts +26 -13
  61. package/corpus/templates/clips/server/routes/api/agent-context.json.get.ts +2 -1
  62. package/corpus/templates/clips/server/routes/api/agent-frame.jpg.get.ts +2 -1
  63. package/corpus/templates/clips/server/routes/api/agent-transcript.json.get.ts +2 -1
  64. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +7 -2
  65. package/corpus/templates/clips/shared/agent-context.ts +5 -0
  66. package/corpus/templates/plan/actions/create-visual-recap.ts +39 -0
  67. package/corpus/templates/plan/actions/list-visual-plans.ts +2 -0
  68. package/corpus/templates/plan/actions/view-screen.ts +2 -0
  69. package/corpus/templates/plan/app/pages/PlansPage.tsx +279 -114
  70. package/corpus/templates/plan/changelog/2026-07-02-plan-comment-shortcuts-now-open-comment-mode-from-the-keyboa.md +6 -0
  71. package/corpus/templates/plan/server/db/schema.ts +3 -0
  72. package/corpus/templates/plan/server/lib/comment-notifications.ts +21 -2
  73. package/corpus/templates/plan/server/plans.ts +6 -0
  74. package/corpus/templates/plan/server/plugins/db.ts +11 -0
  75. package/corpus/templates/plan/shared/comment-context.ts +1 -0
  76. package/corpus/templates/plan/shared/types.ts +4 -0
  77. package/dist/cli/recap.d.ts +14 -0
  78. package/dist/cli/recap.d.ts.map +1 -1
  79. package/dist/cli/recap.js +88 -5
  80. package/dist/cli/recap.js.map +1 -1
  81. package/dist/collab/awareness.d.ts +2 -2
  82. package/dist/collab/awareness.d.ts.map +1 -1
  83. package/dist/collab/routes.d.ts +1 -1
  84. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  85. package/dist/notifications/routes.d.ts +3 -3
  86. package/dist/observability/routes.d.ts +4 -4
  87. package/dist/server/transcribe-voice.d.ts +1 -1
  88. package/docs/content/locales/ar-SA/template-analytics.mdx +2 -0
  89. package/docs/content/locales/ar-SA/template-clips.mdx +2 -0
  90. package/docs/content/locales/de-DE/template-analytics.mdx +2 -0
  91. package/docs/content/locales/de-DE/template-clips.mdx +2 -0
  92. package/docs/content/locales/es-ES/template-analytics.mdx +2 -0
  93. package/docs/content/locales/es-ES/template-clips.mdx +2 -0
  94. package/docs/content/locales/fr-FR/template-analytics.mdx +2 -0
  95. package/docs/content/locales/fr-FR/template-clips.mdx +2 -0
  96. package/docs/content/locales/hi-IN/template-analytics.mdx +2 -0
  97. package/docs/content/locales/hi-IN/template-clips.mdx +2 -0
  98. package/docs/content/locales/ja-JP/template-analytics.mdx +2 -0
  99. package/docs/content/locales/ja-JP/template-clips.mdx +2 -0
  100. package/docs/content/locales/ko-KR/template-analytics.mdx +2 -0
  101. package/docs/content/locales/ko-KR/template-clips.mdx +2 -0
  102. package/docs/content/locales/pt-BR/template-analytics.mdx +2 -0
  103. package/docs/content/locales/pt-BR/template-clips.mdx +2 -0
  104. package/docs/content/locales/zh-CN/template-analytics.mdx +2 -0
  105. package/docs/content/locales/zh-CN/template-clips.mdx +2 -0
  106. package/docs/content/locales/zh-TW/template-analytics.mdx +2 -0
  107. package/docs/content/locales/zh-TW/template-clips.mdx +2 -0
  108. package/docs/content/template-analytics.mdx +2 -0
  109. package/docs/content/template-clips.mdx +22 -10
  110. package/docs/content/tracking.mdx +2 -0
  111. package/package.json +1 -1
package/corpus/README.md CHANGED
@@ -28,4 +28,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
  ## Generated Counts
29
29
 
30
30
  - core files: 2044
31
- - template files: 5003
31
+ - template files: 5012
@@ -1,5 +1,17 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.84.57
4
+
5
+ ### Patch Changes
6
+
7
+ - 5250e7f: Document temporary agent links for session replays and private clips.
8
+
9
+ ## 0.84.56
10
+
11
+ ### Patch Changes
12
+
13
+ - a0615f8: Make PR visual recap screenshots link directly to the interactive recap and publish source-author metadata for recap comments.
14
+
3
15
  ## 0.84.55
4
16
 
5
17
  ### Patch Changes
@@ -147,6 +147,8 @@ pnpm dev
147
147
 
148
148
  **سطح موصل واسع.** تأتي أحداث BigQuery وGA4 وتحليلات المنتج وCRM والدعم والمجتمع وGitHub/Jira وSEO وأحداث `/track` للطرف الأول من خلال actions التي يمكن للوكيل الاتصال بها.
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### العمل مع الوكيل
151
153
 
152
154
  يعرف الوكيل دائمًا ما تنظر إليه. يتم إدخال حالة الشاشة الحالية في كل رسالة ككتلة `<current-screen>` - فهي تحتوي على العرض النشط، ولوحة المعلومات المفتوحة أو التحليل، وأي عوامل تصفية محددة.
@@ -131,6 +131,8 @@ API، لذا فإن النماذج التي تقبل النص أو الصور ا
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | أجزاء النص ذات الطابع الزمني مع `startMs`، `endMs`، والطوابع الزمنية القابلة للقراءة، والنص، وتسميات المصدر الاختيارية |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | إطار JPEG مستخرج من الفيديو بطابع زمني للفيديو الأصلي |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  تتبع نقاط النهاية نفس القواعد العامة/كلمة المرور/انتهاء الصلاحية مثل صفحة المشاركة.
135
137
  تتطلب المقاطع المحمية بكلمة مرور كلمة المرور مرة واحدة؛ تعود الاستجابات الناجحة
136
138
  روابط رمزية قصيرة العمر بحيث لا يحتاج وكلاء المراحل النهائية إلى النص العادي
@@ -147,6 +147,8 @@ CLI gibt den lokalen Entwickler URL aus. Melden Sie sich bei Google an und öffn
147
147
 
148
148
  **Breite Konnektoroberfläche.** BigQuery, GA4, Produktanalyse, CRM, Support, Community, GitHub/Jira, SEO und Erstanbieter-`/track`-Ereignisse kommen alle über actions, das der Agent anrufen kann.
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### Zusammenarbeit mit dem Agenten
151
153
 
152
154
  Der Agent weiß immer, was Sie sehen. Der aktuelle Bildschirmstatus wird als `<current-screen>`-Block in jede Nachricht eingefügt – er enthält die aktive Ansicht, das geöffnete Dashboard oder die geöffnete Analyse und alle ausgewählten Filter.
@@ -131,6 +131,8 @@ Agent.
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | Transkriptsegmente mit Zeitstempel mit `startMs`, `endMs`, lesbaren Zeitstempeln, Text und optionalen Quellenbezeichnungen |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | Ein JPEG-Frame, der mit einem Originalvideo-Zeitstempel aus dem Video extrahiert wurde |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  Die Endpunkte folgen denselben öffentlichen/Passwort-/Ablaufregeln wie die Freigabeseite.
135
137
  Passwortgeschützte Clips erfordern das einmalige Passwort; Erfolgreiche Antworten werden zurückgegeben
136
138
  kurzlebige tokenisierte Links, sodass nachgeschaltete Agenten den Klartext nicht benötigen
@@ -147,6 +147,8 @@ El CLI imprime el desarrollador local URL. Inicia sesión con Google y luego abr
147
147
 
148
148
  **Amplia superficie de conector.** BigQuery, GA4, análisis de productos, CRM, soporte, comunidad, GitHub/Jira, SEO y eventos propios `/track` llegan a través de actions al que el agente puede llamar.
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### Trabajar con el agente
151
153
 
152
154
  El agente siempre sabe lo que estás mirando. El estado actual de la pantalla se inyecta en cada mensaje como un bloque `<current-screen>`: contiene la vista activa, el panel o análisis abierto y los filtros seleccionados.
@@ -131,6 +131,8 @@ agente.
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | Segmentos de transcripción con marca de tiempo con `startMs`, `endMs`, marcas de tiempo legibles, texto y etiquetas de origen opcionales |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | Un fotograma JPEG extraído del vídeo en una marca de tiempo del vídeo original |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  Los puntos finales siguen las mismas reglas de público/contraseña/caducidad que la página para compartir.
135
137
  Los clips protegidos con contraseña requieren la contraseña una vez; regresan respuestas exitosas
136
138
  Enlaces tokenizados de corta duración para que los agentes posteriores no necesiten el texto sin formato
@@ -147,6 +147,8 @@ Le CLI imprime le développement local URL. Connectez-vous avec Google, puis ouv
147
147
 
148
148
  **Large surface de connecteur.** Les événements BigQuery, GA4, analyses de produits, CRM, support, communauté, GitHub/Jira, SEO et `/track` propriétaires passent tous par actions que l'agent peut appeler.
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### Travailler avec l'agent
151
153
 
152
154
  L'agent sait toujours ce que vous regardez. L'état actuel de l'écran est injecté dans chaque message sous forme de bloc `<current-screen>` : il contient la vue active, le tableau de bord ou l'analyse ouvert et tous les filtres sélectionnés.
@@ -131,6 +131,8 @@ agent.
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | Segments de transcription horodatés avec `startMs`, `endMs`, horodatages lisibles, texte et étiquettes de source facultatives |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | Une image JPEG extraite de la vidéo avec un horodatage de la vidéo d'origine |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  Les points de terminaison suivent les mêmes règles de public/mot de passe/expiration que la page de partage.
135
137
  Les clips protégés par mot de passe nécessitent le mot de passe une seule fois ; les réponses positives reviennent
136
138
  Liens tokenisés de courte durée afin que les agents en aval n'aient pas besoin du texte brut
@@ -147,6 +147,8 @@ CLI स्थानीय डेव URL प्रिंट करता है
147
147
 
148
148
  **व्यापक कनेक्टर सतह।** BigQuery, GA4, उत्पाद विश्लेषण, CRM, समर्थन, समुदाय, GitHub/Jira, SEO, और प्रथम-पक्ष `/track` इवेंट सभी actions के माध्यम से आते हैं जिन्हें एजेंट कॉल कर सकता है।
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### एजेंट के साथ काम करना
151
153
 
152
154
  एजेंट को हमेशा पता होता है कि आप क्या देख रहे हैं। वर्तमान स्क्रीन स्थिति को प्रत्येक संदेश में `<current-screen>` ब्लॉक के रूप में इंजेक्ट किया जाता है - इसमें सक्रिय दृश्य, खुला डैशबोर्ड या विश्लेषण और कोई भी चयनित फ़िल्टर शामिल होता है।
@@ -131,6 +131,8 @@ APIs, इसलिए मॉडल जो केवल पाठ या स्
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | `startMs`, `endMs`, पठनीय टाइमस्टैम्प, टेक्स्ट और वैकल्पिक स्रोत लेबल के साथ टाइमस्टैम्प्ड ट्रांसक्रिप्ट सेगमेंट |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | मूल-वीडियो टाइमस्टैम्प पर वीडियो से निकाला गया एक JPEG फ्रेम |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  एंडपॉइंट शेयर पेज के समान सार्वजनिक/पासवर्ड/समाप्ति नियमों का पालन करते हैं।
135
137
  पासवर्ड-सुरक्षित क्लिप को एक बार पासवर्ड की आवश्यकता होती है; सफल प्रत्युत्तर वापस आते हैं
136
138
  अल्पकालिक टोकनयुक्त लिंक ताकि डाउनस्ट्रीम एजेंटों को प्लेनटेक्स्ट की आवश्यकता न हो
@@ -147,6 +147,8 @@ CLI はローカル開発 URL を出力します。 Google でログインし、
147
147
 
148
148
  **幅広いコネクタ サーフェス。** BigQuery、GA4、製品分析、CRM、サポート、コミュニティ、GitHub/Jira、SEO、ファーストパーティ `/track` イベントはすべて、エージェントが呼び出すことができる actions 経由で行われます。
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### エージェントとの連携
151
153
 
152
154
  エージェントは、あなたが何を見ているのかを常に知っています。現在の画面状態は、`<current-screen>` ブロックとしてすべてのメッセージに挿入されます。これには、アクティブなビュー、開いているダッシュボードまたは分析、選択したフィルターが含まれます。
@@ -131,6 +131,8 @@ API なので、テキストまたは静止画像のみを受け入れるモデ
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | `startMs`、`endMs`、読み取り可能なタイムスタンプ、テキスト、およびオプションのソース ラベルを含むタイムスタンプ付きトランスクリプト セグメント |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | 元のビデオのタイムスタンプでビデオから抽出された JPEG フレーム |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  エンドポイントは、共有ページと同じパブリック/パスワード/有効期限ルールに従います。
135
137
  パスワードで保護されたクリップでは、パスワードが 1 回必要になります。成功した応答が返されます
136
138
  トークン化されたリンクは有効期間が短いため、ダウンストリーム エージェントはプレーンテキストを必要としません
@@ -147,6 +147,8 @@ CLI는 로컬 개발자 URL를 인쇄합니다. Google에 로그인한 다음 **
147
147
 
148
148
  **광범위한 커넥터 표면.** BigQuery, GA4, 제품 분석, CRM, 지원, 커뮤니티, GitHub/Jira, SEO 및 자사 `/track` 이벤트는 모두 에이전트가 호출할 수 있는 actions를 통해 제공됩니다.
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### 에이전트와 협력하기
151
153
 
152
154
  에이전트는 항상 귀하가 무엇을 보고 있는지 알고 있습니다. 현재 화면 상태는 모든 메시지에 `<current-screen>` 블록으로 삽입됩니다. 여기에는 활성 보기, 열려 있는 대시보드 또는 분석, 선택한 필터가 포함됩니다.
@@ -131,6 +131,8 @@ API, 텍스트나 정지 이미지만 허용하는 모델도 여전히 무엇을
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | `startMs`, `endMs`, 읽을 수 있는 타임스탬프, 텍스트 및 선택적 소스 라벨이 포함된 타임스탬프 기록 세그먼트 |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | 원본 비디오 타임스탬프의 비디오에서 추출된 JPEG 프레임 |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  엔드포인트는 공유 페이지와 동일한 공개/비밀번호/만료 규칙을 따릅니다.
135
137
  비밀번호로 보호된 클립에는 비밀번호가 한 번만 필요합니다. 성공적인 응답 반환
136
138
  다운스트림 에이전트에 일반 텍스트가 필요하지 않도록 단기 토큰화된 링크
@@ -147,6 +147,8 @@ O CLI imprime o dev local URL. Faça login com o Google e abra a página **Fonte
147
147
 
148
148
  **Superfície de conector ampla.** BigQuery, GA4, análise de produto, CRM, suporte, comunidade, GitHub/Jira, SEO e eventos `/track` primários, todos vêm por meio do actions que o agente pode ligar.
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### Trabalhando com o agente
151
153
 
152
154
  O agente sempre sabe o que você está vendo. O estado atual da tela é injetado em cada mensagem como um bloco `<current-screen>` — ele contém a visualização ativa, o painel ou análise aberta e quaisquer filtros selecionados.
@@ -131,6 +131,8 @@ agente.
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | Segmentos de transcrição com carimbo de data e hora com `startMs`, `endMs`, carimbos de data e hora legíveis, texto e rótulos de origem opcionais |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | Um quadro JPEG extraído do vídeo em um carimbo de data/hora do vídeo original |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  Os endpoints seguem as mesmas regras de público/senha/expiração da página de compartilhamento.
135
137
  Clipes protegidos por senha exigem a senha uma vez; retorno de respostas bem-sucedidas
136
138
  links tokenizados de curta duração para que os agentes downstream não precisem do texto simples
@@ -147,6 +147,8 @@ CLI 打印本地开发 URL。使用 Google 登录,然后打开 **数据源**
147
147
 
148
148
  **广泛的连接器表面。** BigQuery、GA4、产品分析、CRM、支持、社区、GitHub/Jira、SEO 和第一方 `/track` 事件均来自代理可以调用的 actions。
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### 与代理合作
151
153
 
152
154
  代理始终知道您在看什么。当前屏幕状态作为 `<current-screen>` 块注入到每条消息中 - 它包含活动视图、打开的仪表板或分析以及任何选定的过滤器。
@@ -131,6 +131,8 @@ APIs,因此仅接受文本或静态图像的模型仍然可以理解内容
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | 带有 `startMs`、`endMs`、可读时间戳、文本和可选源标签的时间戳转录片段 |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | 以原始视频时间戳从视频中提取的 JPEG 帧 |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  端点遵循与共享页面相同的公共/密码/过期规则。
135
137
  受密码保护的剪辑需要密码一次;成功响应返回
136
138
  短暂的标记化链接,因此下游代理不需要明文
@@ -147,6 +147,8 @@ CLI 列印本機開發 URL。使用 Google 登入,然後開啟 **資料來源*
147
147
 
148
148
  **廣泛的連線器表面。** BigQuery、GA4、產品分析、CRM、支援、社群、GitHub/Jira、SEO 和第一方 `/track` 事件均來自代理可以呼叫的 actions。
149
149
 
150
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
151
+
150
152
  ### 與代理合作
151
153
 
152
154
  代理始終知道您在看什麼。目前螢幕狀態作為 `<current-screen>` 塊注入到每條訊息中 - 它包含活動檢視、開啟的儀表板或分析以及任何選定的過濾器。
@@ -131,6 +131,8 @@ APIs,因此僅接受文字或靜態圖片的模型仍然可以理解內容
131
131
  | `/api/agent-transcript.json?id=<recordingId>` | 帶有 `startMs`、`endMs`、可讀時間戳、文字和可選來源標籤的時間戳轉錄片段 |
132
132
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | 以原始影片時間戳從影片中擷取的 JPEG 幀 |
133
133
 
134
+ Temporary private agent links are also supported: the Share dialog can mint a two-hour `agent_access` URL for any recording the viewer can access. Agents use that token with the share page and JSON APIs, and the clip does not become public.
135
+
134
136
  端點遵循與共用頁面相同的公開/密碼/過期規則。
135
137
  受密碼保護的剪輯需要密碼一次;成功回應返回
136
138
  短暫的標記化連結,因此下游代理不需要明文
@@ -152,6 +152,8 @@ The CLI prints the local dev URL. Sign in with Google, then open the **Data Sour
152
152
 
153
153
  **Broad connector surface.** BigQuery, GA4, product analytics, CRM, support, community, GitHub/Jira, SEO, and first-party `/track` events all come through actions the agent can call.
154
154
 
155
+ **Session replay agent handoff.** Session recordings stay private, but the session detail page can mint a temporary **Copy for agent** link. The two-hour `agent_access` URL lets an external agent read replay summaries, timelines, and bounded event details without exposing blob/provider URLs or making the recording public.
156
+
155
157
  ### Working with the agent
156
158
 
157
159
  The agent always knows what you're looking at. The current screen state is injected into every message as a `<current-screen>` block — it contains the active view, the open dashboard or analysis, and any selected filters.
@@ -17,7 +17,7 @@ A capture-everything app: screen recordings, meeting notes from your calendar, a
17
17
  />
18
18
  </WireframeBlock>
19
19
 
20
- Think along the lines of Loom + Granola + Wispr Flow rolled into one app — but the agent is a first-class editor across every surface, and the recordings, meetings, and dictations are yours, not a SaaS vendor's. Clips also makes shared recordings agent-readable: paste a normal Clips share link into an agent and it can "hear" the transcript as text and "see" timestamped screen frames as images — no raw video needed. Frame-viewing works in any image-capable agent (ChatGPT, Claude Code, Cursor, Codex); text-only web chats still get the full transcript and can take a frame you upload.
20
+ Think along the lines of Loom + Granola + Wispr Flow rolled into one app — but the agent is a first-class editor across every surface, and the recordings, meetings, and dictations are yours, not a SaaS vendor's. Clips also makes shared recordings agent-readable: paste a public Clips share link or a temporary **Copy for agent** link into an agent and it can "hear" the transcript as text and "see" timestamped screen frames as images — no raw video needed. Frame-viewing works in any image-capable agent (ChatGPT, Claude Code, Cursor, Codex); text-only web chats still get the full transcript and can take a frame you upload.
21
21
 
22
22
  <Diagram id="doc-block-pqnd4p" title="Capture, transcribe, reuse" summary={"Three capture types land in one library; the agent transcribes, titles, and summarizes, then every transcript is searchable and shareable."}>
23
23
 
@@ -87,7 +87,7 @@ Think along the lines of Loom + Granola + Wispr Flow rolled into one app — but
87
87
  - **Capture browser logs with the Chrome extension.** Browser recordings can
88
88
  attach redacted console logs and fetch/XHR metadata, which is helpful for
89
89
  product bugs and browser-only repros.
90
- - **Paste Clips links into agents** so they can discover the agent-readable context: metadata, transcript segments, recommended frames, and timestamped frame images without receiving the raw video file.
90
+ - **Paste Clips links into agents** so they can discover the agent-readable context: metadata, transcript segments, recommended frames, and timestamped frame images without receiving the raw video file. Private clips use a temporary scoped link instead of changing visibility.
91
91
  - **Smart library views.** Group by project, filter by speaker, auto-tag based on content.
92
92
  - **Edit the transcript through chat.** "Fix the mis-transcribed word at 1:42." "Pull three quotes for a blog post." The agent edits the transcript and the UI updates live.
93
93
 
@@ -158,10 +158,14 @@ directly to anonymous users.
158
158
 
159
159
  ## Agent-readable clips
160
160
 
161
- Paste a normal public Clips share link into an agent. The share page advertises
162
- a compact agent context URL, and that context points to the transcript and frame
163
- APIs, so models that only accept text or still images can still understand what
164
- happened in the recording.
161
+ Paste a public Clips share link into an agent, or use **Share → Copy** in the
162
+ **Share with agents** row to mint a temporary private agent link. Private,
163
+ organization, and passworded clips do not need to become public: the copied URL
164
+ carries a recording-scoped `agent_access` token that expires after two hours.
165
+
166
+ The share page advertises a compact agent context URL, and that context points
167
+ to the transcript and frame APIs, so models that only accept text or still
168
+ images can still understand what happened in the recording.
165
169
 
166
170
  Any agent that can fetch an image URL into its vision — ChatGPT, Claude Code,
167
171
  Cursor, Codex, and MCP-connected agents — reads the transcript and sees the
@@ -175,7 +179,8 @@ agent.
175
179
  | `/api/agent-transcript.json?id=<recordingId>` | Timestamped transcript segments with `startMs`, `endMs`, readable timestamps, text, and optional source labels |
176
180
  | `/api/agent-frame.jpg?id=<recordingId>&atMs=<ms>` | A JPEG frame extracted from the video at an original-video timestamp |
177
181
 
178
- The endpoints follow the same public/password/expiry rules as the share page.
182
+ The endpoints follow the same public/password/expiry rules as the share page,
183
+ or accept the scoped `agent_access` token from a temporary agent link.
179
184
  Password-protected clips require the password once; successful responses return
180
185
  short-lived tokenized links so downstream agents do not need the plaintext
181
186
  password.
@@ -194,13 +199,20 @@ only returns a playable Slack `video` block for ready, public clips without a
194
199
  password, expiry hit, archive marker, or trash marker. Other clips still get the
195
200
  normal share-page title/thumbnail metadata and require opening Clips.
196
201
 
197
- <Endpoint id="doc-block-6q76u0" title="Agent context entry point" method="GET" path="/api/agent-context.json" summary="Compact, agent-readable description of a shared clip" auth="Same public / password / expiry rules as the share page" params={[
202
+ <Endpoint id="doc-block-6q76u0" title="Agent context entry point" method="GET" path="/api/agent-context.json" summary="Compact, agent-readable description of a shared clip" auth="Same public / password / expiry rules as the share page, or a scoped agent_access token" params={[
198
203
  {
199
204
  "name": "id",
200
205
  "in": "query",
201
206
  "type": "string",
202
207
  "required": true,
203
208
  "description": "Recording id"
209
+ },
210
+ {
211
+ "name": "agent_access",
212
+ "in": "query",
213
+ "type": "string",
214
+ "required": false,
215
+ "description": "Temporary token from Copy for agent links"
204
216
  }
205
217
  ]} responses={[
206
218
  {
@@ -209,7 +221,7 @@ normal share-page title/thumbnail metadata and require opening Clips.
209
221
  }
210
222
  ]}>
211
223
 
212
- Returns clip metadata, transcript status, chapters, CTAs, recommended frames, and links to the transcript and frame APIs. Advertised by the public share page so a text- or image-only agent can understand a recording without ingesting raw video.
224
+ Returns clip metadata, transcript status, chapters, CTAs, recommended frames, and links to the transcript and frame APIs. Advertised by public share pages and temporary private agent links so a text- or image-only agent can understand a recording without ingesting raw video.
213
225
 
214
226
  </Endpoint>
215
227
 
@@ -358,7 +370,7 @@ tray app at `http://localhost:8094`.
358
370
 
359
371
  **Non-destructive editing.** Trim, split, filler-word removal, silence removal, and stitching stay in `edits_json` so original media remains intact.
360
372
 
361
- **Agent-readable share links.** Public share links expose transcript and frame APIs so agents can understand recordings without ingesting raw video.
373
+ **Agent-readable share links.** Public share links and temporary private agent links expose transcript and frame APIs so agents can understand recordings without ingesting raw video.
362
374
 
363
375
  **Slack playable unfurls.** Public share links can render a Slack `video` block
364
376
  that points at the existing `/embed/:id` player. This is a workspace Slack app
@@ -237,6 +237,8 @@ Privacy defaults are intentionally conservative but still useful for playback:
237
237
 
238
238
  The Analytics template stores replay metadata in SQL (`session_recordings`) and stores chunks through private blob refs (`session_replay_chunks`). Browsers and agents never receive provider URLs. Playback goes through scoped server routes and the default agent tools return summaries or bounded replay events, not raw chunk table access.
239
239
 
240
+ When you need to hand a private recording to an external agent, use the session detail page's **Copy for agent** control. It mints a two-hour, recording-scoped `agent_access` link, SSRs a small discovery payload on `/sessions/:recordingId`, and exposes only the agent context/events JSON APIs. The recording's visibility does not change.
241
+
240
242
  For local development only, Analytics can fall back to capped SQL inline chunks when private blob storage is unavailable. Production deployments should configure private or encrypted blob storage rather than relying on Postgres for replay payloads.
241
243
 
242
244
  ## Advanced: custom providers & internals {#advanced}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.84.55",
3
+ "version": "0.84.57",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -1634,6 +1634,20 @@ type GitHubComment = {
1634
1634
 
1635
1635
  type GitHubPullRequest = {
1636
1636
  head?: { sha?: string | null } | null;
1637
+ user?: { login?: string | null; type?: string | null } | null;
1638
+ };
1639
+
1640
+ type GitHubUserProfile = {
1641
+ login?: string | null;
1642
+ name?: string | null;
1643
+ email?: string | null;
1644
+ };
1645
+
1646
+ type GitHubPullRequestCommit = {
1647
+ author?: { login?: string | null } | null;
1648
+ commit?: {
1649
+ author?: { name?: string | null; email?: string | null } | null;
1650
+ } | null;
1637
1651
  };
1638
1652
 
1639
1653
  function repoParts(repoFullName: string): { owner: string; repo: string } {
@@ -1642,6 +1656,20 @@ function repoParts(repoFullName: string): { owner: string; repo: string } {
1642
1656
  return { owner, repo };
1643
1657
  }
1644
1658
 
1659
+ function nonEmptyTrimmed(value: string | null | undefined): string | undefined {
1660
+ const trimmed = value?.trim();
1661
+ return trimmed || undefined;
1662
+ }
1663
+
1664
+ function normalizeSourceAuthorEmail(
1665
+ email: string | null | undefined,
1666
+ ): string | undefined {
1667
+ const trimmed = email?.trim().toLowerCase();
1668
+ if (!trimmed || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed)) return undefined;
1669
+ if (trimmed.endsWith("@users.noreply.github.com")) return undefined;
1670
+ return trimmed;
1671
+ }
1672
+
1645
1673
  async function githubRequest<T>(
1646
1674
  token: string,
1647
1675
  apiPath: string,
@@ -1667,6 +1695,71 @@ async function githubRequest<T>(
1667
1695
  return (await res.json()) as T;
1668
1696
  }
1669
1697
 
1698
+ export async function resolveGitHubPullRequestAuthor(input: {
1699
+ token: string;
1700
+ repo: string;
1701
+ pr: string;
1702
+ fetchFn?: typeof fetch;
1703
+ }): Promise<{
1704
+ email?: string;
1705
+ name?: string;
1706
+ login?: string;
1707
+ }> {
1708
+ const fn = input.fetchFn ?? fetch;
1709
+ const { owner, repo } = repoParts(input.repo);
1710
+ const pr = await githubRequest<GitHubPullRequest>(
1711
+ input.token,
1712
+ `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(
1713
+ repo,
1714
+ )}/pulls/${encodeURIComponent(input.pr)}`,
1715
+ {},
1716
+ fn,
1717
+ );
1718
+ const login = nonEmptyTrimmed(pr.user?.login);
1719
+ const profile = login
1720
+ ? await githubRequest<GitHubUserProfile>(
1721
+ input.token,
1722
+ `/users/${encodeURIComponent(login)}`,
1723
+ {},
1724
+ fn,
1725
+ ).catch(() => null)
1726
+ : null;
1727
+ const profileEmail = normalizeSourceAuthorEmail(profile?.email);
1728
+ const profileName = nonEmptyTrimmed(profile?.name);
1729
+ let commitEmail: string | undefined;
1730
+ let commitName: string | undefined;
1731
+ if (!profileEmail) {
1732
+ const commits = await githubRequest<GitHubPullRequestCommit[]>(
1733
+ input.token,
1734
+ `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(
1735
+ repo,
1736
+ )}/pulls/${encodeURIComponent(input.pr)}/commits?per_page=100`,
1737
+ {},
1738
+ fn,
1739
+ ).catch(() => []);
1740
+ for (const commit of commits) {
1741
+ const commitLogin = nonEmptyTrimmed(commit.author?.login);
1742
+ if (
1743
+ login &&
1744
+ commitLogin &&
1745
+ commitLogin.toLowerCase() !== login.toLowerCase()
1746
+ ) {
1747
+ continue;
1748
+ }
1749
+ const email = normalizeSourceAuthorEmail(commit.commit?.author?.email);
1750
+ if (!email) continue;
1751
+ commitEmail = email;
1752
+ commitName = nonEmptyTrimmed(commit.commit?.author?.name);
1753
+ break;
1754
+ }
1755
+ }
1756
+ return {
1757
+ email: profileEmail ?? commitEmail,
1758
+ name: profileName ?? commitName ?? login,
1759
+ login,
1760
+ };
1761
+ }
1762
+
1670
1763
  export async function isPullRequestHeadCurrent(input: {
1671
1764
  token: string;
1672
1765
  owner: string;
@@ -1995,14 +2088,15 @@ export function buildCommentBody(env: NodeJS.ProcessEnv = process.env): string {
1995
2088
 
1996
2089
  lines.push(`Here's a [visual recap](${safeUrl}) of what changed:`);
1997
2090
  lines.push("");
1998
- lines.push(`<picture>`);
2091
+ const pictureParts = [`<picture>`];
1999
2092
  if (lightImageUrl && darkImageUrl) {
2000
- lines.push(
2093
+ pictureParts.push(
2001
2094
  ` <source media="(prefers-color-scheme: dark)" srcset="${darkImageUrl}">`,
2002
2095
  );
2003
2096
  }
2004
- lines.push(` <img alt="Visual recap" src="${fallbackImageUrl}">`);
2005
- lines.push(`</picture>`);
2097
+ pictureParts.push(` <img alt="Visual recap" src="${fallbackImageUrl}">`);
2098
+ pictureParts.push(`</picture>`);
2099
+ lines.push(`<a href="${safeUrl}">${pictureParts.join("")}</a>`);
2006
2100
  lines.push("");
2007
2101
  lines.push(`**Open the [full interactive recap](${safeUrl})**`);
2008
2102
  if (env.DIFF_HUGE === "true") {
@@ -2297,6 +2391,7 @@ function recapPublishIdempotencyKey(input: {
2297
2391
  export async function publishRecapSource(input: {
2298
2392
  appUrl: string;
2299
2393
  token: string;
2394
+ githubToken?: string;
2300
2395
  sourcePath?: string;
2301
2396
  out?: string;
2302
2397
  prevPlanId?: string;
@@ -2308,6 +2403,9 @@ export async function publishRecapSource(input: {
2308
2403
  sourcePrNumber?: string;
2309
2404
  sourcePrState?: string;
2310
2405
  sourcePrMergedAt?: string;
2406
+ sourceAuthorEmail?: string;
2407
+ sourceAuthorName?: string;
2408
+ sourceAuthorLogin?: string;
2311
2409
  fetchFn?: typeof fetch;
2312
2410
  cwd?: string;
2313
2411
  }): Promise<{ ok: true; url: string; out: string }> {
@@ -2330,6 +2428,34 @@ export async function publishRecapSource(input: {
2330
2428
  (sourceRepo && sourcePrNumber ? "pull-request" : undefined);
2331
2429
  const sourcePrState =
2332
2430
  input.sourcePrState ?? (input.sourcePrMergedAt ? "merged" : undefined);
2431
+ const explicitSourceAuthor = {
2432
+ email: normalizeSourceAuthorEmail(input.sourceAuthorEmail),
2433
+ name: nonEmptyTrimmed(input.sourceAuthorName),
2434
+ login: nonEmptyTrimmed(input.sourceAuthorLogin),
2435
+ };
2436
+ let resolvedSourceAuthor:
2437
+ | Awaited<ReturnType<typeof resolveGitHubPullRequestAuthor>>
2438
+ | undefined;
2439
+ if (
2440
+ input.githubToken &&
2441
+ sourceRepo &&
2442
+ sourcePrNumber &&
2443
+ (!explicitSourceAuthor.email ||
2444
+ !explicitSourceAuthor.name ||
2445
+ !explicitSourceAuthor.login)
2446
+ ) {
2447
+ resolvedSourceAuthor = await resolveGitHubPullRequestAuthor({
2448
+ token: input.githubToken,
2449
+ repo: sourceRepo,
2450
+ pr: sourcePrNumber,
2451
+ fetchFn: input.fetchFn,
2452
+ }).catch(() => undefined);
2453
+ }
2454
+ const sourceAuthor = {
2455
+ email: explicitSourceAuthor.email ?? resolvedSourceAuthor?.email,
2456
+ name: explicitSourceAuthor.name ?? resolvedSourceAuthor?.name,
2457
+ login: explicitSourceAuthor.login ?? resolvedSourceAuthor?.login,
2458
+ };
2333
2459
  const idempotencyKey = recapPublishIdempotencyKey({
2334
2460
  prevPlanId: input.prevPlanId,
2335
2461
  repo: input.repo,
@@ -2353,6 +2479,9 @@ export async function publishRecapSource(input: {
2353
2479
  ...(input.sourcePrMergedAt
2354
2480
  ? { sourcePrMergedAt: input.sourcePrMergedAt }
2355
2481
  : {}),
2482
+ ...(sourceAuthor.email ? { sourceAuthorEmail: sourceAuthor.email } : {}),
2483
+ ...(sourceAuthor.name ? { sourceAuthorName: sourceAuthor.name } : {}),
2484
+ ...(sourceAuthor.login ? { sourceAuthorLogin: sourceAuthor.login } : {}),
2356
2485
  currentFocus: "visual recap review",
2357
2486
  status: "review",
2358
2487
  mdx: source.mdx,
@@ -2470,6 +2599,10 @@ async function runPublish(
2470
2599
  const result = await publishRecapSource({
2471
2600
  appUrl,
2472
2601
  token,
2602
+ githubToken:
2603
+ optionalArg(args, "github-token") ??
2604
+ process.env.GH_TOKEN ??
2605
+ process.env.GITHUB_TOKEN,
2473
2606
  sourcePath: optionalArg(args, "source") ?? RECAP_SOURCE_FILENAME,
2474
2607
  out,
2475
2608
  prevPlanId: optionalArg(args, "prev-plan-id"),
@@ -2481,6 +2614,14 @@ async function runPublish(
2481
2614
  sourcePrNumber: optionalArg(args, "source-pr-number"),
2482
2615
  sourcePrState: optionalArg(args, "source-pr-state"),
2483
2616
  sourcePrMergedAt: optionalArg(args, "source-pr-merged-at"),
2617
+ sourceAuthorEmail:
2618
+ optionalArg(args, "source-author-email") ?? process.env.PR_AUTHOR_EMAIL,
2619
+ sourceAuthorName:
2620
+ optionalArg(args, "source-author-name") ?? process.env.PR_AUTHOR_NAME,
2621
+ sourceAuthorLogin:
2622
+ optionalArg(args, "source-author-login") ??
2623
+ process.env.PR_AUTHOR_LOGIN ??
2624
+ process.env.GITHUB_ACTOR,
2484
2625
  });
2485
2626
  writeGitHubOutput("ok", "true");
2486
2627
  writeGitHubOutput("plan_url", result.url);
@@ -4081,7 +4222,7 @@ Usage:
4081
4222
  npx @agent-native/core@latest recap block-reference [--app-url <url>] [--out recap-blocks.md]
4082
4223
  npx @agent-native/core@latest recap scan --diff <path> [--mode off|high-confidence|strict]
4083
4224
  npx @agent-native/core@latest recap build-prompt --pr <n> [--repo owner/name] [--head <sha>] [--app-url <url>] [--diff <path>] [--stat <path>] [--block-reference recap-blocks.md] [--prev-plan-id <id>] [--huge] [--local-files] [--local-dir <folder>] [--skill-source auto|latest|repo] [--out <path>]
4084
- npx @agent-native/core@latest recap publish [--source recap-source.json] [--out recap-url.txt] [--repo owner/name] [--pr <n>] [--prev-plan-id <id>] [--source-pr-state open|closed|merged] [--source-pr-merged-at <iso>] [--app-url <url>] [--token <planToken>]
4225
+ npx @agent-native/core@latest recap publish [--source recap-source.json] [--out recap-url.txt] [--repo owner/name] [--pr <n>] [--prev-plan-id <id>] [--source-pr-state open|closed|merged] [--source-pr-merged-at <iso>] [--source-author-email <email>] [--source-author-name <name>] [--source-author-login <login>] [--app-url <url>] [--token <planToken>] [--github-token <ghToken>]
4085
4226
  npx @agent-native/core@latest recap shot --url <planUrl> [--token <planToken>] [--app-url <url>] [--out recap.png] [--theme light|dark] [--image-cache-key <key>]
4086
4227
  npx @agent-native/core@latest recap usage --plan-url <planUrl> --result-file <path> --app-url <url> --token <planToken> [--agent claude|codex] [--model <id>]
4087
4228
  npx @agent-native/core@latest recap agent-summary --result-file <path> [--stderr-file <path>] [--exit-code-file <path>] [--agent claude|codex]
@@ -28,6 +28,14 @@ agent answers about browser recordings in the Analytics template.
28
28
  `session-recording` access before reading private blob refs.
29
29
  - SQL inline chunks are a local/dev fallback only; production should use
30
30
  private or encrypted blob storage.
31
+ - When sharing a replay with an external agent, use
32
+ `create-session-replay-agent-link`. It mints a two-hour `agent_access` URL
33
+ scoped to the recording, embeds a small SSR discovery payload on
34
+ `/sessions/:recordingId`, and advertises
35
+ `/api/session-replay/agent-context.json` plus bounded
36
+ `/api/session-replay/agent-events.json` reads.
37
+ - Do not make session recordings public just so an agent can inspect them.
38
+ Tokenized agent links are the intended handoff path.
31
39
 
32
40
  ## Capture Defaults
33
41
 
@@ -148,6 +148,11 @@ details live in `.agents/skills/`.
148
148
  `get-session-replay-summary` and fetches rrweb payloads only through scoped
149
149
  chunk routes. Do not expose storage/provider URLs, raw chunk table access, or
150
150
  unscoped replay blobs in UI, actions, dashboards, docs, or prompts.
151
+ - The session detail page can mint a temporary `Copy for agent` link through
152
+ `create-session-replay-agent-link`. That URL carries an `agent_access` token
153
+ scoped to one recording for two hours; SSR embeds an agent discovery payload
154
+ and the JSON APIs expose only summary/timeline metadata plus bounded event
155
+ reads.
151
156
  - Dashboard rows that include `recording_id` should link to
152
157
  `/sessions/:recordingId`; rows that only include `session_id` can link to a
153
158
  filtered `/sessions` search.