@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.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/docs/content/locales/ar-SA/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/de-DE/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/es-ES/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/fr-FR/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/hi-IN/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/ja-JP/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/ko-KR/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/pt-BR/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-CN/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-TW/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +2 -0
- package/corpus/core/docs/content/template-analytics.mdx +2 -0
- package/corpus/core/docs/content/template-clips.mdx +22 -10
- package/corpus/core/docs/content/tracking.mdx +2 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/recap.ts +146 -5
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +8 -0
- package/corpus/templates/analytics/AGENTS.md +5 -0
- package/corpus/templates/analytics/actions/create-session-replay-agent-link.ts +31 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/analytics/app/i18n-data.ts +20 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +65 -3
- package/corpus/templates/analytics/changelog/2026-07-02-session-replays-can-be-copied-as-temporary-private-links-for-agents.md +6 -0
- package/corpus/templates/analytics/server/handlers/session-replay.ts +78 -0
- package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +313 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +198 -3
- package/corpus/templates/analytics/server/routes/[...page].get.ts +104 -1
- package/corpus/templates/analytics/server/routes/api/session-replay/agent-context.json.get.ts +48 -0
- package/corpus/templates/analytics/server/routes/api/session-replay/agent-events.json.get.ts +63 -0
- package/corpus/templates/analytics/shared/session-replay-agent-access.ts +10 -0
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +14 -8
- package/corpus/templates/clips/AGENTS.md +3 -2
- package/corpus/templates/clips/actions/create-recording-agent-link.ts +90 -0
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -46
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +5 -3
- package/corpus/templates/clips/app/i18n/ar-SA.ts +1 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +1 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +1 -1
- package/corpus/templates/clips/app/i18n/es-ES.ts +1 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +1 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +1 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +1 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +1 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +1 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +1 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +1 -1
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +100 -46
- 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
- package/corpus/templates/clips/server/lib/public-agent-context.ts +26 -13
- package/corpus/templates/clips/server/routes/api/agent-context.json.get.ts +2 -1
- package/corpus/templates/clips/server/routes/api/agent-frame.jpg.get.ts +2 -1
- package/corpus/templates/clips/server/routes/api/agent-transcript.json.get.ts +2 -1
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +7 -2
- package/corpus/templates/clips/shared/agent-context.ts +5 -0
- package/corpus/templates/plan/actions/create-visual-recap.ts +39 -0
- package/corpus/templates/plan/actions/list-visual-plans.ts +2 -0
- package/corpus/templates/plan/actions/view-screen.ts +2 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +279 -114
- package/corpus/templates/plan/changelog/2026-07-02-plan-comment-shortcuts-now-open-comment-mode-from-the-keyboa.md +6 -0
- package/corpus/templates/plan/server/db/schema.ts +3 -0
- package/corpus/templates/plan/server/lib/comment-notifications.ts +21 -2
- package/corpus/templates/plan/server/plans.ts +6 -0
- package/corpus/templates/plan/server/plugins/db.ts +11 -0
- package/corpus/templates/plan/shared/comment-context.ts +1 -0
- package/corpus/templates/plan/shared/types.ts +4 -0
- package/dist/cli/recap.d.ts +14 -0
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +88 -5
- package/dist/cli/recap.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +4 -4
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/docs/content/locales/ar-SA/template-analytics.mdx +2 -0
- package/docs/content/locales/ar-SA/template-clips.mdx +2 -0
- package/docs/content/locales/de-DE/template-analytics.mdx +2 -0
- package/docs/content/locales/de-DE/template-clips.mdx +2 -0
- package/docs/content/locales/es-ES/template-analytics.mdx +2 -0
- package/docs/content/locales/es-ES/template-clips.mdx +2 -0
- package/docs/content/locales/fr-FR/template-analytics.mdx +2 -0
- package/docs/content/locales/fr-FR/template-clips.mdx +2 -0
- package/docs/content/locales/hi-IN/template-analytics.mdx +2 -0
- package/docs/content/locales/hi-IN/template-clips.mdx +2 -0
- package/docs/content/locales/ja-JP/template-analytics.mdx +2 -0
- package/docs/content/locales/ja-JP/template-clips.mdx +2 -0
- package/docs/content/locales/ko-KR/template-analytics.mdx +2 -0
- package/docs/content/locales/ko-KR/template-clips.mdx +2 -0
- package/docs/content/locales/pt-BR/template-analytics.mdx +2 -0
- package/docs/content/locales/pt-BR/template-clips.mdx +2 -0
- package/docs/content/locales/zh-CN/template-analytics.mdx +2 -0
- package/docs/content/locales/zh-CN/template-clips.mdx +2 -0
- package/docs/content/locales/zh-TW/template-analytics.mdx +2 -0
- package/docs/content/locales/zh-TW/template-clips.mdx +2 -0
- package/docs/content/template-analytics.mdx +2 -0
- package/docs/content/template-clips.mdx +22 -10
- package/docs/content/tracking.mdx +2 -0
- package/package.json +1 -1
package/corpus/README.md
CHANGED
package/corpus/core/CHANGELOG.md
CHANGED
|
@@ -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
|
|
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
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
|
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}
|
package/corpus/core/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.84.
|
|
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
|
-
|
|
2091
|
+
const pictureParts = [`<picture>`];
|
|
1999
2092
|
if (lightImageUrl && darkImageUrl) {
|
|
2000
|
-
|
|
2093
|
+
pictureParts.push(
|
|
2001
2094
|
` <source media="(prefers-color-scheme: dark)" srcset="${darkImageUrl}">`,
|
|
2002
2095
|
);
|
|
2003
2096
|
}
|
|
2004
|
-
|
|
2005
|
-
|
|
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.
|