@agent-native/core 0.78.9 → 0.79.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +17 -0
- package/corpus/core/docs/content/actions.md +4 -2
- package/corpus/core/docs/content/agent-surfaces.md +9 -0
- package/corpus/core/docs/content/extensions.md +10 -0
- package/corpus/core/docs/content/generative-ui.md +217 -0
- package/corpus/core/docs/content/key-concepts.md +2 -2
- package/corpus/core/docs/content/mcp-apps.md +3 -5
- package/corpus/core/docs/content/native-chat-ui.md +9 -5
- package/corpus/core/docs/content/tracking.md +9 -3
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/action-ui.ts +1 -0
- package/corpus/core/src/agent/production-agent.ts +8 -0
- package/corpus/core/src/client/analytics.ts +195 -12
- package/corpus/core/src/client/chat/index.ts +1 -0
- package/corpus/core/src/client/chat/tool-call-display.tsx +5 -2
- package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +139 -0
- package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +27 -1
- package/corpus/core/src/client/conversation/AgentConversation.tsx +38 -0
- package/corpus/core/src/client/conversation/code-agent-transcript.ts +9 -0
- package/corpus/core/src/client/conversation/types.ts +4 -0
- package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +27 -5
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +26 -5
- package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +654 -0
- package/corpus/core/src/client/extensions/iframe-bridge.ts +30 -0
- package/corpus/core/src/client/extensions/index.ts +5 -0
- package/corpus/core/src/client/index.ts +1 -0
- package/corpus/core/src/client/session-replay.ts +89 -14
- package/corpus/core/src/code-agents/transcript-normalizer.ts +14 -0
- package/corpus/core/src/extensions/actions.ts +218 -1
- package/corpus/core/src/extensions/html-shell.ts +70 -3
- package/corpus/core/src/extensions/routes.ts +12 -4
- package/corpus/core/src/index.browser.ts +1 -0
- package/corpus/core/src/index.ts +1 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +21 -9
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +13 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/references/api.md +2 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +115 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +198 -59
- package/corpus/templates/analytics/AGENTS.md +12 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1105 -0
- package/corpus/templates/analytics/actions/dashboard-panel-order.ts +169 -0
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +89 -6
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +333 -0
- package/corpus/templates/analytics/actions/reorder-dashboard-panels.ts +214 -0
- package/corpus/templates/analytics/actions/send-dashboard-report-now.ts +48 -21
- package/corpus/templates/analytics/actions/update-dashboard.ts +193 -100
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +11 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/analytics/app/global.css +81 -10
- package/corpus/templates/analytics/app/i18n-data.ts +249 -4
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +3 -3
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +41 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +4 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +48 -18
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +32 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +204 -70
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +1101 -227
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +160 -133
- package/corpus/templates/analytics/changelog/2026-06-26-agents-can-now-edit-dashboards-through-a-typed-mutation-scri.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-bar-chart-hovers-stay-subtle-in-dark-mode.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-chart-moves-are-now-handled-by-panel-id-making-sim.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-charts-drag-smoothly-with-stable-cards-inactive-ch.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-charts-show-a-refresh-spinner-while-keeping-existi.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-edits-stay-stable-while-chart-order-and-deletions-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-email-reports-queue-immediate-sends.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-explorer-dashboards-now-drag-charts-with-a-stable-preview-an.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-session-replay-playback-can-now-be-toggled-by-clicking-the-r.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-session-replays-now-open-from-the-full-row-and-play-with-tim.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +21 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +41 -17
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +5 -0
- package/dist/action-ui.d.ts +1 -0
- package/dist/action-ui.d.ts.map +1 -1
- package/dist/action-ui.js +1 -0
- package/dist/action-ui.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +6 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +173 -12
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/index.d.ts +1 -1
- package/dist/client/chat/index.d.ts.map +1 -1
- package/dist/client/chat/index.js +1 -1
- package/dist/client/chat/index.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +3 -1
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.d.ts +17 -0
- package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -0
- package/dist/client/chat/widgets/InlineExtensionWidget.js +85 -0
- package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -0
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +15 -2
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/client/conversation/AgentConversation.js +33 -0
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/conversation/code-agent-transcript.js +8 -0
- package/dist/client/conversation/code-agent-transcript.js.map +1 -1
- package/dist/client/conversation/types.d.ts +4 -0
- package/dist/client/conversation/types.d.ts.map +1 -1
- package/dist/client/conversation/types.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +29 -1
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +28 -1
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.d.ts +25 -0
- package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -0
- package/dist/client/extensions/InlineExtensionFrame.js +488 -0
- package/dist/client/extensions/InlineExtensionFrame.js.map +1 -0
- package/dist/client/extensions/iframe-bridge.d.ts +2 -0
- package/dist/client/extensions/iframe-bridge.d.ts.map +1 -1
- package/dist/client/extensions/iframe-bridge.js +23 -0
- package/dist/client/extensions/iframe-bridge.js.map +1 -1
- package/dist/client/extensions/index.d.ts +1 -0
- package/dist/client/extensions/index.d.ts.map +1 -1
- package/dist/client/extensions/index.js +1 -0
- package/dist/client/extensions/index.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/session-replay.d.ts +11 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +74 -14
- package/dist/client/session-replay.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.d.ts +2 -0
- package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
- package/dist/code-agents/transcript-normalizer.js +8 -0
- package/dist/code-agents/transcript-normalizer.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/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +200 -1
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js +70 -3
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +11 -4
- package/dist/extensions/routes.js.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +21 -9
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +13 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +115 -0
- package/docs/content/actions.md +4 -2
- package/docs/content/agent-surfaces.md +9 -0
- package/docs/content/extensions.md +10 -0
- package/docs/content/generative-ui.md +217 -0
- package/docs/content/key-concepts.md +2 -2
- package/docs/content/mcp-apps.md +3 -5
- package/docs/content/native-chat-ui.md +9 -5
- package/docs/content/tracking.md +9 -3
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +13 -0
- package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +2 -0
- package/src/templates/workspace-core/.agents/skills/generative-ui/SKILL.md +115 -0
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { getAnalyticsSessionId, getAnalyticsAnonymousId, scrubUrl, } from "./analytics.js";
|
|
2
2
|
const DEFAULT_REPLAY_PATH = "/api/analytics/replay";
|
|
3
3
|
const DEFAULT_SAMPLING_SALT = "agent-native-session-replay";
|
|
4
|
+
/**
|
|
5
|
+
* Default rrweb event throttling. Without this, rrweb captures every
|
|
6
|
+
* mousemove/scroll which dominates event volume and main-thread cost on
|
|
7
|
+
* interactive pages. These caps keep replays faithful while staying light.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_EVENT_SAMPLING = {
|
|
10
|
+
mousemove: 50,
|
|
11
|
+
mouseInteraction: true,
|
|
12
|
+
scroll: 100,
|
|
13
|
+
media: 800,
|
|
14
|
+
input: "last",
|
|
15
|
+
};
|
|
4
16
|
const SESSION_REPLAY_STATE_KEY = Symbol.for("agent-native.client.sessionReplay");
|
|
5
17
|
const SESSION_REPLAY_ID_STORAGE_KEY = "agent-native.session_replay_id";
|
|
6
18
|
const DEFAULT_BLOCK_SELECTOR = [
|
|
@@ -134,6 +146,16 @@ function readEnvNumber(key) {
|
|
|
134
146
|
const value = Number(raw);
|
|
135
147
|
return Number.isFinite(value) ? value : undefined;
|
|
136
148
|
}
|
|
149
|
+
function readEnvBoolean(key) {
|
|
150
|
+
const raw = readEnvString(key);
|
|
151
|
+
if (!raw)
|
|
152
|
+
return undefined;
|
|
153
|
+
if (/^(1|true|yes|on)$/i.test(raw))
|
|
154
|
+
return true;
|
|
155
|
+
if (/^(0|false|no|off)$/i.test(raw))
|
|
156
|
+
return false;
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
137
159
|
function readFirstEnvString(keys) {
|
|
138
160
|
for (const key of keys) {
|
|
139
161
|
const value = readEnvString(key);
|
|
@@ -236,6 +258,10 @@ function normalizeOptions(options) {
|
|
|
236
258
|
return {
|
|
237
259
|
publicKey,
|
|
238
260
|
endpoint,
|
|
261
|
+
requireSignedInUser: options.requireSignedInUser ??
|
|
262
|
+
readEnvBoolean("VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH") ??
|
|
263
|
+
readEnvBoolean("VITE_SESSION_REPLAY_REQUIRE_AUTH") ??
|
|
264
|
+
false,
|
|
239
265
|
sampleRate: clampSamplingRate(options.sampleRate ??
|
|
240
266
|
readFirstEnvNumber([
|
|
241
267
|
"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE",
|
|
@@ -274,6 +300,7 @@ function normalizeOptions(options) {
|
|
|
274
300
|
recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,
|
|
275
301
|
collectFonts: options.collectFonts ?? false,
|
|
276
302
|
inlineImages: options.inlineImages ?? false,
|
|
303
|
+
eventSampling: options.eventSampling ?? DEFAULT_EVENT_SAMPLING,
|
|
277
304
|
extraProperties: options.extraProperties,
|
|
278
305
|
};
|
|
279
306
|
}
|
|
@@ -307,27 +334,39 @@ function scrubReplayValue(value, key = "", depth = 0, seen = new WeakSet()) {
|
|
|
307
334
|
}
|
|
308
335
|
return out;
|
|
309
336
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
337
|
+
/**
|
|
338
|
+
* JSON.stringify replacer that scrubs URL-like string values inline. Folding
|
|
339
|
+
* the scrub into the single serialization pass avoids a separate deep-clone of
|
|
340
|
+
* every emitted event (FullSnapshots are large DOM trees) on the hot path.
|
|
341
|
+
*/
|
|
342
|
+
function scrubReplayReplacer(key, value) {
|
|
343
|
+
return typeof value === "string" ? scrubStringValue(key, value) : value;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Serialize + scrub one event in a single pass. The resulting string is stored
|
|
347
|
+
* directly on the queue and reused verbatim at flush, so each event is
|
|
348
|
+
* stringified exactly once (was: deep-clone + size-stringify + flush-stringify).
|
|
349
|
+
*/
|
|
350
|
+
function serializeReplayEvent(event) {
|
|
314
351
|
try {
|
|
315
|
-
return JSON.stringify(
|
|
352
|
+
return JSON.stringify(event, scrubReplayReplacer);
|
|
316
353
|
}
|
|
317
354
|
catch {
|
|
318
|
-
return
|
|
355
|
+
return "";
|
|
319
356
|
}
|
|
320
357
|
}
|
|
321
358
|
function enqueueReplayEvent(state, event) {
|
|
322
359
|
if (!state.options)
|
|
323
360
|
return;
|
|
324
|
-
const
|
|
325
|
-
|
|
361
|
+
const serialized = serializeReplayEvent(event);
|
|
362
|
+
if (!serialized)
|
|
363
|
+
return;
|
|
364
|
+
const estimatedBytes = serialized.length;
|
|
326
365
|
if (state.queue.length > 0 &&
|
|
327
366
|
state.queuedBytes + estimatedBytes > state.options.maxBatchBytes) {
|
|
328
367
|
void flushSessionReplay("max-bytes");
|
|
329
368
|
}
|
|
330
|
-
state.queue.push(
|
|
369
|
+
state.queue.push(serialized);
|
|
331
370
|
state.queuedBytes += estimatedBytes;
|
|
332
371
|
if (state.queue.length >= state.options.maxEventsPerBatch) {
|
|
333
372
|
void flushSessionReplay("max-events");
|
|
@@ -347,18 +386,24 @@ function replayExtraProperties(options) {
|
|
|
347
386
|
return undefined;
|
|
348
387
|
}
|
|
349
388
|
}
|
|
350
|
-
function
|
|
389
|
+
function replayString(value) {
|
|
390
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
391
|
+
}
|
|
392
|
+
function buildReplayBody(state, reason, eventJsonParts) {
|
|
351
393
|
const options = state.options;
|
|
352
394
|
if (!options || !state.replayId)
|
|
353
395
|
return null;
|
|
354
396
|
const sessionId = getAnalyticsSessionId();
|
|
355
397
|
if (!sessionId)
|
|
356
398
|
return null;
|
|
357
|
-
const
|
|
399
|
+
const properties = replayExtraProperties(options);
|
|
400
|
+
const userId = replayString(properties?.userId ?? properties?.user_id);
|
|
401
|
+
const envelope = {
|
|
358
402
|
publicKey: options.publicKey,
|
|
359
403
|
type: "session_replay",
|
|
360
404
|
replayId: state.replayId,
|
|
361
405
|
sessionId,
|
|
406
|
+
...(userId ? { userId } : {}),
|
|
362
407
|
anonymousId: getAnalyticsAnonymousId(),
|
|
363
408
|
sequence: state.sequence,
|
|
364
409
|
reason,
|
|
@@ -368,12 +413,14 @@ function buildReplayBody(state, reason, events) {
|
|
|
368
413
|
? scrubUrl(window.location.href)
|
|
369
414
|
: undefined,
|
|
370
415
|
timestamp: new Date().toISOString(),
|
|
371
|
-
properties
|
|
372
|
-
events,
|
|
416
|
+
properties,
|
|
373
417
|
};
|
|
374
418
|
state.sequence += 1;
|
|
375
419
|
persistReplaySequence(sessionId, state.replayId, state.sequence);
|
|
376
|
-
|
|
420
|
+
// Events are already serialized+scrubbed JSON strings; splice them into the
|
|
421
|
+
// envelope without re-serializing the (potentially large) events array.
|
|
422
|
+
const envelopeJson = JSON.stringify(envelope);
|
|
423
|
+
return `${envelopeJson.slice(0, -1)},"events":[${eventJsonParts.join(",")}]}`;
|
|
377
424
|
}
|
|
378
425
|
function isFinalFlushReason(reason) {
|
|
379
426
|
return [
|
|
@@ -478,6 +525,18 @@ export async function startSessionReplay(options = {}) {
|
|
|
478
525
|
if (!sampled) {
|
|
479
526
|
return { started: false, reason: "sampled-out", sessionId, sampled };
|
|
480
527
|
}
|
|
528
|
+
if (normalized.requireSignedInUser) {
|
|
529
|
+
const properties = replayExtraProperties(normalized);
|
|
530
|
+
const userId = replayString(properties?.userId ?? properties?.user_id);
|
|
531
|
+
if (!userId) {
|
|
532
|
+
return {
|
|
533
|
+
started: false,
|
|
534
|
+
reason: "missing-user-id",
|
|
535
|
+
sessionId,
|
|
536
|
+
sampled,
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
}
|
|
481
540
|
if (!isUrlRecordable(window.location.href, normalized)) {
|
|
482
541
|
return { started: false, reason: "url-blocked", sessionId, sampled };
|
|
483
542
|
}
|
|
@@ -509,6 +568,7 @@ export async function startSessionReplay(options = {}) {
|
|
|
509
568
|
try {
|
|
510
569
|
const stopRecorder = rrweb.record({
|
|
511
570
|
emit: (event) => enqueueReplayEvent(state, event),
|
|
571
|
+
sampling: normalized.eventSampling,
|
|
512
572
|
checkoutEveryNth: normalized.checkoutEveryNth,
|
|
513
573
|
checkoutEveryNms: normalized.checkoutEveryNms,
|
|
514
574
|
blockSelector: normalized.blockSelector,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsSessionId,\n getAnalyticsAnonymousId,\n scrubUrl,\n} from \"./analytics.js\";\n\ntype ReplayEvent = Record<string, unknown>;\ntype ReplayStopFn = () => void;\nexport type SessionReplayUrlMatcher =\n | string\n | RegExp\n | ((url: string) => boolean);\n\ninterface RrwebRecordOptions {\n emit: (event: ReplayEvent) => void;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockClass?: string | RegExp;\n blockSelector?: string;\n ignoreClass?: string | RegExp;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n sampling?: Record<string, unknown>;\n}\n\ninterface RrwebRecordModule {\n record: (options: RrwebRecordOptions) => ReplayStopFn | undefined;\n}\n\ninterface SessionReplayState {\n active: boolean;\n replayId: string | null;\n sequence: number;\n queue: ReplayEvent[];\n queuedBytes: number;\n flushTimer: number | null;\n maxDurationTimer: number | null;\n flushing: boolean;\n stopRecorder: ReplayStopFn | null;\n restoreUrlMonitor: (() => void) | null;\n removeLifecycleListeners: (() => void) | null;\n options: NormalizedSessionReplayOptions | null;\n}\n\ninterface StoredReplaySession {\n sessionId?: string;\n replayId?: string;\n sequence?: number;\n}\n\nexport interface SessionReplayOptions {\n enabled?: boolean;\n publicKey?: string;\n endpoint?: string;\n sampleRate?: number;\n samplingSalt?: string;\n allowUrls?: SessionReplayUrlMatcher[];\n blockUrls?: SessionReplayUrlMatcher[];\n flushIntervalMs?: number;\n maxDurationMs?: number;\n maxEventsPerBatch?: number;\n maxBatchBytes?: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector?: string;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n extraProperties?:\n | Record<string, unknown>\n | (() => Record<string, unknown> | undefined);\n}\n\nexport interface SessionReplayStartResult {\n started: boolean;\n reason?:\n | \"disabled\"\n | \"not-browser\"\n | \"missing-public-key\"\n | \"missing-session-id\"\n | \"sampled-out\"\n | \"url-blocked\"\n | \"already-active\"\n | \"import-failed\"\n | \"record-failed\";\n replayId?: string;\n sessionId?: string;\n sampled?: boolean;\n}\n\ninterface NormalizedSessionReplayOptions {\n publicKey: string;\n endpoint: string;\n sampleRate: number;\n samplingSalt: string;\n allowUrls: SessionReplayUrlMatcher[];\n blockUrls: SessionReplayUrlMatcher[];\n flushIntervalMs: number;\n maxDurationMs: number;\n maxEventsPerBatch: number;\n maxBatchBytes: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n recordCanvas: boolean;\n recordCrossOriginIframes: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n extraProperties?: SessionReplayOptions[\"extraProperties\"];\n}\n\nconst DEFAULT_REPLAY_PATH = \"/api/analytics/replay\";\nconst DEFAULT_SAMPLING_SALT = \"agent-native-session-replay\";\nconst SESSION_REPLAY_STATE_KEY = Symbol.for(\n \"agent-native.client.sessionReplay\",\n);\nconst SESSION_REPLAY_ID_STORAGE_KEY = \"agent-native.session_replay_id\";\nconst DEFAULT_BLOCK_SELECTOR = [\n \"[data-sensitive]\",\n \"[data-an-block]\",\n \"[data-an-private]\",\n \"[data-private]\",\n \".an-block\",\n \".an-replay-block\",\n \".an-private\",\n \".rr-block\",\n \"[autocomplete='cc-number']\",\n \"[autocomplete='cc-csc']\",\n \"[autocomplete='cc-exp']\",\n \"[name*='password' i]\",\n \"[name*='credit' i]\",\n \"[name*='card' i]\",\n \"[name*='ssn' i]\",\n].join(\", \");\nconst DEFAULT_IGNORE_SELECTOR = \".an-ignore, [data-an-ignore]\";\nconst DEFAULT_MASK_TEXT_CLASS = \"an-mask\";\nconst DEFAULT_MASK_TEXT_SELECTOR = \"[data-an-mask]\";\nconst DEFAULT_FLUSH_INTERVAL_MS = 5000;\nconst DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_EVENTS_PER_BATCH = 50;\nconst DEFAULT_MAX_BATCH_BYTES = 256 * 1024;\nconst URL_LIKE_KEYS = new Set([\n \"url\",\n \"uri\",\n \"href\",\n \"src\",\n \"currentUrl\",\n \"referrer\",\n \"from\",\n \"to\",\n]);\n\nfunction getState(): SessionReplayState {\n const g = globalThis as typeof globalThis & {\n [SESSION_REPLAY_STATE_KEY]?: SessionReplayState;\n };\n if (!g[SESSION_REPLAY_STATE_KEY]) {\n g[SESSION_REPLAY_STATE_KEY] = {\n active: false,\n replayId: null,\n sequence: 0,\n queue: [],\n queuedBytes: 0,\n flushTimer: null,\n maxDurationTimer: null,\n flushing: false,\n stopRecorder: null,\n restoreUrlMonitor: null,\n removeLifecycleListeners: null,\n options: null,\n };\n }\n return g[SESSION_REPLAY_STATE_KEY]!;\n}\n\nfunction safeStorageGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeStorageSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // private browsing / storage disabled -- replay still works for this page\n }\n}\n\nfunction generateReplayId(): string {\n try {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n } catch {\n // fall through\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readStoredReplaySession(): StoredReplaySession | null {\n const raw = safeStorageGet(SESSION_REPLAY_ID_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredReplaySession;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredReplaySession(value: StoredReplaySession): void {\n safeStorageSet(SESSION_REPLAY_ID_STORAGE_KEY, JSON.stringify(value));\n}\n\nfunction getOrCreateReplaySession(sessionId: string): {\n replayId: string;\n sequence: number;\n} {\n const parsed = readStoredReplaySession();\n if (parsed?.sessionId === sessionId && parsed.replayId) {\n const sequence =\n typeof parsed.sequence === \"number\" &&\n Number.isFinite(parsed.sequence) &&\n parsed.sequence >= 0\n ? Math.floor(parsed.sequence)\n : 0;\n return { replayId: parsed.replayId, sequence };\n }\n const replayId = generateReplayId();\n writeStoredReplaySession({ sessionId, replayId, sequence: 0 });\n return { replayId, sequence: 0 };\n}\n\nfunction persistReplaySequence(\n sessionId: string,\n replayId: string,\n sequence: number,\n): void {\n writeStoredReplaySession({ sessionId, replayId, sequence });\n}\n\nfunction clampSamplingRate(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction readEnvString(key: string): string | undefined {\n return (import.meta.env as Record<string, string | undefined>)?.[key]?.trim();\n}\n\nfunction readEnvNumber(key: string): number | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readFirstEnvString(keys: string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvString(key);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction readFirstEnvNumber(keys: string[]): number | undefined {\n for (const key of keys) {\n const value = readEnvNumber(key);\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction replayEndpointFromAnalyticsEndpoint(value: string): string | null {\n try {\n const url = new URL(value);\n if (url.pathname.endsWith(\"/api/analytics/track\")) {\n url.pathname = url.pathname.replace(\n /\\/api\\/analytics\\/track$/,\n \"/api/analytics/replay\",\n );\n return url.toString();\n }\n if (url.pathname.endsWith(\"/track\")) {\n url.pathname = url.pathname.replace(/\\/track$/, \"/api/analytics/replay\");\n return url.toString();\n }\n } catch {\n // Fall through to the relative path cases below.\n }\n if (value.endsWith(\"/api/analytics/track\")) {\n return value.replace(/\\/api\\/analytics\\/track$/, \"/api/analytics/replay\");\n }\n if (value.endsWith(\"/track\")) {\n return value.replace(/\\/track$/, \"/api/analytics/replay\");\n }\n return null;\n}\n\nfunction defaultReplayEndpoint(): string {\n const analyticsEndpoint = readEnvString(\n \"VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT\",\n );\n const derived = analyticsEndpoint\n ? replayEndpointFromAnalyticsEndpoint(analyticsEndpoint)\n : null;\n if (derived) return derived;\n return typeof window !== \"undefined\"\n ? `${window.location.origin}${DEFAULT_REPLAY_PATH}`\n : DEFAULT_REPLAY_PATH;\n}\n\nexport function getSessionReplaySamplingScore(\n sessionId: string,\n salt = DEFAULT_SAMPLING_SALT,\n): number {\n let hash = 2166136261;\n const input = `${salt}:${sessionId}`;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 4294967296;\n}\n\nexport function shouldSampleSessionReplay(\n sessionId: string,\n sampleRate = 1,\n salt = DEFAULT_SAMPLING_SALT,\n): boolean {\n const rate = clampSamplingRate(sampleRate);\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return getSessionReplaySamplingScore(sessionId, salt) < rate;\n}\n\nfunction matcherAllows(matcher: SessionReplayUrlMatcher, url: string): boolean {\n if (typeof matcher === \"string\") return url.includes(matcher);\n if (matcher instanceof RegExp) return matcher.test(url);\n return matcher(url);\n}\n\nfunction isUrlRecordable(\n url: string,\n options: Pick<NormalizedSessionReplayOptions, \"allowUrls\" | \"blockUrls\">,\n): boolean {\n if (options.allowUrls.length > 0) {\n const allowed = options.allowUrls.some((matcher) =>\n matcherAllows(matcher, url),\n );\n if (!allowed) return false;\n }\n return !options.blockUrls.some((matcher) => matcherAllows(matcher, url));\n}\n\nfunction normalizeOptions(\n options: SessionReplayOptions,\n): NormalizedSessionReplayOptions | null {\n const publicKey =\n options.publicKey ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_PUBLIC_KEY\",\n \"VITE_SESSION_REPLAY_PUBLIC_KEY\",\n ]) ||\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return null;\n const endpoint =\n options.endpoint ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_ANALYTICS_REPLAY_ENDPOINT\",\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_ENDPOINT\",\n \"VITE_SESSION_REPLAY_INGEST_URL\",\n ]) ||\n defaultReplayEndpoint();\n return {\n publicKey,\n endpoint,\n sampleRate: clampSamplingRate(\n options.sampleRate ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE\",\n \"VITE_SESSION_REPLAY_SAMPLE_RATE\",\n ]),\n ),\n samplingSalt: options.samplingSalt || DEFAULT_SAMPLING_SALT,\n allowUrls: options.allowUrls ?? [],\n blockUrls: options.blockUrls ?? [],\n flushIntervalMs: Math.max(\n 250,\n options.flushIntervalMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n \"VITE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n ]) ??\n DEFAULT_FLUSH_INTERVAL_MS,\n ),\n maxDurationMs: Math.max(\n 1000,\n options.maxDurationMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_MAX_DURATION_MS\",\n \"VITE_SESSION_REPLAY_MAX_DURATION_MS\",\n ]) ??\n DEFAULT_MAX_DURATION_MS,\n ),\n maxEventsPerBatch: Math.max(\n 1,\n options.maxEventsPerBatch ?? DEFAULT_MAX_EVENTS_PER_BATCH,\n ),\n maxBatchBytes: Math.max(\n 1024,\n options.maxBatchBytes ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n \"VITE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n ]) ??\n DEFAULT_MAX_BATCH_BYTES,\n ),\n checkoutEveryNth: options.checkoutEveryNth,\n checkoutEveryNms: options.checkoutEveryNms,\n blockSelector: options.blockSelector || DEFAULT_BLOCK_SELECTOR,\n ignoreSelector: options.ignoreSelector || DEFAULT_IGNORE_SELECTOR,\n maskTextClass: options.maskTextClass || DEFAULT_MASK_TEXT_CLASS,\n maskTextSelector: options.maskTextSelector || DEFAULT_MASK_TEXT_SELECTOR,\n maskAllInputs: options.maskAllInputs ?? true,\n recordCanvas: options.recordCanvas ?? false,\n recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,\n collectFonts: options.collectFonts ?? false,\n inlineImages: options.inlineImages ?? false,\n extraProperties: options.extraProperties,\n };\n}\n\nfunction scrubStringValue(key: string, value: string): string {\n const lowerKey = key.toLowerCase();\n const isUrlKey = URL_LIKE_KEYS.has(key) || URL_LIKE_KEYS.has(lowerKey);\n if (\n isUrlKey ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"/\")\n ) {\n return scrubUrl(value) ?? value;\n }\n return value;\n}\n\nfunction scrubReplayValue(\n value: unknown,\n key = \"\",\n depth = 0,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === \"string\") return scrubStringValue(key, value);\n if (!value || typeof value !== \"object\") return value;\n if (depth > 12) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => scrubReplayValue(item, key, depth + 1, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = scrubReplayValue(childValue, childKey, depth + 1, seen);\n }\n return out;\n}\n\nfunction scrubReplayEvent(event: ReplayEvent): ReplayEvent {\n return scrubReplayValue(event) as ReplayEvent;\n}\n\nfunction estimateJsonBytes(value: unknown): number {\n try {\n return JSON.stringify(value).length;\n } catch {\n return 0;\n }\n}\n\nfunction enqueueReplayEvent(\n state: SessionReplayState,\n event: ReplayEvent,\n): void {\n if (!state.options) return;\n const sanitized = scrubReplayEvent(event);\n const estimatedBytes = estimateJsonBytes(sanitized);\n if (\n state.queue.length > 0 &&\n state.queuedBytes + estimatedBytes > state.options.maxBatchBytes\n ) {\n void flushSessionReplay(\"max-bytes\");\n }\n state.queue.push(sanitized);\n state.queuedBytes += estimatedBytes;\n if (state.queue.length >= state.options.maxEventsPerBatch) {\n void flushSessionReplay(\"max-events\");\n }\n}\n\nfunction replayExtraProperties(\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const source = options.extraProperties;\n if (!source) return undefined;\n try {\n const props = typeof source === \"function\" ? source() : source;\n if (!props || typeof props !== \"object\") return undefined;\n return scrubReplayValue(props) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction buildReplayBody(\n state: SessionReplayState,\n reason: string,\n events: ReplayEvent[],\n): string | null {\n const options = state.options;\n if (!options || !state.replayId) return null;\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return null;\n const body = {\n publicKey: options.publicKey,\n type: \"session_replay\",\n replayId: state.replayId,\n sessionId,\n anonymousId: getAnalyticsAnonymousId(),\n sequence: state.sequence,\n reason,\n status: isFinalFlushReason(reason) ? \"completed\" : \"active\",\n privacyMode: \"mask-inputs-and-selected-text\",\n url:\n typeof window !== \"undefined\"\n ? scrubUrl(window.location.href)\n : undefined,\n timestamp: new Date().toISOString(),\n properties: replayExtraProperties(options),\n events,\n };\n state.sequence += 1;\n persistReplaySequence(sessionId, state.replayId, state.sequence);\n return JSON.stringify(body);\n}\n\nfunction isFinalFlushReason(reason: string): boolean {\n return [\n \"manual\",\n \"pagehide\",\n \"beforeunload\",\n \"url-blocked\",\n \"max-duration\",\n ].includes(reason);\n}\n\nexport async function flushSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.options || state.queue.length === 0 || state.flushing) return;\n const events = state.queue.splice(0, state.queue.length);\n state.queuedBytes = 0;\n const body = buildReplayBody(state, reason, events);\n if (!body || !state.options) return;\n state.flushing = true;\n try {\n if (navigator.sendBeacon) {\n const sent = navigator.sendBeacon(state.options.endpoint, body);\n if (sent) return;\n }\n await fetch(state.options.endpoint, {\n method: \"POST\",\n body,\n keepalive: true,\n headers: {\n \"Content-Type\": \"text/plain;charset=UTF-8\",\n \"X-Agent-Native-Analytics-Key\": state.options.publicKey,\n },\n }).catch(() => {});\n } finally {\n state.flushing = false;\n }\n}\n\nfunction installUrlMonitor(state: SessionReplayState): void {\n if (!state.options || state.restoreUrlMonitor) return;\n const options = state.options;\n const check = () => {\n if (!isUrlRecordable(window.location.href, options)) {\n stopSessionReplay(\"url-blocked\");\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.addEventListener(\"popstate\", check);\n state.restoreUrlMonitor = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", check);\n state.restoreUrlMonitor = null;\n };\n}\n\nfunction installLifecycleListeners(state: SessionReplayState): void {\n if (state.removeLifecycleListeners) return;\n const flushOnHidden = () => {\n if (document.visibilityState === \"hidden\") {\n void flushSessionReplay(\"visibility-hidden\");\n }\n };\n const flushOnUnload = () => {\n void flushSessionReplay(\"pagehide\");\n };\n document.addEventListener(\"visibilitychange\", flushOnHidden);\n window.addEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = () => {\n document.removeEventListener(\"visibilitychange\", flushOnHidden);\n window.removeEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = null;\n };\n}\n\nexport async function startSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n if (options.enabled === false) return { started: false, reason: \"disabled\" };\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return { started: false, reason: \"not-browser\" };\n }\n const normalized = normalizeOptions(options);\n if (!normalized) return { started: false, reason: \"missing-public-key\" };\n\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return { started: false, reason: \"missing-session-id\" };\n const sampled = shouldSampleSessionReplay(\n sessionId,\n normalized.sampleRate,\n normalized.samplingSalt,\n );\n if (!sampled) {\n return { started: false, reason: \"sampled-out\", sessionId, sampled };\n }\n if (!isUrlRecordable(window.location.href, normalized)) {\n return { started: false, reason: \"url-blocked\", sessionId, sampled };\n }\n\n const state = getState();\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n\n let rrweb: RrwebRecordModule;\n try {\n rrweb = (await import(\"@rrweb/record\")) as RrwebRecordModule;\n } catch {\n return { started: false, reason: \"import-failed\", sessionId, sampled };\n }\n\n const replaySession = getOrCreateReplaySession(sessionId);\n state.options = normalized;\n state.replayId = replaySession.replayId;\n state.sequence = replaySession.sequence;\n state.queue = [];\n state.queuedBytes = 0;\n state.stopRecorder = null;\n state.active = true;\n\n try {\n const stopRecorder = rrweb.record({\n emit: (event) => enqueueReplayEvent(state, event),\n checkoutEveryNth: normalized.checkoutEveryNth,\n checkoutEveryNms: normalized.checkoutEveryNms,\n blockSelector: normalized.blockSelector,\n ignoreSelector: normalized.ignoreSelector,\n maskTextClass: normalized.maskTextClass,\n maskTextSelector: normalized.maskTextSelector,\n maskAllInputs: normalized.maskAllInputs,\n recordCanvas: normalized.recordCanvas,\n recordCrossOriginIframes: normalized.recordCrossOriginIframes,\n collectFonts: normalized.collectFonts,\n inlineImages: normalized.inlineImages,\n maskInputOptions: {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n },\n });\n if (typeof stopRecorder !== \"function\") {\n state.active = false;\n state.options = null;\n state.replayId = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n state.stopRecorder = stopRecorder;\n state.flushTimer = window.setInterval(\n () => void flushSessionReplay(\"interval\"),\n normalized.flushIntervalMs,\n );\n state.maxDurationTimer = window.setTimeout(\n () => stopSessionReplay(\"max-duration\"),\n normalized.maxDurationMs,\n );\n installUrlMonitor(state);\n installLifecycleListeners(state);\n return {\n started: true,\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n } catch {\n state.active = false;\n state.options = null;\n state.replayId = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n}\n\nexport function stopSessionReplay(reason = \"manual\"): void {\n const state = getState();\n if (!state.active) return;\n state.active = false;\n try {\n state.stopRecorder?.();\n } catch {\n // best-effort recorder shutdown\n }\n state.stopRecorder = null;\n if (state.flushTimer) {\n window.clearInterval(state.flushTimer);\n state.flushTimer = null;\n }\n if (state.maxDurationTimer) {\n window.clearTimeout(state.maxDurationTimer);\n state.maxDurationTimer = null;\n }\n state.restoreUrlMonitor?.();\n state.removeLifecycleListeners?.();\n void flushSessionReplay(reason);\n}\n\nexport function maybeStartSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n return startSessionReplay(options);\n}\n\nexport function isSessionReplayActive(): boolean {\n return getState().active;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsSessionId,\n getAnalyticsAnonymousId,\n scrubUrl,\n} from \"./analytics.js\";\n\ntype ReplayEvent = Record<string, unknown>;\ntype ReplayStopFn = () => void;\nexport type SessionReplayUrlMatcher =\n | string\n | RegExp\n | ((url: string) => boolean);\n\ninterface RrwebRecordOptions {\n emit: (event: ReplayEvent) => void;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockClass?: string | RegExp;\n blockSelector?: string;\n ignoreClass?: string | RegExp;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n sampling?: Record<string, unknown>;\n}\n\ninterface RrwebRecordModule {\n record: (options: RrwebRecordOptions) => ReplayStopFn | undefined;\n}\n\ninterface SessionReplayState {\n active: boolean;\n replayId: string | null;\n sequence: number;\n /** Pre-serialized + scrubbed event JSON strings, ready to splice at flush. */\n queue: string[];\n queuedBytes: number;\n flushTimer: number | null;\n maxDurationTimer: number | null;\n flushing: boolean;\n stopRecorder: ReplayStopFn | null;\n restoreUrlMonitor: (() => void) | null;\n removeLifecycleListeners: (() => void) | null;\n options: NormalizedSessionReplayOptions | null;\n}\n\ninterface StoredReplaySession {\n sessionId?: string;\n replayId?: string;\n sequence?: number;\n}\n\n/** rrweb `sampling` shape (mousemove/scroll/media throttles, input strategy). */\nexport type ReplayEventSampling = Record<string, unknown>;\n\nexport interface SessionReplayOptions {\n enabled?: boolean;\n publicKey?: string;\n endpoint?: string;\n requireSignedInUser?: boolean;\n sampleRate?: number;\n samplingSalt?: string;\n allowUrls?: SessionReplayUrlMatcher[];\n blockUrls?: SessionReplayUrlMatcher[];\n flushIntervalMs?: number;\n maxDurationMs?: number;\n maxEventsPerBatch?: number;\n maxBatchBytes?: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector?: string;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n /**\n * rrweb per-event throttling (distinct from `sampleRate`, which decides\n * whether a whole session records). Throttles high-frequency event types\n * (mousemove/scroll/input) to keep the recorded page responsive and the\n * payloads small. Passed straight through to `rrweb.record({ sampling })`.\n */\n eventSampling?: ReplayEventSampling;\n extraProperties?:\n | Record<string, unknown>\n | (() => Record<string, unknown> | undefined);\n}\n\nexport interface SessionReplayStartResult {\n started: boolean;\n reason?:\n | \"disabled\"\n | \"not-browser\"\n | \"missing-public-key\"\n | \"missing-session-id\"\n | \"missing-user-id\"\n | \"sampled-out\"\n | \"url-blocked\"\n | \"already-active\"\n | \"import-failed\"\n | \"record-failed\";\n replayId?: string;\n sessionId?: string;\n sampled?: boolean;\n}\n\ninterface NormalizedSessionReplayOptions {\n publicKey: string;\n endpoint: string;\n requireSignedInUser: boolean;\n sampleRate: number;\n samplingSalt: string;\n allowUrls: SessionReplayUrlMatcher[];\n blockUrls: SessionReplayUrlMatcher[];\n flushIntervalMs: number;\n maxDurationMs: number;\n maxEventsPerBatch: number;\n maxBatchBytes: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n recordCanvas: boolean;\n recordCrossOriginIframes: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n eventSampling: ReplayEventSampling;\n extraProperties?: SessionReplayOptions[\"extraProperties\"];\n}\n\nconst DEFAULT_REPLAY_PATH = \"/api/analytics/replay\";\nconst DEFAULT_SAMPLING_SALT = \"agent-native-session-replay\";\n\n/**\n * Default rrweb event throttling. Without this, rrweb captures every\n * mousemove/scroll which dominates event volume and main-thread cost on\n * interactive pages. These caps keep replays faithful while staying light.\n */\nconst DEFAULT_EVENT_SAMPLING: ReplayEventSampling = {\n mousemove: 50,\n mouseInteraction: true,\n scroll: 100,\n media: 800,\n input: \"last\",\n};\nconst SESSION_REPLAY_STATE_KEY = Symbol.for(\n \"agent-native.client.sessionReplay\",\n);\nconst SESSION_REPLAY_ID_STORAGE_KEY = \"agent-native.session_replay_id\";\nconst DEFAULT_BLOCK_SELECTOR = [\n \"[data-sensitive]\",\n \"[data-an-block]\",\n \"[data-an-private]\",\n \"[data-private]\",\n \".an-block\",\n \".an-replay-block\",\n \".an-private\",\n \".rr-block\",\n \"[autocomplete='cc-number']\",\n \"[autocomplete='cc-csc']\",\n \"[autocomplete='cc-exp']\",\n \"[name*='password' i]\",\n \"[name*='credit' i]\",\n \"[name*='card' i]\",\n \"[name*='ssn' i]\",\n].join(\", \");\nconst DEFAULT_IGNORE_SELECTOR = \".an-ignore, [data-an-ignore]\";\nconst DEFAULT_MASK_TEXT_CLASS = \"an-mask\";\nconst DEFAULT_MASK_TEXT_SELECTOR = \"[data-an-mask]\";\nconst DEFAULT_FLUSH_INTERVAL_MS = 5000;\nconst DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_EVENTS_PER_BATCH = 50;\nconst DEFAULT_MAX_BATCH_BYTES = 256 * 1024;\nconst URL_LIKE_KEYS = new Set([\n \"url\",\n \"uri\",\n \"href\",\n \"src\",\n \"currentUrl\",\n \"referrer\",\n \"from\",\n \"to\",\n]);\n\nfunction getState(): SessionReplayState {\n const g = globalThis as typeof globalThis & {\n [SESSION_REPLAY_STATE_KEY]?: SessionReplayState;\n };\n if (!g[SESSION_REPLAY_STATE_KEY]) {\n g[SESSION_REPLAY_STATE_KEY] = {\n active: false,\n replayId: null,\n sequence: 0,\n queue: [],\n queuedBytes: 0,\n flushTimer: null,\n maxDurationTimer: null,\n flushing: false,\n stopRecorder: null,\n restoreUrlMonitor: null,\n removeLifecycleListeners: null,\n options: null,\n };\n }\n return g[SESSION_REPLAY_STATE_KEY]!;\n}\n\nfunction safeStorageGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeStorageSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // private browsing / storage disabled -- replay still works for this page\n }\n}\n\nfunction generateReplayId(): string {\n try {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n } catch {\n // fall through\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readStoredReplaySession(): StoredReplaySession | null {\n const raw = safeStorageGet(SESSION_REPLAY_ID_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredReplaySession;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredReplaySession(value: StoredReplaySession): void {\n safeStorageSet(SESSION_REPLAY_ID_STORAGE_KEY, JSON.stringify(value));\n}\n\nfunction getOrCreateReplaySession(sessionId: string): {\n replayId: string;\n sequence: number;\n} {\n const parsed = readStoredReplaySession();\n if (parsed?.sessionId === sessionId && parsed.replayId) {\n const sequence =\n typeof parsed.sequence === \"number\" &&\n Number.isFinite(parsed.sequence) &&\n parsed.sequence >= 0\n ? Math.floor(parsed.sequence)\n : 0;\n return { replayId: parsed.replayId, sequence };\n }\n const replayId = generateReplayId();\n writeStoredReplaySession({ sessionId, replayId, sequence: 0 });\n return { replayId, sequence: 0 };\n}\n\nfunction persistReplaySequence(\n sessionId: string,\n replayId: string,\n sequence: number,\n): void {\n writeStoredReplaySession({ sessionId, replayId, sequence });\n}\n\nfunction clampSamplingRate(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction readEnvString(key: string): string | undefined {\n return (import.meta.env as Record<string, string | undefined>)?.[key]?.trim();\n}\n\nfunction readEnvNumber(key: string): number | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readEnvBoolean(key: string): boolean | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n if (/^(1|true|yes|on)$/i.test(raw)) return true;\n if (/^(0|false|no|off)$/i.test(raw)) return false;\n return undefined;\n}\n\nfunction readFirstEnvString(keys: string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvString(key);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction readFirstEnvNumber(keys: string[]): number | undefined {\n for (const key of keys) {\n const value = readEnvNumber(key);\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction replayEndpointFromAnalyticsEndpoint(value: string): string | null {\n try {\n const url = new URL(value);\n if (url.pathname.endsWith(\"/api/analytics/track\")) {\n url.pathname = url.pathname.replace(\n /\\/api\\/analytics\\/track$/,\n \"/api/analytics/replay\",\n );\n return url.toString();\n }\n if (url.pathname.endsWith(\"/track\")) {\n url.pathname = url.pathname.replace(/\\/track$/, \"/api/analytics/replay\");\n return url.toString();\n }\n } catch {\n // Fall through to the relative path cases below.\n }\n if (value.endsWith(\"/api/analytics/track\")) {\n return value.replace(/\\/api\\/analytics\\/track$/, \"/api/analytics/replay\");\n }\n if (value.endsWith(\"/track\")) {\n return value.replace(/\\/track$/, \"/api/analytics/replay\");\n }\n return null;\n}\n\nfunction defaultReplayEndpoint(): string {\n const analyticsEndpoint = readEnvString(\n \"VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT\",\n );\n const derived = analyticsEndpoint\n ? replayEndpointFromAnalyticsEndpoint(analyticsEndpoint)\n : null;\n if (derived) return derived;\n return typeof window !== \"undefined\"\n ? `${window.location.origin}${DEFAULT_REPLAY_PATH}`\n : DEFAULT_REPLAY_PATH;\n}\n\nexport function getSessionReplaySamplingScore(\n sessionId: string,\n salt = DEFAULT_SAMPLING_SALT,\n): number {\n let hash = 2166136261;\n const input = `${salt}:${sessionId}`;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 4294967296;\n}\n\nexport function shouldSampleSessionReplay(\n sessionId: string,\n sampleRate = 1,\n salt = DEFAULT_SAMPLING_SALT,\n): boolean {\n const rate = clampSamplingRate(sampleRate);\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return getSessionReplaySamplingScore(sessionId, salt) < rate;\n}\n\nfunction matcherAllows(matcher: SessionReplayUrlMatcher, url: string): boolean {\n if (typeof matcher === \"string\") return url.includes(matcher);\n if (matcher instanceof RegExp) return matcher.test(url);\n return matcher(url);\n}\n\nfunction isUrlRecordable(\n url: string,\n options: Pick<NormalizedSessionReplayOptions, \"allowUrls\" | \"blockUrls\">,\n): boolean {\n if (options.allowUrls.length > 0) {\n const allowed = options.allowUrls.some((matcher) =>\n matcherAllows(matcher, url),\n );\n if (!allowed) return false;\n }\n return !options.blockUrls.some((matcher) => matcherAllows(matcher, url));\n}\n\nfunction normalizeOptions(\n options: SessionReplayOptions,\n): NormalizedSessionReplayOptions | null {\n const publicKey =\n options.publicKey ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_PUBLIC_KEY\",\n \"VITE_SESSION_REPLAY_PUBLIC_KEY\",\n ]) ||\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return null;\n const endpoint =\n options.endpoint ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_ANALYTICS_REPLAY_ENDPOINT\",\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_ENDPOINT\",\n \"VITE_SESSION_REPLAY_INGEST_URL\",\n ]) ||\n defaultReplayEndpoint();\n return {\n publicKey,\n endpoint,\n requireSignedInUser:\n options.requireSignedInUser ??\n readEnvBoolean(\"VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n readEnvBoolean(\"VITE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n false,\n sampleRate: clampSamplingRate(\n options.sampleRate ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE\",\n \"VITE_SESSION_REPLAY_SAMPLE_RATE\",\n ]),\n ),\n samplingSalt: options.samplingSalt || DEFAULT_SAMPLING_SALT,\n allowUrls: options.allowUrls ?? [],\n blockUrls: options.blockUrls ?? [],\n flushIntervalMs: Math.max(\n 250,\n options.flushIntervalMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n \"VITE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n ]) ??\n DEFAULT_FLUSH_INTERVAL_MS,\n ),\n maxDurationMs: Math.max(\n 1000,\n options.maxDurationMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_MAX_DURATION_MS\",\n \"VITE_SESSION_REPLAY_MAX_DURATION_MS\",\n ]) ??\n DEFAULT_MAX_DURATION_MS,\n ),\n maxEventsPerBatch: Math.max(\n 1,\n options.maxEventsPerBatch ?? DEFAULT_MAX_EVENTS_PER_BATCH,\n ),\n maxBatchBytes: Math.max(\n 1024,\n options.maxBatchBytes ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n \"VITE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n ]) ??\n DEFAULT_MAX_BATCH_BYTES,\n ),\n checkoutEveryNth: options.checkoutEveryNth,\n checkoutEveryNms: options.checkoutEveryNms,\n blockSelector: options.blockSelector || DEFAULT_BLOCK_SELECTOR,\n ignoreSelector: options.ignoreSelector || DEFAULT_IGNORE_SELECTOR,\n maskTextClass: options.maskTextClass || DEFAULT_MASK_TEXT_CLASS,\n maskTextSelector: options.maskTextSelector || DEFAULT_MASK_TEXT_SELECTOR,\n maskAllInputs: options.maskAllInputs ?? true,\n recordCanvas: options.recordCanvas ?? false,\n recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,\n collectFonts: options.collectFonts ?? false,\n inlineImages: options.inlineImages ?? false,\n eventSampling: options.eventSampling ?? DEFAULT_EVENT_SAMPLING,\n extraProperties: options.extraProperties,\n };\n}\n\nfunction scrubStringValue(key: string, value: string): string {\n const lowerKey = key.toLowerCase();\n const isUrlKey = URL_LIKE_KEYS.has(key) || URL_LIKE_KEYS.has(lowerKey);\n if (\n isUrlKey ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"/\")\n ) {\n return scrubUrl(value) ?? value;\n }\n return value;\n}\n\nfunction scrubReplayValue(\n value: unknown,\n key = \"\",\n depth = 0,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === \"string\") return scrubStringValue(key, value);\n if (!value || typeof value !== \"object\") return value;\n if (depth > 12) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => scrubReplayValue(item, key, depth + 1, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = scrubReplayValue(childValue, childKey, depth + 1, seen);\n }\n return out;\n}\n\n/**\n * JSON.stringify replacer that scrubs URL-like string values inline. Folding\n * the scrub into the single serialization pass avoids a separate deep-clone of\n * every emitted event (FullSnapshots are large DOM trees) on the hot path.\n */\nfunction scrubReplayReplacer(key: string, value: unknown): unknown {\n return typeof value === \"string\" ? scrubStringValue(key, value) : value;\n}\n\n/**\n * Serialize + scrub one event in a single pass. The resulting string is stored\n * directly on the queue and reused verbatim at flush, so each event is\n * stringified exactly once (was: deep-clone + size-stringify + flush-stringify).\n */\nfunction serializeReplayEvent(event: ReplayEvent): string {\n try {\n return JSON.stringify(event, scrubReplayReplacer);\n } catch {\n return \"\";\n }\n}\n\nfunction enqueueReplayEvent(\n state: SessionReplayState,\n event: ReplayEvent,\n): void {\n if (!state.options) return;\n const serialized = serializeReplayEvent(event);\n if (!serialized) return;\n const estimatedBytes = serialized.length;\n if (\n state.queue.length > 0 &&\n state.queuedBytes + estimatedBytes > state.options.maxBatchBytes\n ) {\n void flushSessionReplay(\"max-bytes\");\n }\n state.queue.push(serialized);\n state.queuedBytes += estimatedBytes;\n if (state.queue.length >= state.options.maxEventsPerBatch) {\n void flushSessionReplay(\"max-events\");\n }\n}\n\nfunction replayExtraProperties(\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const source = options.extraProperties;\n if (!source) return undefined;\n try {\n const props = typeof source === \"function\" ? source() : source;\n if (!props || typeof props !== \"object\") return undefined;\n return scrubReplayValue(props) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction replayString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction buildReplayBody(\n state: SessionReplayState,\n reason: string,\n eventJsonParts: string[],\n): string | null {\n const options = state.options;\n if (!options || !state.replayId) return null;\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return null;\n const properties = replayExtraProperties(options);\n const userId = replayString(properties?.userId ?? properties?.user_id);\n const envelope = {\n publicKey: options.publicKey,\n type: \"session_replay\",\n replayId: state.replayId,\n sessionId,\n ...(userId ? { userId } : {}),\n anonymousId: getAnalyticsAnonymousId(),\n sequence: state.sequence,\n reason,\n status: isFinalFlushReason(reason) ? \"completed\" : \"active\",\n privacyMode: \"mask-inputs-and-selected-text\",\n url:\n typeof window !== \"undefined\"\n ? scrubUrl(window.location.href)\n : undefined,\n timestamp: new Date().toISOString(),\n properties,\n };\n state.sequence += 1;\n persistReplaySequence(sessionId, state.replayId, state.sequence);\n // Events are already serialized+scrubbed JSON strings; splice them into the\n // envelope without re-serializing the (potentially large) events array.\n const envelopeJson = JSON.stringify(envelope);\n return `${envelopeJson.slice(0, -1)},\"events\":[${eventJsonParts.join(\",\")}]}`;\n}\n\nfunction isFinalFlushReason(reason: string): boolean {\n return [\n \"manual\",\n \"pagehide\",\n \"beforeunload\",\n \"url-blocked\",\n \"max-duration\",\n ].includes(reason);\n}\n\nexport async function flushSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.options || state.queue.length === 0 || state.flushing) return;\n const events = state.queue.splice(0, state.queue.length);\n state.queuedBytes = 0;\n const body = buildReplayBody(state, reason, events);\n if (!body || !state.options) return;\n state.flushing = true;\n try {\n if (navigator.sendBeacon) {\n const sent = navigator.sendBeacon(state.options.endpoint, body);\n if (sent) return;\n }\n await fetch(state.options.endpoint, {\n method: \"POST\",\n body,\n keepalive: true,\n headers: {\n \"Content-Type\": \"text/plain;charset=UTF-8\",\n \"X-Agent-Native-Analytics-Key\": state.options.publicKey,\n },\n }).catch(() => {});\n } finally {\n state.flushing = false;\n }\n}\n\nfunction installUrlMonitor(state: SessionReplayState): void {\n if (!state.options || state.restoreUrlMonitor) return;\n const options = state.options;\n const check = () => {\n if (!isUrlRecordable(window.location.href, options)) {\n stopSessionReplay(\"url-blocked\");\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.addEventListener(\"popstate\", check);\n state.restoreUrlMonitor = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", check);\n state.restoreUrlMonitor = null;\n };\n}\n\nfunction installLifecycleListeners(state: SessionReplayState): void {\n if (state.removeLifecycleListeners) return;\n const flushOnHidden = () => {\n if (document.visibilityState === \"hidden\") {\n void flushSessionReplay(\"visibility-hidden\");\n }\n };\n const flushOnUnload = () => {\n void flushSessionReplay(\"pagehide\");\n };\n document.addEventListener(\"visibilitychange\", flushOnHidden);\n window.addEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = () => {\n document.removeEventListener(\"visibilitychange\", flushOnHidden);\n window.removeEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = null;\n };\n}\n\nexport async function startSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n if (options.enabled === false) return { started: false, reason: \"disabled\" };\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return { started: false, reason: \"not-browser\" };\n }\n const normalized = normalizeOptions(options);\n if (!normalized) return { started: false, reason: \"missing-public-key\" };\n\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return { started: false, reason: \"missing-session-id\" };\n const sampled = shouldSampleSessionReplay(\n sessionId,\n normalized.sampleRate,\n normalized.samplingSalt,\n );\n if (!sampled) {\n return { started: false, reason: \"sampled-out\", sessionId, sampled };\n }\n if (normalized.requireSignedInUser) {\n const properties = replayExtraProperties(normalized);\n const userId = replayString(properties?.userId ?? properties?.user_id);\n if (!userId) {\n return {\n started: false,\n reason: \"missing-user-id\",\n sessionId,\n sampled,\n };\n }\n }\n if (!isUrlRecordable(window.location.href, normalized)) {\n return { started: false, reason: \"url-blocked\", sessionId, sampled };\n }\n\n const state = getState();\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n\n let rrweb: RrwebRecordModule;\n try {\n rrweb = (await import(\"@rrweb/record\")) as RrwebRecordModule;\n } catch {\n return { started: false, reason: \"import-failed\", sessionId, sampled };\n }\n\n const replaySession = getOrCreateReplaySession(sessionId);\n state.options = normalized;\n state.replayId = replaySession.replayId;\n state.sequence = replaySession.sequence;\n state.queue = [];\n state.queuedBytes = 0;\n state.stopRecorder = null;\n state.active = true;\n\n try {\n const stopRecorder = rrweb.record({\n emit: (event) => enqueueReplayEvent(state, event),\n sampling: normalized.eventSampling,\n checkoutEveryNth: normalized.checkoutEveryNth,\n checkoutEveryNms: normalized.checkoutEveryNms,\n blockSelector: normalized.blockSelector,\n ignoreSelector: normalized.ignoreSelector,\n maskTextClass: normalized.maskTextClass,\n maskTextSelector: normalized.maskTextSelector,\n maskAllInputs: normalized.maskAllInputs,\n recordCanvas: normalized.recordCanvas,\n recordCrossOriginIframes: normalized.recordCrossOriginIframes,\n collectFonts: normalized.collectFonts,\n inlineImages: normalized.inlineImages,\n maskInputOptions: {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n },\n });\n if (typeof stopRecorder !== \"function\") {\n state.active = false;\n state.options = null;\n state.replayId = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n state.stopRecorder = stopRecorder;\n state.flushTimer = window.setInterval(\n () => void flushSessionReplay(\"interval\"),\n normalized.flushIntervalMs,\n );\n state.maxDurationTimer = window.setTimeout(\n () => stopSessionReplay(\"max-duration\"),\n normalized.maxDurationMs,\n );\n installUrlMonitor(state);\n installLifecycleListeners(state);\n return {\n started: true,\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n } catch {\n state.active = false;\n state.options = null;\n state.replayId = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n}\n\nexport function stopSessionReplay(reason = \"manual\"): void {\n const state = getState();\n if (!state.active) return;\n state.active = false;\n try {\n state.stopRecorder?.();\n } catch {\n // best-effort recorder shutdown\n }\n state.stopRecorder = null;\n if (state.flushTimer) {\n window.clearInterval(state.flushTimer);\n state.flushTimer = null;\n }\n if (state.maxDurationTimer) {\n window.clearTimeout(state.maxDurationTimer);\n state.maxDurationTimer = null;\n }\n state.restoreUrlMonitor?.();\n state.removeLifecycleListeners?.();\n void flushSessionReplay(reason);\n}\n\nexport function maybeStartSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n return startSessionReplay(options);\n}\n\nexport function isSessionReplayActive(): boolean {\n return getState().active;\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ActionChatUIConfig } from "../action-ui.js";
|
|
1
2
|
import type { CodeAgentTranscriptEvent } from "../cli/code-agent-runs.js";
|
|
2
3
|
import type { AgentMcpAppPayload } from "../mcp-client/app-result.js";
|
|
3
4
|
export type { CodeAgentTranscriptEvent } from "../cli/code-agent-runs.js";
|
|
@@ -35,6 +36,7 @@ export interface NormalizedCodeAgentToolEvent extends NormalizedCodeAgentTranscr
|
|
|
35
36
|
input?: unknown;
|
|
36
37
|
result?: unknown;
|
|
37
38
|
mcpApp?: AgentMcpAppPayload;
|
|
39
|
+
chatUI?: ActionChatUIConfig;
|
|
38
40
|
activities: string[];
|
|
39
41
|
startedAt?: string;
|
|
40
42
|
completedAt?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-normalizer.d.ts","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,MAAM,iCAAiC,GACzC,2BAA2B,GAC3B,gCAAgC,GAChC,4BAA4B,GAC5B,8BAA8B,GAC9B,gCAAgC,CAAC;AAErC,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,iCAAiC,EAAE,CAAC;IAC3C,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,iCAAiC;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gCAAiC,SAAQ,iCAAiC;IACzF,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,CAAC;IACnC,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,4BAA6B,SAAQ,iCAAiC;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,gCAAiC,SAAQ,iCAAiC;IACzF,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,wBAAwB,EAAE,GAC1C,6BAA6B,CAgE/B"}
|
|
1
|
+
{"version":3,"file":"transcript-normalizer.d.ts","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,MAAM,iCAAiC,GACzC,2BAA2B,GAC3B,gCAAgC,GAChC,4BAA4B,GAC5B,8BAA8B,GAC9B,gCAAgC,CAAC;AAErC,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,iCAAiC,EAAE,CAAC;IAC3C,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,EAAE,wBAAwB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,iCAAiC;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gCAAiC,SAAQ,iCAAiC;IACzF,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,CAAC;IACnC,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,4BAA6B,SAAQ,iCAAiC;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,gCAAiC,SAAQ,iCAAiC;IACzF,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,wBAAwB,EAAE,GAC1C,6BAA6B,CAgE/B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeActionChatUIConfig, } from "../action-ui.js";
|
|
1
2
|
export function normalizeCodeAgentTranscript(events) {
|
|
2
3
|
const items = [];
|
|
3
4
|
const hiddenEvents = [];
|
|
@@ -170,6 +171,9 @@ function appendToolEvent(items, event, toolType, turnIndex) {
|
|
|
170
171
|
const mcpApp = mcpAppMetadata(event.metadata);
|
|
171
172
|
if (mcpApp)
|
|
172
173
|
item.mcpApp = mcpApp;
|
|
174
|
+
const chatUI = chatUIMetadata(event.metadata);
|
|
175
|
+
if (chatUI)
|
|
176
|
+
item.chatUI = chatUI;
|
|
173
177
|
const doneMeta = structuredMetadata(event.metadata);
|
|
174
178
|
if (doneMeta)
|
|
175
179
|
item.structuredMeta = doneMeta;
|
|
@@ -190,6 +194,7 @@ function createToolEvent(event, toolType, turnIndex) {
|
|
|
190
194
|
input: hasMetadataKey(metadata, "input") ? metadata?.input : undefined,
|
|
191
195
|
result: hasMetadataKey(metadata, "result") ? metadata?.result : undefined,
|
|
192
196
|
mcpApp: mcpAppMetadata(metadata),
|
|
197
|
+
chatUI: chatUIMetadata(metadata),
|
|
193
198
|
activities: toolType === "activity" ? [event.message] : [],
|
|
194
199
|
startedAt: toolType === "tool_start" ? event.createdAt : undefined,
|
|
195
200
|
completedAt: toolType === "tool_done" ? event.createdAt : undefined,
|
|
@@ -426,4 +431,7 @@ function mcpAppMetadata(metadata) {
|
|
|
426
431
|
}
|
|
427
432
|
return candidate;
|
|
428
433
|
}
|
|
434
|
+
function chatUIMetadata(metadata) {
|
|
435
|
+
return normalizeActionChatUIConfig(metadata?.chatUI);
|
|
436
|
+
}
|
|
429
437
|
//# sourceMappingURL=transcript-normalizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-normalizer.js","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\nimport type { AgentMcpAppPayload } from \"../mcp-client/app-result.js\";\n\nexport type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\n\nexport type NormalizedCodeAgentTranscriptItem =\n | NormalizedCodeAgentUserTurn\n | NormalizedCodeAgentAssistantTurn\n | NormalizedCodeAgentToolEvent\n | NormalizedCodeAgentStatusEvent\n | NormalizedCodeAgentThinkingEvent;\n\nexport interface NormalizedCodeAgentTranscript {\n items: NormalizedCodeAgentTranscriptItem[];\n rawEvents: CodeAgentTranscriptEvent[];\n hiddenEvents: CodeAgentTranscriptEvent[];\n}\n\nexport interface NormalizedCodeAgentTranscriptBase {\n id: string;\n createdAt: string;\n updatedAt: string;\n eventIds: string[];\n events: CodeAgentTranscriptEvent[];\n turnIndex: number;\n}\n\nexport interface NormalizedCodeAgentUserTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"user\";\n role: \"user\";\n text: string;\n}\n\nexport interface NormalizedCodeAgentAssistantTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"assistant\";\n role: \"assistant\";\n text: string;\n source: \"system\" | \"runner-stdout\";\n suppressedDuplicateEventIds?: string[];\n}\n\nexport interface NormalizedCodeAgentToolEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"tool\";\n tool?: string;\n label: string;\n state: \"activity\" | \"running\" | \"completed\";\n input?: unknown;\n result?: unknown;\n mcpApp?: AgentMcpAppPayload;\n activities: string[];\n startedAt?: string;\n completedAt?: string;\n /**\n * Structured metadata from the tool execution side-channel. Present on\n * bash/edit/write/read tool events when the executor is new enough to emit\n * it. Absent on old transcript events — UI must handle both cases.\n */\n structuredMeta?: Record<string, unknown>;\n}\n\nexport interface NormalizedCodeAgentStatusEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"status\";\n level: \"info\" | \"warning\" | \"error\" | \"approval\";\n text: string;\n statusKind: CodeAgentTranscriptEvent[\"kind\"];\n status?: string;\n phase?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Accumulated reasoning/thinking text emitted during a model's extended\n * thinking phase. Rendered as a collapsed-by-default \"Thinking…\" cell.\n */\nexport interface NormalizedCodeAgentThinkingEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"thinking\";\n text: string;\n}\n\nexport function normalizeCodeAgentTranscript(\n events: readonly CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscript {\n const items: NormalizedCodeAgentTranscriptItem[] = [];\n const hiddenEvents: CodeAgentTranscriptEvent[] = [];\n const eventOrder = new Map(events.map((event, index) => [event.id, index]));\n let turnIndex = -1;\n\n for (const event of events) {\n const currentTurnIndex = Math.max(turnIndex, 0);\n if (event.kind === \"user\") {\n turnIndex = turnIndex < 0 ? (items.length === 0 ? 0 : 1) : turnIndex + 1;\n items.push(createUserTurn(event, turnIndex));\n continue;\n }\n\n const assistantSource = assistantTextSource(event);\n if (assistantSource) {\n const text = assistantTextForEvent(event, assistantSource);\n if (!text) {\n hiddenEvents.push(event);\n continue;\n }\n const previous = items.at(-1);\n if (\n previous?.type === \"assistant\" &&\n previous.source === assistantSource &&\n previous.turnIndex === currentTurnIndex\n ) {\n appendAssistantChunk(previous, event, text);\n } else {\n items.push(\n createAssistantTurn(event, assistantSource, currentTurnIndex, text),\n );\n }\n continue;\n }\n\n if (isThinkingEvent(event)) {\n appendThinkingChunk(items, event, currentTurnIndex);\n continue;\n }\n\n const toolType = toolEventType(event);\n if (toolType) {\n appendToolEvent(items, event, toolType, currentTurnIndex);\n continue;\n }\n\n if (shouldShowStatusEvent(event)) {\n items.push(createStatusEvent(event, currentTurnIndex));\n } else {\n hiddenEvents.push(event);\n }\n }\n\n const dedupedItems = suppressDuplicateFinalAssistantText(items, hiddenEvents);\n hiddenEvents.sort(\n (a, b) => (eventOrder.get(a.id) ?? 0) - (eventOrder.get(b.id) ?? 0),\n );\n\n return {\n items: dedupedItems,\n rawEvents: [...events],\n hiddenEvents,\n };\n}\n\nfunction createUserTurn(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentUserTurn {\n return {\n type: \"user\",\n role: \"user\",\n id: event.id,\n text: event.message,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction createAssistantTurn(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n turnIndex: number,\n text: string,\n): NormalizedCodeAgentAssistantTurn {\n return {\n type: \"assistant\",\n role: \"assistant\",\n id: event.id,\n text,\n source,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendAssistantChunk(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n text: string,\n): void {\n item.text = shouldAppendAssistantChunkExactly(item, event)\n ? `${item.text}${text}`\n : joinAssistantChunks(item.text, text);\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n}\n\nfunction isThinkingEvent(event: CodeAgentTranscriptEvent): boolean {\n return (\n event.kind === \"status\" &&\n stringMetadata(event.metadata, \"type\") === \"thinking\"\n );\n}\n\nfunction appendThinkingChunk(\n items: NormalizedCodeAgentTranscriptItem[],\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): void {\n const previous = items.at(-1);\n if (previous?.type === \"thinking\" && previous.turnIndex === turnIndex) {\n // Accumulate consecutive thinking chunks into one cell.\n previous.text = `${previous.text}${event.message}`;\n previous.updatedAt = event.createdAt;\n previous.eventIds.push(event.id);\n previous.events.push(event);\n return;\n }\n const thinkingItem: NormalizedCodeAgentThinkingEvent = {\n type: \"thinking\",\n id: event.id,\n text: event.message,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n items.push(thinkingItem);\n}\n\nfunction createStatusEvent(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentStatusEvent {\n const metadata = event.metadata;\n return {\n type: \"status\",\n id: event.id,\n text: event.message,\n level: statusEventLevel(event),\n statusKind: event.kind,\n status: stringMetadata(metadata, \"status\"),\n phase: stringMetadata(metadata, \"phase\"),\n metadata,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendToolEvent(\n items: NormalizedCodeAgentTranscriptItem[],\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): void {\n const tool = stringMetadata(event.metadata, \"tool\");\n const item = findOpenToolEvent(items, tool, turnIndex);\n\n if (!item) {\n items.push(createToolEvent(event, toolType, turnIndex));\n return;\n }\n\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n\n if (toolType === \"activity\") {\n item.activities.push(event.message);\n if (item.state === \"activity\") item.label = event.message;\n return;\n }\n\n if (toolType === \"tool_start\") {\n const wasActivity = item.state === \"activity\";\n item.state = \"running\";\n item.startedAt = item.startedAt ?? event.createdAt;\n if (hasMetadataKey(event.metadata, \"input\")) {\n item.input = event.metadata?.input;\n }\n if (wasActivity || item.label === item.activities.at(-1)) {\n item.label = event.message;\n }\n const startMeta = structuredMetadata(event.metadata);\n if (startMeta) item.structuredMeta = startMeta;\n return;\n }\n\n item.state = \"completed\";\n item.completedAt = event.createdAt;\n if (hasMetadataKey(event.metadata, \"result\")) {\n item.result = event.metadata?.result;\n }\n const mcpApp = mcpAppMetadata(event.metadata);\n if (mcpApp) item.mcpApp = mcpApp;\n const doneMeta = structuredMetadata(event.metadata);\n if (doneMeta) item.structuredMeta = doneMeta;\n}\n\nfunction createToolEvent(\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): NormalizedCodeAgentToolEvent {\n const metadata = event.metadata;\n const state =\n toolType === \"tool_done\"\n ? \"completed\"\n : toolType === \"tool_start\"\n ? \"running\"\n : \"activity\";\n return {\n type: \"tool\",\n id: event.id,\n tool: stringMetadata(metadata, \"tool\"),\n label: event.message,\n state,\n input: hasMetadataKey(metadata, \"input\") ? metadata?.input : undefined,\n result: hasMetadataKey(metadata, \"result\") ? metadata?.result : undefined,\n mcpApp: mcpAppMetadata(metadata),\n activities: toolType === \"activity\" ? [event.message] : [],\n startedAt: toolType === \"tool_start\" ? event.createdAt : undefined,\n completedAt: toolType === \"tool_done\" ? event.createdAt : undefined,\n structuredMeta: structuredMetadata(metadata),\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction findOpenToolEvent(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n tool: string | undefined,\n turnIndex: number,\n): NormalizedCodeAgentToolEvent | null {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item.type !== \"tool\") continue;\n if (item.turnIndex !== turnIndex) continue;\n if (item.state === \"completed\") continue;\n if (tool && item.tool !== tool) continue;\n if (!tool && item.tool) continue;\n return item;\n }\n return null;\n}\n\nfunction suppressDuplicateFinalAssistantText(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n hiddenEvents: CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscriptItem[] {\n const result: NormalizedCodeAgentTranscriptItem[] = [];\n\n for (const item of items) {\n if (item.type !== \"assistant\" || item.source !== \"system\") {\n result.push(item);\n continue;\n }\n\n const stdoutItems = result.filter(\n (candidate): candidate is NormalizedCodeAgentAssistantTurn =>\n candidate.type === \"assistant\" &&\n candidate.source === \"runner-stdout\" &&\n candidate.turnIndex === item.turnIndex,\n );\n if (\n stdoutItems.length === 0 ||\n !isSameAssistantText(\n stdoutItems.map((candidate) => candidate.text).join(\" \"),\n item.text,\n )\n ) {\n result.push(item);\n continue;\n }\n\n hiddenEvents.push(...item.events);\n const target =\n stdoutItems.length === 1 ? stdoutItems[0] : stdoutItems.at(-1);\n if (!target) continue;\n if (stdoutItems.length === 1) {\n target.text = item.text;\n target.updatedAt = item.updatedAt;\n }\n target.eventIds.push(...item.eventIds);\n target.events.push(...item.events);\n target.suppressedDuplicateEventIds = [\n ...(target.suppressedDuplicateEventIds ?? []),\n ...item.eventIds,\n ];\n }\n\n return result;\n}\n\nfunction shouldShowStatusEvent(event: CodeAgentTranscriptEvent): boolean {\n if (event.kind === \"artifact\" || event.kind === \"note\") return true;\n if (event.kind !== \"status\") return false;\n // Thinking events are handled separately by appendThinkingChunk; never\n // render them again as plain status entries.\n if (isThinkingEvent(event)) return false;\n if (isLowSignalLifecycleEvent(event)) return false;\n return true;\n}\n\nfunction isLowSignalLifecycleEvent(event: CodeAgentTranscriptEvent): boolean {\n const metadata = event.metadata;\n const type = stringMetadata(metadata, \"type\");\n if (type === \"mcp-tools-connected\") return true;\n if (statusEventLevel(event) !== \"info\") return false;\n\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n if (status === \"queued\" || status === \"running\" || status === \"completed\") {\n return true;\n }\n if (\n phase === \"queued\" ||\n phase === \"starting\" ||\n phase === \"executing\" ||\n phase === \"follow-up\" ||\n phase === \"complete\"\n ) {\n return true;\n }\n\n return LOW_SIGNAL_STATUS_MESSAGES.some((pattern) =>\n pattern.test(event.message),\n );\n}\n\nconst LOW_SIGNAL_STATUS_MESSAGES = [\n /^Agent-Native Code run started\\.?$/i,\n /^Agent-Native Code run completed\\.?$/i,\n /^Agent-Native Code process exited\\.?$/i,\n /^Starting local Agent-Native Code execution\\.?$/i,\n /^Remote Agent-Native Code run queued\\.?$/i,\n /^Connected \\d+ MCP tools? for this run\\.?$/i,\n];\n\nfunction statusEventLevel(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentStatusEvent[\"level\"] {\n const metadata = event.metadata;\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n const source = stringMetadata(metadata, \"source\");\n const type = stringMetadata(metadata, \"type\");\n\n if (\n status === \"needs-approval\" ||\n Boolean(metadata?.pendingApproval) ||\n Boolean(metadata?.pendingApprovalId) ||\n Boolean(metadata?.approvalId) ||\n phase?.includes(\"approval\") ||\n /\\bapproval\\b/i.test(event.message)\n ) {\n return \"approval\";\n }\n\n if (\n event.kind === \"status\" &&\n (status === \"errored\" ||\n type === \"error\" ||\n type?.endsWith(\"-error\") ||\n Boolean(metadata?.failed) ||\n typeof metadata?.errorCode === \"string\" ||\n source === \"runner-stderr\")\n ) {\n return \"error\";\n }\n\n if (\n status === \"paused\" ||\n phase === \"missing-credentials\" ||\n phase === \"stopped\" ||\n /\\b(missing|stopped|unavailable|denied)\\b/i.test(event.message)\n ) {\n return \"warning\";\n }\n\n return \"info\";\n}\n\nfunction assistantTextSource(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentAssistantTurn[\"source\"] | null {\n const source = stringMetadata(event.metadata, \"source\");\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"assistant_delta\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"status\" && source === \"runner-stdout\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"system\" || event.metadata?.role === \"assistant\") {\n return \"system\";\n }\n return null;\n}\n\nfunction shouldAppendAssistantChunkExactly(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n): boolean {\n return (\n item.source === \"runner-stdout\" &&\n (isAssistantDeltaEvent(event) || item.events.some(isAssistantDeltaEvent))\n );\n}\n\nfunction isAssistantDeltaEvent(event: CodeAgentTranscriptEvent): boolean {\n return stringMetadata(event.metadata, \"type\") === \"assistant_delta\";\n}\n\nfunction assistantTextForEvent(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n): string {\n if (source === \"runner-stdout\") {\n return stripRunnerDiagnostics(event.message, {\n trim: !isAssistantDeltaEvent(event),\n });\n }\n return event.message;\n}\n\nfunction stripRunnerDiagnostics(\n value: string,\n options: { trim?: boolean } = {},\n): string {\n const stripped = value\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.engineDetect, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.builderEngine, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.sessionStartedBanner, \"\");\n return options.trim === false ? stripped : stripped.trim();\n}\n\nconst RUNNER_DIAGNOSTIC_LINE_PATTERNS = {\n engineDetect: /^\\[engine-detect\\][^\\r\\n]*(?:\\r?\\n|$)/gm,\n builderEngine: /^\\[builder-engine\\]\\s*[←→][^\\r\\n]*(?:\\r?\\n|$)/gm,\n // Strip the \"Agent-Native Code session started.\" banner block that the CLI\n // prints to stdout at the start of every run. It is informational for\n // terminal users but clutters the chat transcript.\n sessionStartedBanner:\n /\\n?Agent-Native Code session started\\.[\\s\\S]*?Streaming output below\\. The transcript is saved with this run\\.\\n?/,\n};\n\nfunction toolEventType(\n event: CodeAgentTranscriptEvent,\n): \"activity\" | \"tool_done\" | \"tool_start\" | null {\n if (event.kind !== \"status\") return null;\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"activity\" || type === \"tool_done\" || type === \"tool_start\") {\n return type;\n }\n return null;\n}\n\nfunction joinAssistantChunks(previous: string, next: string): string {\n if (!previous) return next;\n if (!next) return previous;\n if (/\\s$/.test(previous) || /^\\s/.test(next)) return `${previous}${next}`;\n if (/^[.,!?;:)\\]}'\"`]/.test(next)) return `${previous}${next}`;\n if (/[(\\[{'\"`]$/.test(previous)) return `${previous}${next}`;\n return `${previous} ${next}`;\n}\n\nfunction canonicalText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction isSameAssistantText(left: string, right: string): boolean {\n if (canonicalText(left) === canonicalText(right)) return true;\n return compactText(left) === compactText(right);\n}\n\nfunction compactText(value: string): string {\n return canonicalText(value).replace(/\\s+/g, \"\");\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction hasMetadataKey(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): boolean {\n return (\n Boolean(metadata) && Object.prototype.hasOwnProperty.call(metadata, key)\n );\n}\n\nfunction structuredMetadata(\n metadata: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n const value = metadata?.structuredMeta;\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction mcpAppMetadata(\n metadata: Record<string, unknown> | undefined,\n): AgentMcpAppPayload | undefined {\n const value = metadata?.mcpApp;\n if (!value || typeof value !== \"object\") return undefined;\n const candidate = value as Partial<AgentMcpAppPayload>;\n if (\n typeof candidate.serverId !== \"string\" ||\n typeof candidate.originalToolName !== \"string\" ||\n typeof candidate.resourceUri !== \"string\" ||\n !candidate.resourceUri.startsWith(\"ui://\")\n ) {\n return undefined;\n }\n return candidate as AgentMcpAppPayload;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transcript-normalizer.js","sourceRoot":"","sources":["../../src/code-agents/transcript-normalizer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n normalizeActionChatUIConfig,\n type ActionChatUIConfig,\n} from \"../action-ui.js\";\nimport type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\nimport type { AgentMcpAppPayload } from \"../mcp-client/app-result.js\";\n\nexport type { CodeAgentTranscriptEvent } from \"../cli/code-agent-runs.js\";\n\nexport type NormalizedCodeAgentTranscriptItem =\n | NormalizedCodeAgentUserTurn\n | NormalizedCodeAgentAssistantTurn\n | NormalizedCodeAgentToolEvent\n | NormalizedCodeAgentStatusEvent\n | NormalizedCodeAgentThinkingEvent;\n\nexport interface NormalizedCodeAgentTranscript {\n items: NormalizedCodeAgentTranscriptItem[];\n rawEvents: CodeAgentTranscriptEvent[];\n hiddenEvents: CodeAgentTranscriptEvent[];\n}\n\nexport interface NormalizedCodeAgentTranscriptBase {\n id: string;\n createdAt: string;\n updatedAt: string;\n eventIds: string[];\n events: CodeAgentTranscriptEvent[];\n turnIndex: number;\n}\n\nexport interface NormalizedCodeAgentUserTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"user\";\n role: \"user\";\n text: string;\n}\n\nexport interface NormalizedCodeAgentAssistantTurn extends NormalizedCodeAgentTranscriptBase {\n type: \"assistant\";\n role: \"assistant\";\n text: string;\n source: \"system\" | \"runner-stdout\";\n suppressedDuplicateEventIds?: string[];\n}\n\nexport interface NormalizedCodeAgentToolEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"tool\";\n tool?: string;\n label: string;\n state: \"activity\" | \"running\" | \"completed\";\n input?: unknown;\n result?: unknown;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n activities: string[];\n startedAt?: string;\n completedAt?: string;\n /**\n * Structured metadata from the tool execution side-channel. Present on\n * bash/edit/write/read tool events when the executor is new enough to emit\n * it. Absent on old transcript events — UI must handle both cases.\n */\n structuredMeta?: Record<string, unknown>;\n}\n\nexport interface NormalizedCodeAgentStatusEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"status\";\n level: \"info\" | \"warning\" | \"error\" | \"approval\";\n text: string;\n statusKind: CodeAgentTranscriptEvent[\"kind\"];\n status?: string;\n phase?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Accumulated reasoning/thinking text emitted during a model's extended\n * thinking phase. Rendered as a collapsed-by-default \"Thinking…\" cell.\n */\nexport interface NormalizedCodeAgentThinkingEvent extends NormalizedCodeAgentTranscriptBase {\n type: \"thinking\";\n text: string;\n}\n\nexport function normalizeCodeAgentTranscript(\n events: readonly CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscript {\n const items: NormalizedCodeAgentTranscriptItem[] = [];\n const hiddenEvents: CodeAgentTranscriptEvent[] = [];\n const eventOrder = new Map(events.map((event, index) => [event.id, index]));\n let turnIndex = -1;\n\n for (const event of events) {\n const currentTurnIndex = Math.max(turnIndex, 0);\n if (event.kind === \"user\") {\n turnIndex = turnIndex < 0 ? (items.length === 0 ? 0 : 1) : turnIndex + 1;\n items.push(createUserTurn(event, turnIndex));\n continue;\n }\n\n const assistantSource = assistantTextSource(event);\n if (assistantSource) {\n const text = assistantTextForEvent(event, assistantSource);\n if (!text) {\n hiddenEvents.push(event);\n continue;\n }\n const previous = items.at(-1);\n if (\n previous?.type === \"assistant\" &&\n previous.source === assistantSource &&\n previous.turnIndex === currentTurnIndex\n ) {\n appendAssistantChunk(previous, event, text);\n } else {\n items.push(\n createAssistantTurn(event, assistantSource, currentTurnIndex, text),\n );\n }\n continue;\n }\n\n if (isThinkingEvent(event)) {\n appendThinkingChunk(items, event, currentTurnIndex);\n continue;\n }\n\n const toolType = toolEventType(event);\n if (toolType) {\n appendToolEvent(items, event, toolType, currentTurnIndex);\n continue;\n }\n\n if (shouldShowStatusEvent(event)) {\n items.push(createStatusEvent(event, currentTurnIndex));\n } else {\n hiddenEvents.push(event);\n }\n }\n\n const dedupedItems = suppressDuplicateFinalAssistantText(items, hiddenEvents);\n hiddenEvents.sort(\n (a, b) => (eventOrder.get(a.id) ?? 0) - (eventOrder.get(b.id) ?? 0),\n );\n\n return {\n items: dedupedItems,\n rawEvents: [...events],\n hiddenEvents,\n };\n}\n\nfunction createUserTurn(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentUserTurn {\n return {\n type: \"user\",\n role: \"user\",\n id: event.id,\n text: event.message,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction createAssistantTurn(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n turnIndex: number,\n text: string,\n): NormalizedCodeAgentAssistantTurn {\n return {\n type: \"assistant\",\n role: \"assistant\",\n id: event.id,\n text,\n source,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendAssistantChunk(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n text: string,\n): void {\n item.text = shouldAppendAssistantChunkExactly(item, event)\n ? `${item.text}${text}`\n : joinAssistantChunks(item.text, text);\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n}\n\nfunction isThinkingEvent(event: CodeAgentTranscriptEvent): boolean {\n return (\n event.kind === \"status\" &&\n stringMetadata(event.metadata, \"type\") === \"thinking\"\n );\n}\n\nfunction appendThinkingChunk(\n items: NormalizedCodeAgentTranscriptItem[],\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): void {\n const previous = items.at(-1);\n if (previous?.type === \"thinking\" && previous.turnIndex === turnIndex) {\n // Accumulate consecutive thinking chunks into one cell.\n previous.text = `${previous.text}${event.message}`;\n previous.updatedAt = event.createdAt;\n previous.eventIds.push(event.id);\n previous.events.push(event);\n return;\n }\n const thinkingItem: NormalizedCodeAgentThinkingEvent = {\n type: \"thinking\",\n id: event.id,\n text: event.message,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n items.push(thinkingItem);\n}\n\nfunction createStatusEvent(\n event: CodeAgentTranscriptEvent,\n turnIndex: number,\n): NormalizedCodeAgentStatusEvent {\n const metadata = event.metadata;\n return {\n type: \"status\",\n id: event.id,\n text: event.message,\n level: statusEventLevel(event),\n statusKind: event.kind,\n status: stringMetadata(metadata, \"status\"),\n phase: stringMetadata(metadata, \"phase\"),\n metadata,\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction appendToolEvent(\n items: NormalizedCodeAgentTranscriptItem[],\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): void {\n const tool = stringMetadata(event.metadata, \"tool\");\n const item = findOpenToolEvent(items, tool, turnIndex);\n\n if (!item) {\n items.push(createToolEvent(event, toolType, turnIndex));\n return;\n }\n\n item.updatedAt = event.createdAt;\n item.eventIds.push(event.id);\n item.events.push(event);\n\n if (toolType === \"activity\") {\n item.activities.push(event.message);\n if (item.state === \"activity\") item.label = event.message;\n return;\n }\n\n if (toolType === \"tool_start\") {\n const wasActivity = item.state === \"activity\";\n item.state = \"running\";\n item.startedAt = item.startedAt ?? event.createdAt;\n if (hasMetadataKey(event.metadata, \"input\")) {\n item.input = event.metadata?.input;\n }\n if (wasActivity || item.label === item.activities.at(-1)) {\n item.label = event.message;\n }\n const startMeta = structuredMetadata(event.metadata);\n if (startMeta) item.structuredMeta = startMeta;\n return;\n }\n\n item.state = \"completed\";\n item.completedAt = event.createdAt;\n if (hasMetadataKey(event.metadata, \"result\")) {\n item.result = event.metadata?.result;\n }\n const mcpApp = mcpAppMetadata(event.metadata);\n if (mcpApp) item.mcpApp = mcpApp;\n const chatUI = chatUIMetadata(event.metadata);\n if (chatUI) item.chatUI = chatUI;\n const doneMeta = structuredMetadata(event.metadata);\n if (doneMeta) item.structuredMeta = doneMeta;\n}\n\nfunction createToolEvent(\n event: CodeAgentTranscriptEvent,\n toolType: \"activity\" | \"tool_done\" | \"tool_start\",\n turnIndex: number,\n): NormalizedCodeAgentToolEvent {\n const metadata = event.metadata;\n const state =\n toolType === \"tool_done\"\n ? \"completed\"\n : toolType === \"tool_start\"\n ? \"running\"\n : \"activity\";\n return {\n type: \"tool\",\n id: event.id,\n tool: stringMetadata(metadata, \"tool\"),\n label: event.message,\n state,\n input: hasMetadataKey(metadata, \"input\") ? metadata?.input : undefined,\n result: hasMetadataKey(metadata, \"result\") ? metadata?.result : undefined,\n mcpApp: mcpAppMetadata(metadata),\n chatUI: chatUIMetadata(metadata),\n activities: toolType === \"activity\" ? [event.message] : [],\n startedAt: toolType === \"tool_start\" ? event.createdAt : undefined,\n completedAt: toolType === \"tool_done\" ? event.createdAt : undefined,\n structuredMeta: structuredMetadata(metadata),\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n eventIds: [event.id],\n events: [event],\n turnIndex,\n };\n}\n\nfunction findOpenToolEvent(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n tool: string | undefined,\n turnIndex: number,\n): NormalizedCodeAgentToolEvent | null {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item.type !== \"tool\") continue;\n if (item.turnIndex !== turnIndex) continue;\n if (item.state === \"completed\") continue;\n if (tool && item.tool !== tool) continue;\n if (!tool && item.tool) continue;\n return item;\n }\n return null;\n}\n\nfunction suppressDuplicateFinalAssistantText(\n items: readonly NormalizedCodeAgentTranscriptItem[],\n hiddenEvents: CodeAgentTranscriptEvent[],\n): NormalizedCodeAgentTranscriptItem[] {\n const result: NormalizedCodeAgentTranscriptItem[] = [];\n\n for (const item of items) {\n if (item.type !== \"assistant\" || item.source !== \"system\") {\n result.push(item);\n continue;\n }\n\n const stdoutItems = result.filter(\n (candidate): candidate is NormalizedCodeAgentAssistantTurn =>\n candidate.type === \"assistant\" &&\n candidate.source === \"runner-stdout\" &&\n candidate.turnIndex === item.turnIndex,\n );\n if (\n stdoutItems.length === 0 ||\n !isSameAssistantText(\n stdoutItems.map((candidate) => candidate.text).join(\" \"),\n item.text,\n )\n ) {\n result.push(item);\n continue;\n }\n\n hiddenEvents.push(...item.events);\n const target =\n stdoutItems.length === 1 ? stdoutItems[0] : stdoutItems.at(-1);\n if (!target) continue;\n if (stdoutItems.length === 1) {\n target.text = item.text;\n target.updatedAt = item.updatedAt;\n }\n target.eventIds.push(...item.eventIds);\n target.events.push(...item.events);\n target.suppressedDuplicateEventIds = [\n ...(target.suppressedDuplicateEventIds ?? []),\n ...item.eventIds,\n ];\n }\n\n return result;\n}\n\nfunction shouldShowStatusEvent(event: CodeAgentTranscriptEvent): boolean {\n if (event.kind === \"artifact\" || event.kind === \"note\") return true;\n if (event.kind !== \"status\") return false;\n // Thinking events are handled separately by appendThinkingChunk; never\n // render them again as plain status entries.\n if (isThinkingEvent(event)) return false;\n if (isLowSignalLifecycleEvent(event)) return false;\n return true;\n}\n\nfunction isLowSignalLifecycleEvent(event: CodeAgentTranscriptEvent): boolean {\n const metadata = event.metadata;\n const type = stringMetadata(metadata, \"type\");\n if (type === \"mcp-tools-connected\") return true;\n if (statusEventLevel(event) !== \"info\") return false;\n\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n if (status === \"queued\" || status === \"running\" || status === \"completed\") {\n return true;\n }\n if (\n phase === \"queued\" ||\n phase === \"starting\" ||\n phase === \"executing\" ||\n phase === \"follow-up\" ||\n phase === \"complete\"\n ) {\n return true;\n }\n\n return LOW_SIGNAL_STATUS_MESSAGES.some((pattern) =>\n pattern.test(event.message),\n );\n}\n\nconst LOW_SIGNAL_STATUS_MESSAGES = [\n /^Agent-Native Code run started\\.?$/i,\n /^Agent-Native Code run completed\\.?$/i,\n /^Agent-Native Code process exited\\.?$/i,\n /^Starting local Agent-Native Code execution\\.?$/i,\n /^Remote Agent-Native Code run queued\\.?$/i,\n /^Connected \\d+ MCP tools? for this run\\.?$/i,\n];\n\nfunction statusEventLevel(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentStatusEvent[\"level\"] {\n const metadata = event.metadata;\n const status = stringMetadata(metadata, \"status\");\n const phase = stringMetadata(metadata, \"phase\");\n const source = stringMetadata(metadata, \"source\");\n const type = stringMetadata(metadata, \"type\");\n\n if (\n status === \"needs-approval\" ||\n Boolean(metadata?.pendingApproval) ||\n Boolean(metadata?.pendingApprovalId) ||\n Boolean(metadata?.approvalId) ||\n phase?.includes(\"approval\") ||\n /\\bapproval\\b/i.test(event.message)\n ) {\n return \"approval\";\n }\n\n if (\n event.kind === \"status\" &&\n (status === \"errored\" ||\n type === \"error\" ||\n type?.endsWith(\"-error\") ||\n Boolean(metadata?.failed) ||\n typeof metadata?.errorCode === \"string\" ||\n source === \"runner-stderr\")\n ) {\n return \"error\";\n }\n\n if (\n status === \"paused\" ||\n phase === \"missing-credentials\" ||\n phase === \"stopped\" ||\n /\\b(missing|stopped|unavailable|denied)\\b/i.test(event.message)\n ) {\n return \"warning\";\n }\n\n return \"info\";\n}\n\nfunction assistantTextSource(\n event: CodeAgentTranscriptEvent,\n): NormalizedCodeAgentAssistantTurn[\"source\"] | null {\n const source = stringMetadata(event.metadata, \"source\");\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"assistant_delta\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"status\" && source === \"runner-stdout\") {\n return \"runner-stdout\";\n }\n if (event.kind === \"system\" || event.metadata?.role === \"assistant\") {\n return \"system\";\n }\n return null;\n}\n\nfunction shouldAppendAssistantChunkExactly(\n item: NormalizedCodeAgentAssistantTurn,\n event: CodeAgentTranscriptEvent,\n): boolean {\n return (\n item.source === \"runner-stdout\" &&\n (isAssistantDeltaEvent(event) || item.events.some(isAssistantDeltaEvent))\n );\n}\n\nfunction isAssistantDeltaEvent(event: CodeAgentTranscriptEvent): boolean {\n return stringMetadata(event.metadata, \"type\") === \"assistant_delta\";\n}\n\nfunction assistantTextForEvent(\n event: CodeAgentTranscriptEvent,\n source: NormalizedCodeAgentAssistantTurn[\"source\"],\n): string {\n if (source === \"runner-stdout\") {\n return stripRunnerDiagnostics(event.message, {\n trim: !isAssistantDeltaEvent(event),\n });\n }\n return event.message;\n}\n\nfunction stripRunnerDiagnostics(\n value: string,\n options: { trim?: boolean } = {},\n): string {\n const stripped = value\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.engineDetect, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.builderEngine, \"\")\n .replace(RUNNER_DIAGNOSTIC_LINE_PATTERNS.sessionStartedBanner, \"\");\n return options.trim === false ? stripped : stripped.trim();\n}\n\nconst RUNNER_DIAGNOSTIC_LINE_PATTERNS = {\n engineDetect: /^\\[engine-detect\\][^\\r\\n]*(?:\\r?\\n|$)/gm,\n builderEngine: /^\\[builder-engine\\]\\s*[←→][^\\r\\n]*(?:\\r?\\n|$)/gm,\n // Strip the \"Agent-Native Code session started.\" banner block that the CLI\n // prints to stdout at the start of every run. It is informational for\n // terminal users but clutters the chat transcript.\n sessionStartedBanner:\n /\\n?Agent-Native Code session started\\.[\\s\\S]*?Streaming output below\\. The transcript is saved with this run\\.\\n?/,\n};\n\nfunction toolEventType(\n event: CodeAgentTranscriptEvent,\n): \"activity\" | \"tool_done\" | \"tool_start\" | null {\n if (event.kind !== \"status\") return null;\n const type = stringMetadata(event.metadata, \"type\");\n if (type === \"activity\" || type === \"tool_done\" || type === \"tool_start\") {\n return type;\n }\n return null;\n}\n\nfunction joinAssistantChunks(previous: string, next: string): string {\n if (!previous) return next;\n if (!next) return previous;\n if (/\\s$/.test(previous) || /^\\s/.test(next)) return `${previous}${next}`;\n if (/^[.,!?;:)\\]}'\"`]/.test(next)) return `${previous}${next}`;\n if (/[(\\[{'\"`]$/.test(previous)) return `${previous}${next}`;\n return `${previous} ${next}`;\n}\n\nfunction canonicalText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction isSameAssistantText(left: string, right: string): boolean {\n if (canonicalText(left) === canonicalText(right)) return true;\n return compactText(left) === compactText(right);\n}\n\nfunction compactText(value: string): string {\n return canonicalText(value).replace(/\\s+/g, \"\");\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction hasMetadataKey(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): boolean {\n return (\n Boolean(metadata) && Object.prototype.hasOwnProperty.call(metadata, key)\n );\n}\n\nfunction structuredMetadata(\n metadata: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n const value = metadata?.structuredMeta;\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction mcpAppMetadata(\n metadata: Record<string, unknown> | undefined,\n): AgentMcpAppPayload | undefined {\n const value = metadata?.mcpApp;\n if (!value || typeof value !== \"object\") return undefined;\n const candidate = value as Partial<AgentMcpAppPayload>;\n if (\n typeof candidate.serverId !== \"string\" ||\n typeof candidate.originalToolName !== \"string\" ||\n typeof candidate.resourceUri !== \"string\" ||\n !candidate.resourceUri.startsWith(\"ui://\")\n ) {\n return undefined;\n }\n return candidate as AgentMcpAppPayload;\n}\n\nfunction chatUIMetadata(\n metadata: Record<string, unknown> | undefined,\n): ActionChatUIConfig | undefined {\n return normalizeActionChatUIConfig(metadata?.chatUI);\n}\n"]}
|