@agent-native/core 0.98.3 → 0.98.5
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 +29 -0
- package/corpus/core/docs/content/durable-background-runs.mdx +37 -0
- package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/de-DE/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/es-ES/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +4 -2
- package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +2 -0
- package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
- package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +2 -0
- package/corpus/core/docs/content/tracking.mdx +2 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/durable-background.ts +16 -16
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +25 -8
- package/corpus/core/src/agent/engine/anthropic-engine.ts +17 -3
- package/corpus/core/src/agent/engine/output-tokens.ts +6 -6
- package/corpus/core/src/agent/production-agent.ts +200 -27
- package/corpus/core/src/agent/run-manager.ts +81 -1
- package/corpus/core/src/agent/run-store.ts +301 -41
- package/corpus/core/src/client/AgentPanel.tsx +6 -2
- package/corpus/core/src/client/AssistantChat.tsx +364 -69
- package/corpus/core/src/client/agent-chat-adapter.ts +169 -1
- package/corpus/core/src/client/analytics.ts +12 -0
- package/corpus/core/src/client/chat/message-components.tsx +3 -0
- package/corpus/core/src/client/chat/tool-call-display.tsx +20 -36
- package/corpus/core/src/client/conversation/use-near-bottom-autoscroll.ts +7 -0
- package/corpus/core/src/client/extensions/AgentNativeExtensionFrame.tsx +2 -0
- package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +2 -0
- package/corpus/core/src/client/extensions/ExtensionEditor.tsx +9 -2
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +2 -0
- package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +2 -0
- package/corpus/core/src/client/extensions/portable-extension.ts +2 -0
- package/corpus/core/src/client/session-replay.ts +971 -53
- package/corpus/core/src/client/settings/DemoModeSection.tsx +3 -3
- package/corpus/core/src/client/sse-event-processor.ts +43 -1
- package/corpus/core/src/demo/actions/toggle-demo-mode.ts +2 -2
- package/corpus/core/src/demo/config.ts +6 -6
- package/corpus/core/src/demo/fetch-interceptor.ts +34 -2
- package/corpus/core/src/demo/redact.ts +71 -158
- package/corpus/core/src/extensions/html-shell.ts +3 -0
- package/corpus/core/src/extensions/session-replay-iframe.ts +131 -0
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -20
- package/corpus/core/src/session-replay-iframe-protocol.ts +58 -0
- package/corpus/core/src/shared/reasoning-effort.ts +35 -0
- package/corpus/core/src/styles/agent-conversation.css +26 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +67 -16
- package/corpus/templates/analytics/AGENTS.md +12 -0
- package/corpus/templates/analytics/actions/get-error-issue.ts +1 -0
- package/corpus/templates/analytics/actions/get-session-replay-events.ts +1 -0
- package/corpus/templates/analytics/actions/get-session-replay-summary.ts +1 -0
- package/corpus/templates/analytics/actions/list-error-issues.ts +1 -0
- package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -0
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +2 -1
- package/corpus/templates/analytics/app/global.css +6 -64
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +41 -4
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +143 -121
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +34 -12
- package/corpus/templates/analytics/changelog/2026-07-12-analytics-chat-retries-before-showing-a-generic-no-data-mess.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-analytics-sessions-search-no-longer-loses-fast-keystrokes-an.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-chart-selection-respects-chat-state.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-anonymizes-error-reporting-emails.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-fixed-session-replays-that-appeared-ultra-wide-hid-recorded-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-session-replays-load-faster-in-demo-mode-while-visitor-email.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-session-replays-show-iframe-content.md +6 -0
- package/corpus/templates/analytics/netlify.toml +0 -3
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +14 -0
- package/corpus/templates/analytics/server/lib/error-capture.ts +59 -2
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +24 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +2 -9
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +39 -6
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/brain/app/global.css +2 -2
- package/corpus/templates/brain/changelog/2026-07-12-fix-long-response-progress.md +6 -0
- package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +11 -2
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +14 -2
- package/corpus/templates/calendar/changelog/2026-07-12-calendar-responses-can-now-be-saved-with-command-enter-or-ct.md +6 -0
- package/corpus/templates/forms/app/components/CloudUpgrade.tsx +1 -1
- package/corpus/templates/forms/app/components/ThemeToggle.tsx +22 -6
- package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +5 -5
- package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +3 -3
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +16 -16
- package/corpus/templates/forms/app/global.css +110 -5
- package/corpus/templates/forms/app/pages/AskPage.tsx +3 -3
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +134 -52
- package/corpus/templates/forms/app/pages/FormFillPage.tsx +44 -11
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +42 -24
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +28 -15
- package/corpus/templates/forms/app/pages/ResponsesPage.tsx +38 -15
- package/corpus/templates/forms/app/routes/_app.settings.tsx +1 -1
- package/corpus/templates/forms/changelog/2026-07-12-form-builder-surfaces-are-calmer-fields-stay-stable-on-hover.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-12-smoother-more-tactile-controls-throughout-animated-icon-and-.md +6 -0
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +21 -13
- package/corpus/templates/mail/app/components/email/email-iframe-document.ts +18 -0
- package/dist/agent/durable-background.d.ts +10 -10
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +16 -16
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +19 -8
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +11 -3
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/output-tokens.js +6 -6
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/production-agent.d.ts +52 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +154 -26
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +9 -0
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +71 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +9 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +243 -48
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +6 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +21 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +298 -67
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +146 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +11 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +2 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +13 -37
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.js +6 -0
- package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.js +2 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +2 -1
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionEditor.js +5 -2
- package/dist/client/extensions/ExtensionEditor.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +2 -1
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
- package/dist/client/extensions/InlineExtensionFrame.js +2 -1
- package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js +2 -0
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/session-replay.d.ts +12 -3
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +793 -49
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/DemoModeSection.js +1 -1
- package/dist/client/settings/DemoModeSection.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +5 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +37 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/demo/actions/toggle-demo-mode.js +2 -2
- package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
- package/dist/demo/config.js +6 -6
- package/dist/demo/config.js.map +1 -1
- package/dist/demo/fetch-interceptor.d.ts +1 -0
- package/dist/demo/fetch-interceptor.d.ts.map +1 -1
- package/dist/demo/fetch-interceptor.js +28 -2
- package/dist/demo/fetch-interceptor.js.map +1 -1
- package/dist/demo/redact.d.ts +14 -7
- package/dist/demo/redact.d.ts.map +1 -1
- package/dist/demo/redact.js +27 -155
- package/dist/demo/redact.js.map +1 -1
- package/dist/extensions/html-shell.d.ts.map +1 -1
- package/dist/extensions/html-shell.js +2 -0
- package/dist/extensions/html-shell.js.map +1 -1
- package/dist/extensions/session-replay-iframe.d.ts +10 -0
- package/dist/extensions/session-replay-iframe.d.ts.map +1 -0
- package/dist/extensions/session-replay-iframe.js +121 -0
- package/dist/extensions/session-replay-iframe.js.map +1 -0
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -19
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/session-replay-iframe-protocol.d.ts +36 -0
- package/dist/session-replay-iframe-protocol.d.ts.map +1 -0
- package/dist/session-replay-iframe-protocol.js +24 -0
- package/dist/session-replay-iframe-protocol.js.map +1 -0
- package/dist/shared/reasoning-effort.d.ts +11 -0
- package/dist/shared/reasoning-effort.d.ts.map +1 -1
- package/dist/shared/reasoning-effort.js +36 -0
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/styles/agent-conversation.css +26 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
- package/docs/content/durable-background-runs.mdx +37 -0
- package/docs/content/locales/ar-SA/tracking.mdx +2 -0
- package/docs/content/locales/de-DE/tracking.mdx +2 -0
- package/docs/content/locales/es-ES/tracking.mdx +2 -0
- package/docs/content/locales/fr-FR/tracking.mdx +4 -2
- package/docs/content/locales/hi-IN/tracking.mdx +2 -0
- package/docs/content/locales/ja-JP/tracking.mdx +2 -0
- package/docs/content/locales/ko-KR/tracking.mdx +2 -0
- package/docs/content/locales/pt-BR/tracking.mdx +2 -0
- package/docs/content/locales/zh-CN/tracking.mdx +2 -0
- package/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
- package/docs/content/locales/zh-TW/tracking.mdx +2 -0
- package/docs/content/tracking.mdx +2 -0
- package/package.json +2 -2
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
- package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
- package/dist/observability/hosted-model-experiment.d.ts +0 -39
- package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
- package/dist/observability/hosted-model-experiment.js +0 -90
- package/dist/observability/hosted-model-experiment.js.map +0 -1
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
import { getAgentAppModelDefaultForCurrentRequest } from "../../agent/app-model-defaults.js";
|
|
5
5
|
import { DEFAULT_MODEL } from "../../agent/default-model.js";
|
|
6
6
|
import { listAgentEngines, registerBuiltinEngines, detectEngineFromEnv, detectEngineFromUserSecrets, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, normalizeModelForEngine, } from "../../agent/engine/index.js";
|
|
7
|
-
import { resolveHostedDefaultModelExperiment } from "../../observability/hosted-model-experiment.js";
|
|
8
|
-
import { getRequestUserEmail } from "../../server/request-context.js";
|
|
9
7
|
import { getSetting } from "../../settings/index.js";
|
|
10
8
|
export const tool = {
|
|
11
9
|
description: 'List all available AI agent engines (Anthropic, OpenAI, Gemini, Groq, etc.) and the currently selected engine. Use this to check what engines are available before calling manage-agent-engine with action="set".',
|
|
@@ -61,19 +59,9 @@ export async function run(args = {}) {
|
|
|
61
59
|
? current?.model
|
|
62
60
|
: undefined;
|
|
63
61
|
const currentEngineName = currentEntry?.name ?? "anthropic";
|
|
64
|
-
|
|
62
|
+
const currentModel = currentEntry && !envUnavailable
|
|
65
63
|
? normalizeModelForEngine(currentEntry, currentModelCandidate ?? currentEntry.defaultModel)
|
|
66
64
|
: (currentModelCandidate ?? DEFAULT_MODEL);
|
|
67
|
-
const hostedExperiment = currentEntry && !currentModelCandidate
|
|
68
|
-
? resolveHostedDefaultModelExperiment({
|
|
69
|
-
userId: getRequestUserEmail(),
|
|
70
|
-
engineName: currentEntry.name,
|
|
71
|
-
isDefaultModelSelection: true,
|
|
72
|
-
supportedModels: currentEntry.supportedModels,
|
|
73
|
-
})
|
|
74
|
-
: null;
|
|
75
|
-
if (hostedExperiment)
|
|
76
|
-
currentModel = hostedExperiment.model;
|
|
77
65
|
const result = {
|
|
78
66
|
engines: engines.map((e) => ({
|
|
79
67
|
name: e.name,
|
|
@@ -91,12 +79,6 @@ export async function run(args = {}) {
|
|
|
91
79
|
: {
|
|
92
80
|
engine: currentEngineName,
|
|
93
81
|
model: currentModel,
|
|
94
|
-
...(hostedExperiment
|
|
95
|
-
? {
|
|
96
|
-
modelSelectionSource: "experiment",
|
|
97
|
-
experimentAssignment: hostedExperiment.assignment,
|
|
98
|
-
}
|
|
99
|
-
: {}),
|
|
100
82
|
},
|
|
101
83
|
};
|
|
102
84
|
return JSON.stringify(result, null, 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-agent-engines.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,wCAAwC,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,mBAAmB,EACnB,6BAA6B,EAC7B,8BAA8B,EAC9B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list-agent-engines.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * list-agent-engines — returns the registered engine registry and current selection.\n */\n\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../../agent/app-model-defaults.js\";\nimport { DEFAULT_MODEL } from \"../../agent/default-model.js\";\nimport {\n listAgentEngines,\n registerBuiltinEngines,\n detectEngineFromEnv,\n detectEngineFromUserSecrets,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n isStoredEngineUsableForRequest,\n normalizeModelForEngine,\n} from \"../../agent/engine/index.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\nimport { getSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'List all available AI agent engines (Anthropic, OpenAI, Gemini, Groq, etc.) and the currently selected engine. Use this to check what engines are available before calling manage-agent-engine with action=\"set\".',\n parameters: {\n type: \"object\",\n properties: {},\n required: [],\n },\n};\n\nexport async function run(args: Record<string, string> = {}): Promise<string> {\n registerBuiltinEngines();\n\n const engines = listAgentEngines();\n const currentSetting = await getSetting(\"agent-engine\");\n const current = currentSetting\n ? (currentSetting as { engine?: string; model?: string })\n : null;\n\n // Same priority chain resolveEngine uses after explicit request options:\n // AGENT_ENGINE → app default → stored (if usable) → user/Builder app_secrets\n // → env → anthropic. Gating stored/app defaults on the request-aware helper\n // keeps the picker in step with the runtime.\n const storedEntry =\n typeof current?.engine === \"string\"\n ? getAgentEngineEntry(current.engine)\n : undefined;\n const storedUsable =\n !!storedEntry &&\n (await isStoredEngineUsableForRequest(current, storedEntry));\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(args.appId);\n const appDefaultEntry =\n typeof appDefault?.engine === \"string\"\n ? getAgentEngineEntry(appDefault.engine)\n : undefined;\n const appDefaultUsable =\n !!appDefault &&\n !!appDefaultEntry &&\n (await isStoredEngineUsableForRequest(appDefault, appDefaultEntry));\n const detectedFromUser = await detectEngineFromUserSecrets();\n const envEntry = process.env.AGENT_ENGINE\n ? getAgentEngineEntry(process.env.AGENT_ENGINE)\n : undefined;\n const envUsable =\n !!envEntry &&\n (await isStoredEngineUsableForRequest({ engine: envEntry.name }, envEntry));\n const envUnavailable = !!envEntry && !envUsable;\n const detectedFromEnv = detectEngineFromEnv();\n const envSelectedEntry = envUsable ? envEntry : undefined;\n\n const currentEntry = envUnavailable\n ? undefined\n : (envSelectedEntry ??\n (appDefaultUsable ? appDefaultEntry : undefined) ??\n (storedUsable ? storedEntry : undefined) ??\n detectedFromUser ??\n detectedFromEnv ??\n undefined);\n const currentModelCandidate =\n appDefaultUsable && currentEntry?.name === appDefault?.engine\n ? appDefault?.model\n : storedUsable && currentEntry?.name === current?.engine\n ? current?.model\n : undefined;\n const currentEngineName = currentEntry?.name ?? \"anthropic\";\n const currentModel =\n currentEntry && !envUnavailable\n ? normalizeModelForEngine(\n currentEntry,\n currentModelCandidate ?? currentEntry.defaultModel,\n )\n : (currentModelCandidate ?? DEFAULT_MODEL);\n const result = {\n engines: engines.map((e) => ({\n name: e.name,\n label: e.label,\n description: e.description,\n defaultModel: e.defaultModel,\n supportedModels: e.supportedModels,\n capabilities: e.capabilities,\n requiredEnvVars: e.requiredEnvVars,\n installPackage: e.installPackage,\n packageInstalled: isAgentEnginePackageInstalled(e),\n })),\n current: envUnavailable\n ? null\n : {\n engine: currentEngineName,\n model: currentModel,\n },\n };\n\n return JSON.stringify(result, null, 2);\n}\n"]}
|
|
@@ -27,11 +27,11 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
|
|
|
27
27
|
export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
28
28
|
error: any;
|
|
29
29
|
} | {
|
|
30
|
+
error?: undefined;
|
|
30
31
|
ok: boolean;
|
|
31
32
|
key: string;
|
|
32
33
|
baseUrlKey?: string;
|
|
33
34
|
scope: AgentEngineApiKeyScope;
|
|
34
|
-
error?: undefined;
|
|
35
35
|
}>>;
|
|
36
36
|
export {};
|
|
37
37
|
//# sourceMappingURL=agent-engine-api-key-route.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const SESSION_REPLAY_IFRAME_ATTRIBUTE = "data-agent-native-session-replay";
|
|
2
|
+
export declare const SESSION_REPLAY_IFRAME_PROBE = "agent-native-session-replay:probe";
|
|
3
|
+
export declare const SESSION_REPLAY_IFRAME_START = "agent-native-session-replay:start";
|
|
4
|
+
export declare const SESSION_REPLAY_IFRAME_STOP = "agent-native-session-replay:stop";
|
|
5
|
+
export interface SessionReplayIframePrivacyOptions {
|
|
6
|
+
blockSelector: string;
|
|
7
|
+
ignoreSelector: string;
|
|
8
|
+
maskTextClass?: string | RegExp;
|
|
9
|
+
maskTextSelector: string;
|
|
10
|
+
maskAllInputs: boolean;
|
|
11
|
+
maskInputOptions?: Record<string, boolean>;
|
|
12
|
+
recordCanvas: boolean;
|
|
13
|
+
collectFonts: boolean;
|
|
14
|
+
inlineImages: boolean;
|
|
15
|
+
sampling: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface SessionReplayIframeProbeMessage {
|
|
18
|
+
type: typeof SESSION_REPLAY_IFRAME_PROBE;
|
|
19
|
+
}
|
|
20
|
+
export interface SessionReplayIframeStartMessage {
|
|
21
|
+
type: typeof SESSION_REPLAY_IFRAME_START;
|
|
22
|
+
options: SessionReplayIframePrivacyOptions;
|
|
23
|
+
}
|
|
24
|
+
export interface SessionReplayIframeStopMessage {
|
|
25
|
+
type: typeof SESSION_REPLAY_IFRAME_STOP;
|
|
26
|
+
}
|
|
27
|
+
export type SessionReplayIframeMessage = SessionReplayIframeProbeMessage | SessionReplayIframeStartMessage | SessionReplayIframeStopMessage;
|
|
28
|
+
/**
|
|
29
|
+
* `srcdoc` HTML came from the immediate parent, so that parent already owns the
|
|
30
|
+
* document being rendered. Server-rendered extension URLs are stricter: only a
|
|
31
|
+
* parent on the render URL's origin may activate recording. That supports
|
|
32
|
+
* custom app domains without allowing an external embed host to make an opaque
|
|
33
|
+
* extension frame disclose its DOM through rrweb's postMessage transport.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isTrustedSessionReplayIframeParentOrigin(parentOrigin: string, frameHref: string): boolean;
|
|
36
|
+
//# sourceMappingURL=session-replay-iframe-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-replay-iframe-protocol.d.ts","sourceRoot":"","sources":["../src/session-replay-iframe-protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B,qCACR,CAAC;AACrC,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAE7E,MAAM,WAAW,iCAAiC;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,OAAO,2BAA2B,CAAC;CAC1C;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,OAAO,2BAA2B,CAAC;IACzC,OAAO,EAAE,iCAAiC,CAAC;CAC5C;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,OAAO,0BAA0B,CAAC;CACzC;AAED,MAAM,MAAM,0BAA0B,GAClC,+BAA+B,GAC/B,+BAA+B,GAC/B,8BAA8B,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,wCAAwC,CACtD,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAUT"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const SESSION_REPLAY_IFRAME_ATTRIBUTE = "data-agent-native-session-replay";
|
|
2
|
+
export const SESSION_REPLAY_IFRAME_PROBE = "agent-native-session-replay:probe";
|
|
3
|
+
export const SESSION_REPLAY_IFRAME_START = "agent-native-session-replay:start";
|
|
4
|
+
export const SESSION_REPLAY_IFRAME_STOP = "agent-native-session-replay:stop";
|
|
5
|
+
/**
|
|
6
|
+
* `srcdoc` HTML came from the immediate parent, so that parent already owns the
|
|
7
|
+
* document being rendered. Server-rendered extension URLs are stricter: only a
|
|
8
|
+
* parent on the render URL's origin may activate recording. That supports
|
|
9
|
+
* custom app domains without allowing an external embed host to make an opaque
|
|
10
|
+
* extension frame disclose its DOM through rrweb's postMessage transport.
|
|
11
|
+
*/
|
|
12
|
+
export function isTrustedSessionReplayIframeParentOrigin(parentOrigin, frameHref) {
|
|
13
|
+
if (frameHref === "about:srcdoc") {
|
|
14
|
+
return parentOrigin !== "null" && parentOrigin !== "";
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const frameOrigin = new URL(frameHref).origin;
|
|
18
|
+
return frameOrigin !== "null" && parentOrigin === frameOrigin;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=session-replay-iframe-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-replay-iframe-protocol.js","sourceRoot":"","sources":["../src/session-replay-iframe-protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,+BAA+B,GAC1C,kCAAkC,CAAC;AACrC,MAAM,CAAC,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAiC7E;;;;;;GAMG;AACH,MAAM,UAAU,wCAAwC,CACtD,YAAoB,EACpB,SAAiB;IAEjB,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAC9C,OAAO,WAAW,KAAK,MAAM,IAAI,YAAY,KAAK,WAAW,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["export const SESSION_REPLAY_IFRAME_ATTRIBUTE =\n \"data-agent-native-session-replay\";\nexport const SESSION_REPLAY_IFRAME_PROBE = \"agent-native-session-replay:probe\";\nexport const SESSION_REPLAY_IFRAME_START = \"agent-native-session-replay:start\";\nexport const SESSION_REPLAY_IFRAME_STOP = \"agent-native-session-replay:stop\";\n\nexport interface SessionReplayIframePrivacyOptions {\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass?: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n sampling: Record<string, unknown>;\n}\n\nexport interface SessionReplayIframeProbeMessage {\n type: typeof SESSION_REPLAY_IFRAME_PROBE;\n}\n\nexport interface SessionReplayIframeStartMessage {\n type: typeof SESSION_REPLAY_IFRAME_START;\n options: SessionReplayIframePrivacyOptions;\n}\n\nexport interface SessionReplayIframeStopMessage {\n type: typeof SESSION_REPLAY_IFRAME_STOP;\n}\n\nexport type SessionReplayIframeMessage =\n | SessionReplayIframeProbeMessage\n | SessionReplayIframeStartMessage\n | SessionReplayIframeStopMessage;\n\n/**\n * `srcdoc` HTML came from the immediate parent, so that parent already owns the\n * document being rendered. Server-rendered extension URLs are stricter: only a\n * parent on the render URL's origin may activate recording. That supports\n * custom app domains without allowing an external embed host to make an opaque\n * extension frame disclose its DOM through rrweb's postMessage transport.\n */\nexport function isTrustedSessionReplayIframeParentOrigin(\n parentOrigin: string,\n frameHref: string,\n): boolean {\n if (frameHref === \"about:srcdoc\") {\n return parentOrigin !== \"null\" && parentOrigin !== \"\";\n }\n try {\n const frameOrigin = new URL(frameHref).origin;\n return frameOrigin !== \"null\" && parentOrigin === frameOrigin;\n } catch {\n return false;\n }\n}\n"]}
|
|
@@ -26,4 +26,15 @@ export declare function reasoningEffortLabel(effort: ReasoningEffort | undefined
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function resolveReasoningEffortSelection(model: string | undefined, effort: ReasoningEffort | undefined): ReasoningEffort;
|
|
28
28
|
export declare function stepDownReasoningEffort(effort: ReasoningEffort | undefined): ReasoningEffort | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Anthropic's adaptive-thinking API is only available on the newer Claude
|
|
31
|
+
* model families. Claude Haiku 4.5 is reasoning-capable, but it still
|
|
32
|
+
* requires the legacy manual `budget_tokens` configuration.
|
|
33
|
+
*/
|
|
34
|
+
export declare function supportsClaudeAdaptiveThinking(model: string | undefined): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Map the shared reasoning ladder to Anthropic's manual thinking budgets for
|
|
37
|
+
* models that do not support adaptive thinking (currently Claude Haiku 4.5).
|
|
38
|
+
*/
|
|
39
|
+
export declare function anthropicManualThinkingBudget(effort: ReasoningEffort): 1024 | 4096 | 8000 | 16000 | 32000;
|
|
29
40
|
//# sourceMappingURL=reasoning-effort.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,CACG,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASnE,CAAC;AAsBF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,EAAE,CAcnB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,UAIvE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,CAOjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B"}
|
|
1
|
+
{"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,CACG,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASnE,CAAC;AAsBF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,EAAE,CAcnB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,UAIvE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,CAOjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAgBD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,WAOvE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,sCAepE"}
|
|
@@ -136,6 +136,42 @@ function isClaudeReasoningModel(model) {
|
|
|
136
136
|
const opusMatch = id.match(/opus-4[-.](\d+)/);
|
|
137
137
|
return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;
|
|
138
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Anthropic's adaptive-thinking API is only available on the newer Claude
|
|
141
|
+
* model families. Claude Haiku 4.5 is reasoning-capable, but it still
|
|
142
|
+
* requires the legacy manual `budget_tokens` configuration.
|
|
143
|
+
*/
|
|
144
|
+
export function supportsClaudeAdaptiveThinking(model) {
|
|
145
|
+
if (!model)
|
|
146
|
+
return false;
|
|
147
|
+
const id = model.toLowerCase().replace(/^anthropic\//, "");
|
|
148
|
+
if (id.includes("fable-5") || id.includes("mythos-5"))
|
|
149
|
+
return true;
|
|
150
|
+
if (id.includes("sonnet-5") || id.includes("sonnet-4-6"))
|
|
151
|
+
return true;
|
|
152
|
+
const opusMatch = id.match(/opus-4[-.](\d+)/);
|
|
153
|
+
return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Map the shared reasoning ladder to Anthropic's manual thinking budgets for
|
|
157
|
+
* models that do not support adaptive thinking (currently Claude Haiku 4.5).
|
|
158
|
+
*/
|
|
159
|
+
export function anthropicManualThinkingBudget(effort) {
|
|
160
|
+
switch (effort) {
|
|
161
|
+
case "low":
|
|
162
|
+
return 1_024;
|
|
163
|
+
case "medium":
|
|
164
|
+
return 4_096;
|
|
165
|
+
case "high":
|
|
166
|
+
return 8_000;
|
|
167
|
+
case "xhigh":
|
|
168
|
+
return 16_000;
|
|
169
|
+
case "max":
|
|
170
|
+
return 32_000;
|
|
171
|
+
default:
|
|
172
|
+
return 4_096;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
139
175
|
function supportsClaudeXHigh(model) {
|
|
140
176
|
const id = model.toLowerCase().replace(/^anthropic\//, "");
|
|
141
177
|
// Models that support the xhigh effort tier (built-in extended thinking via
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"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","sourcesContent":["export const REASONING_EFFORTS = [\n \"auto\",\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\n\nexport type ReasoningEffort = (typeof REASONING_EFFORTS)[number];\n\n/**\n * Shared chat always chooses an explicit reasoning tier. Keep `auto` in the\n * accepted type only so older persisted selections and external callers can\n * migrate cleanly; new UI and engine defaults resolve it to Medium.\n */\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport const REASONING_EFFORT_LABELS: Record<ReasoningEffort, string> = {\n auto: \"Auto\",\n none: \"None\",\n minimal: \"Minimal\",\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n xhigh: \"Extra High\",\n max: \"Max\",\n};\n\nconst VISIBLE_STANDARD_EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\"];\n\nconst VISIBLE_GPT_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n];\n\nconst VISIBLE_CLAUDE_BUILT_IN_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n \"max\",\n];\n\nconst VISIBLE_CLAUDE_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"max\",\n];\n\nconst effortSet = new Set<string>(REASONING_EFFORTS);\n\nexport function isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && effortSet.has(value);\n}\n\nexport function getReasoningEffortOptionsForModel(\n model: string | undefined,\n): ReasoningEffort[] {\n if (!model) return [];\n if (isGPTReasoningModel(model)) {\n return VISIBLE_GPT_EFFORTS;\n }\n if (isClaudeReasoningModel(model)) {\n return supportsClaudeXHigh(model)\n ? VISIBLE_CLAUDE_BUILT_IN_EFFORTS\n : VISIBLE_CLAUDE_EFFORTS;\n }\n if (isGeminiReasoningModel(model)) {\n return VISIBLE_STANDARD_EFFORTS;\n }\n return [];\n}\n\nexport function normalizeReasoningEffortForModel(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!model) return undefined;\n let normalized =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n if (\n normalized === \"xhigh\" &&\n isClaudeReasoningModel(model) &&\n !supportsClaudeXHigh(model)\n ) {\n normalized = \"high\";\n }\n if (normalized === \"max\" && isGPTReasoningModel(model)) {\n normalized = \"xhigh\";\n }\n const options = getReasoningEffortOptionsForModel(model);\n if (!options.length || !options.includes(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/**\n * Normalize a chat request before it reaches an engine. Explicit off/minimal\n * sentinels must survive this layer so the engine can distinguish them from a\n * missing selection, which now means the Medium default.\n */\nexport function normalizeReasoningEffortForRequest(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (effort === \"none\" || effort === \"minimal\") return effort;\n return normalizeReasoningEffortForModel(model, effort);\n}\n\nexport function reasoningEffortLabel(effort: ReasoningEffort | undefined) {\n return REASONING_EFFORT_LABELS[\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort\n ];\n}\n\n/**\n * Resolve a user-facing selection for a model. Legacy `auto`, missing values,\n * and tiers unsupported by the newly selected model all become Medium.\n * Non-reasoning models still retain Medium in persisted chat state so moving\n * back to a reasoning model has a predictable default; their engines omit the\n * effort through `normalizeReasoningEffortForModel`.\n */\nexport function resolveReasoningEffortSelection(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort {\n const requested =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n const options = getReasoningEffortOptionsForModel(model);\n return options.length === 0 || options.includes(requested)\n ? requested\n : DEFAULT_REASONING_EFFORT;\n}\n\n/**\n * One tier down from each effort, stopping at \"minimal\" — legacy `auto`,\n * \"none\", and \"minimal\" itself are left unchanged. Used by the\n * empty-final-response retry so a retried turn asks for meaningfully less\n * reasoning instead of repeating the exact request that came back empty.\n */\nconst REASONING_EFFORT_STEP_DOWN: Partial<\n Record<ReasoningEffort, ReasoningEffort>\n> = {\n max: \"xhigh\",\n xhigh: \"high\",\n high: \"medium\",\n medium: \"low\",\n low: \"minimal\",\n};\n\nexport function stepDownReasoningEffort(\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!effort) return effort;\n return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;\n}\n\nfunction isGPTReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^openai\\//, \"\");\n return /^gpt-5/.test(id) || /^o\\d/.test(id);\n}\n\nfunction isClaudeReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n if (id.includes(\"haiku-4-5\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\nfunction supportsClaudeXHigh(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n // Models that support the xhigh effort tier (built-in extended thinking via\n // output_config.effort). Keep this version-aware so any future Claude model\n // with a higher patch/minor number is automatically included rather than\n // silently falling back to the lower \"high\" tier.\n // claude-fable-5 is a Mythos-class model and also supports xhigh.\n if (id.includes(\"fable-5\")) return true;\n // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.\n if (id.includes(\"sonnet-5\")) return true;\n // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n if (opusMatch) {\n return parseInt(opusMatch[1], 10) >= 7;\n }\n return false;\n}\n\nfunction isGeminiReasoningModel(model: string) {\n return /^gemini-/.test(model.toLowerCase().replace(/^google\\//, \"\"));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"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","sourcesContent":["export const REASONING_EFFORTS = [\n \"auto\",\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\n\nexport type ReasoningEffort = (typeof REASONING_EFFORTS)[number];\n\n/**\n * Shared chat always chooses an explicit reasoning tier. Keep `auto` in the\n * accepted type only so older persisted selections and external callers can\n * migrate cleanly; new UI and engine defaults resolve it to Medium.\n */\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport const REASONING_EFFORT_LABELS: Record<ReasoningEffort, string> = {\n auto: \"Auto\",\n none: \"None\",\n minimal: \"Minimal\",\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n xhigh: \"Extra High\",\n max: \"Max\",\n};\n\nconst VISIBLE_STANDARD_EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\"];\n\nconst VISIBLE_GPT_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n];\n\nconst VISIBLE_CLAUDE_BUILT_IN_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n \"max\",\n];\n\nconst VISIBLE_CLAUDE_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"max\",\n];\n\nconst effortSet = new Set<string>(REASONING_EFFORTS);\n\nexport function isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && effortSet.has(value);\n}\n\nexport function getReasoningEffortOptionsForModel(\n model: string | undefined,\n): ReasoningEffort[] {\n if (!model) return [];\n if (isGPTReasoningModel(model)) {\n return VISIBLE_GPT_EFFORTS;\n }\n if (isClaudeReasoningModel(model)) {\n return supportsClaudeXHigh(model)\n ? VISIBLE_CLAUDE_BUILT_IN_EFFORTS\n : VISIBLE_CLAUDE_EFFORTS;\n }\n if (isGeminiReasoningModel(model)) {\n return VISIBLE_STANDARD_EFFORTS;\n }\n return [];\n}\n\nexport function normalizeReasoningEffortForModel(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!model) return undefined;\n let normalized =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n if (\n normalized === \"xhigh\" &&\n isClaudeReasoningModel(model) &&\n !supportsClaudeXHigh(model)\n ) {\n normalized = \"high\";\n }\n if (normalized === \"max\" && isGPTReasoningModel(model)) {\n normalized = \"xhigh\";\n }\n const options = getReasoningEffortOptionsForModel(model);\n if (!options.length || !options.includes(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/**\n * Normalize a chat request before it reaches an engine. Explicit off/minimal\n * sentinels must survive this layer so the engine can distinguish them from a\n * missing selection, which now means the Medium default.\n */\nexport function normalizeReasoningEffortForRequest(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (effort === \"none\" || effort === \"minimal\") return effort;\n return normalizeReasoningEffortForModel(model, effort);\n}\n\nexport function reasoningEffortLabel(effort: ReasoningEffort | undefined) {\n return REASONING_EFFORT_LABELS[\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort\n ];\n}\n\n/**\n * Resolve a user-facing selection for a model. Legacy `auto`, missing values,\n * and tiers unsupported by the newly selected model all become Medium.\n * Non-reasoning models still retain Medium in persisted chat state so moving\n * back to a reasoning model has a predictable default; their engines omit the\n * effort through `normalizeReasoningEffortForModel`.\n */\nexport function resolveReasoningEffortSelection(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort {\n const requested =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n const options = getReasoningEffortOptionsForModel(model);\n return options.length === 0 || options.includes(requested)\n ? requested\n : DEFAULT_REASONING_EFFORT;\n}\n\n/**\n * One tier down from each effort, stopping at \"minimal\" — legacy `auto`,\n * \"none\", and \"minimal\" itself are left unchanged. Used by the\n * empty-final-response retry so a retried turn asks for meaningfully less\n * reasoning instead of repeating the exact request that came back empty.\n */\nconst REASONING_EFFORT_STEP_DOWN: Partial<\n Record<ReasoningEffort, ReasoningEffort>\n> = {\n max: \"xhigh\",\n xhigh: \"high\",\n high: \"medium\",\n medium: \"low\",\n low: \"minimal\",\n};\n\nexport function stepDownReasoningEffort(\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!effort) return effort;\n return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;\n}\n\nfunction isGPTReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^openai\\//, \"\");\n return /^gpt-5/.test(id) || /^o\\d/.test(id);\n}\n\nfunction isClaudeReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n if (id.includes(\"haiku-4-5\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Anthropic's adaptive-thinking API is only available on the newer Claude\n * model families. Claude Haiku 4.5 is reasoning-capable, but it still\n * requires the legacy manual `budget_tokens` configuration.\n */\nexport function supportsClaudeAdaptiveThinking(model: string | undefined) {\n if (!model) return false;\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Map the shared reasoning ladder to Anthropic's manual thinking budgets for\n * models that do not support adaptive thinking (currently Claude Haiku 4.5).\n */\nexport function anthropicManualThinkingBudget(effort: ReasoningEffort) {\n switch (effort) {\n case \"low\":\n return 1_024;\n case \"medium\":\n return 4_096;\n case \"high\":\n return 8_000;\n case \"xhigh\":\n return 16_000;\n case \"max\":\n return 32_000;\n default:\n return 4_096;\n }\n}\n\nfunction supportsClaudeXHigh(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n // Models that support the xhigh effort tier (built-in extended thinking via\n // output_config.effort). Keep this version-aware so any future Claude model\n // with a higher patch/minor number is automatically included rather than\n // silently falling back to the lower \"high\" tier.\n // claude-fable-5 is a Mythos-class model and also supports xhigh.\n if (id.includes(\"fable-5\")) return true;\n // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.\n if (id.includes(\"sonnet-5\")) return true;\n // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n if (opusMatch) {\n return parseInt(opusMatch[1], 10) >= 7;\n }\n return false;\n}\n\nfunction isGeminiReasoningModel(model: string) {\n return /^gemini-/.test(model.toLowerCase().replace(/^google\\//, \"\"));\n}\n"]}
|
|
@@ -493,6 +493,32 @@
|
|
|
493
493
|
-webkit-mask-image: linear-gradient(to bottom, transparent, black 1.5rem);
|
|
494
494
|
}
|
|
495
495
|
|
|
496
|
+
.agent-chat-collapse {
|
|
497
|
+
display: grid;
|
|
498
|
+
grid-template-rows: 1fr;
|
|
499
|
+
opacity: 1;
|
|
500
|
+
transition:
|
|
501
|
+
grid-template-rows 200ms var(--ease-collapse),
|
|
502
|
+
opacity 150ms ease-out;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
.agent-chat-collapse[data-state="closed"] {
|
|
506
|
+
grid-template-rows: 0fr;
|
|
507
|
+
opacity: 0;
|
|
508
|
+
pointer-events: none;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.agent-chat-collapse__content {
|
|
512
|
+
min-height: 0;
|
|
513
|
+
overflow: hidden;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
@media (prefers-reduced-motion: reduce) {
|
|
517
|
+
.agent-chat-collapse {
|
|
518
|
+
transition-duration: 0.01ms;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
496
522
|
/* ─── Agent-Markdown (AssistantChat react-markdown render surface) ─────────── */
|
|
497
523
|
/* These classes are applied by the SmoothMarkdownText/MarkdownText components */
|
|
498
524
|
/* in the AssistantChat/AssistantChatInner tree. The shiki dual-theme rules */
|
|
@@ -158,21 +158,6 @@ The agent loop reads active experiments via `resolveActiveExperimentConfig()` an
|
|
|
158
158
|
|
|
159
159
|
Compute results with `POST /_agent-native/observability/experiments/:id/results`.
|
|
160
160
|
|
|
161
|
-
#### First-party hosted default-model rollout
|
|
162
|
-
|
|
163
|
-
First-party apps on `agent-native.com` automatically run the July 2026
|
|
164
|
-
default-model experiment for authenticated users on the Builder engine:
|
|
165
|
-
|
|
166
|
-
- 80% `claude-sonnet-5`
|
|
167
|
-
- 20% `gpt-5-6-luna`
|
|
168
|
-
- Assignment is sticky by normalized user email and shared across templates.
|
|
169
|
-
- The rollout applies only when the user, app, and deployment have not selected
|
|
170
|
-
a model. Explicit model choices and BYO provider engines always win.
|
|
171
|
-
- Set `AGENT_NATIVE_HOSTED_MODEL_EXPERIMENT=off` for an emergency rollback, or
|
|
172
|
-
`true` to exercise the rollout on a non-first-party preview.
|
|
173
|
-
- `$ai_generation` tracking includes `experiment_id`,
|
|
174
|
-
`experiment_variant`, and `model_selection_source` for central analysis.
|
|
175
|
-
|
|
176
161
|
In production, experiment management routes require the caller's email in the
|
|
177
162
|
comma-separated `AGENT_NATIVE_EXPERIMENT_ADMIN_EMAILS` allowlist. This gate is
|
|
178
163
|
separate from normal app/org admin roles because an experiment affects every
|
|
@@ -194,6 +194,43 @@ Durable runs are opt-in per app and default OFF. Enable with AGENT_CHAT_DURABLE_
|
|
|
194
194
|
|
|
195
195
|
</Callout>
|
|
196
196
|
|
|
197
|
+
## The foreground self-chain: a narrower, opt-in escape hatch {#foreground-self-chain}
|
|
198
|
+
|
|
199
|
+
A second, independent flag governs a different continuation mechanism:
|
|
200
|
+
`AGENT_CHAT_FOREGROUND_SELF_CHAIN`. Where durable background runs move a whole
|
|
201
|
+
long turn onto the 15-minute background function above, the foreground
|
|
202
|
+
self-chain lets a normal (non-durable-background) turn that hits its
|
|
203
|
+
soft-timeout chunk boundary continue via a server-side self-dispatch on the
|
|
204
|
+
**regular** request function, instead of depending on the client to re-POST
|
|
205
|
+
`auto_continue`.
|
|
206
|
+
|
|
207
|
+
It composes the same way as `AGENT_CHAT_DURABLE_BACKGROUND`: true only when
|
|
208
|
+
the env flag is explicitly truthy (`true` / `1` / `yes` / `on`), the runtime
|
|
209
|
+
is hosted, and `A2A_SECRET` is configured. The two flags are independent and
|
|
210
|
+
never need to agree — an app can enable this narrower capability without
|
|
211
|
+
opting into the full background-function worker path. When a run already
|
|
212
|
+
qualifies for durable background dispatch, that decision is evaluated first
|
|
213
|
+
and takes precedence; the run chains through the background worker instead of
|
|
214
|
+
this path.
|
|
215
|
+
|
|
216
|
+
<Callout id="doc-block-fgschn1" tone="warning">
|
|
217
|
+
|
|
218
|
+
This flag is **opt-in and default OFF**. A regular Netlify function has a
|
|
219
|
+
fixed **60-second** wall — far shorter than the 15-minute background-function
|
|
220
|
+
budget above — so a self-dispatched successor can be killed mid-run before it
|
|
221
|
+
persists its next continuation, cutting a long response off mid-sentence.
|
|
222
|
+
With the flag off, hosted apps use the existing client-driven `auto_continue`
|
|
223
|
+
re-POST path instead, which is slower to resume but cannot be killed by a
|
|
224
|
+
server-side timeout.
|
|
225
|
+
|
|
226
|
+
</Callout>
|
|
227
|
+
|
|
228
|
+
Only enable this once you've verified the hosted deployment's regular
|
|
229
|
+
function reliably completes self-dispatched continuations inside that
|
|
230
|
+
60-second wall. For long, multi-step turns, prefer
|
|
231
|
+
`AGENT_CHAT_DURABLE_BACKGROUND` above — its background function has a much
|
|
232
|
+
larger budget and is the recommended path.
|
|
233
|
+
|
|
197
234
|
## What's next
|
|
198
235
|
|
|
199
236
|
- [**Durable Resume**](/docs/durable-resume) — how an interrupted run resumes
|
|
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
|
|
|
238
238
|
- يتم تنظيف عناوين URL باستخدام نفس مساعد `scrubUrl()` المستخدم بواسطة تحليلات المتصفح.
|
|
239
239
|
- التقاط إعادة التشغيل مخصص للويب فقط وباختيار المستخدم؛ فهو لا يسجل شاشات سطح المكتب الأصلية.
|
|
240
240
|
|
|
241
|
+
تُضمَّن إطارات iframe التي يديرها إطار العمل، بما في ذلك الامتدادات ومحتوى البريد الإلكتروني المعروض، في التقاط إعادة التشغيل. تنطبق محددات الإخفاء والحظر نفسها داخل الإطارات المسجلة. يظل iframe تابع لجهة خارجية ومن أصل مختلف غير مرئي ما لم تُشغِّل وثيقته مسجِّل rrweb متوافقًا مع تمكين تسجيل إطارات iframe من أصول مختلفة؛ ولا يمكن للصفحة الأم تجاوز حدود الأصل التي يفرضها المتصفح.
|
|
242
|
+
|
|
241
243
|
أثناء التسجيل، تلتقط إعادة تشغيل الجلسة أيضًا مخرجات وحدة تحكم المتصفح (`log`، و`info`، و`warn`، و`error`، و`debug`، بالإضافة إلى `error` / `unhandledrejection` الخاصة بالنافذة) وبيانات وصفية لطلبات الشبكة (`fetch` و XHR) كأحداث rrweb مخصصة موسومة، بحيث يمكن للوكلاء وعارض إعادة التشغيل تصحيح المشكلات التي يبلغ عنها المستخدمون. الالتقاط مفعّل افتراضيًا عند تفعيل إعادة التشغيل؛ اضبطه أو عطّله باستخدام خياري `sessionReplay.console` و`sessionReplay.network`، حيث يقبل كل منهما قيمة منطقية (boolean) أو كائن خيارات (`{ maxEvents?: number }`، مع قبول `network` إضافيًا لـ `captureErrorBodies` و`maxErrorBodyLength`). لا يتم التقاط نصوص/رؤوس الطلبات مطلقًا؛ أما نصوص الاستجابات فلا تُلتقط إلا كمقتطف محدود ومُنقّح لاستجابات 5xx (أخطاء الخادم) فقط (`captureErrorBodies`، الافتراضي true، بحد أقصى `maxErrorBodyLength` حرفًا، الافتراضي 2048) — استجابات غير 5xx وحالات فشل الشبكة لا تحمل أي نص استجابة أبدًا. يتم تنظيف عناوين URL، ويتم اقتطاع الرسائل، ويُستثنى حركة استيعاب/تتبع المسجِّل نفسه، وتضيف ميزانيات كل جلسة (1000 حدث وحدة تحكم / 2000 حدث شبكة) إشعار اقتطاع عند تجاوزها.
|
|
242
244
|
|
|
243
245
|
يخزّن قالب Analytics بيانات إعادة التشغيل الوصفية في SQL (`session_recordings`) ويخزّن الأجزاء عبر مراجع blob خاصة (`session_replay_chunks`). لا تتلقى المتصفحات والوكلاء أبدًا عناوين URL الخاصة بالموفر. تمر إعادة التشغيل عبر مسارات خادم محددة النطاق، وتُرجع أدوات الوكيل الافتراضية ملخصات أو أحداث إعادة تشغيل محدودة، وليس وصولاً خامًا إلى جدول الأجزاء.
|
|
@@ -238,6 +238,8 @@ Die Datenschutz-Standardeinstellungen sind bewusst konservativ, aber für die Wi
|
|
|
238
238
|
- URLs werden mit demselben `scrubUrl()`-Helfer bereinigt, der auch von der Browser-Analyse verwendet wird.
|
|
239
239
|
- Die Replay-Aufzeichnung ist ausschließlich webbasiert und opt-in; native Desktop-Bildschirme werden nicht aufgezeichnet.
|
|
240
240
|
|
|
241
|
+
Framework-eigene iframes, einschließlich Erweiterungen und gerenderten E-Mail-Inhalten, werden in der Replay-Aufzeichnung erfasst. Innerhalb aufgezeichneter Frames gelten dieselben Maskierungs- und Blockierungsselektoren. Ein fremdes Cross-Origin-iframe bleibt undurchsichtig, sofern sein eigenes Dokument nicht einen kompatiblen rrweb-Recorder mit aktivierter Cross-Origin-iframe-Aufzeichnung ausführt; die Ursprungsgrenzen des Browsers können von der übergeordneten Seite nicht umgangen werden.
|
|
242
|
+
|
|
241
243
|
Während der Aufzeichnung erfasst Session Replay außerdem die Browser-Konsolenausgabe (`log`, `info`, `warn`, `error`, `debug`, sowie die Fenster-Ereignisse `error` / `unhandledrejection`) und Netzwerkanfrage-Metadaten (`fetch` und XHR) als getaggte rrweb-Custom-Events, damit Agenten und der Replay-Viewer von Nutzern gemeldete Probleme debuggen können. Die Erfassung ist standardmäßig aktiviert, wenn Replay aktiviert ist; passen Sie sie mit den Optionen `sessionReplay.console` und `sessionReplay.network` an oder deaktivieren Sie sie, wobei jede Option entweder einen booleschen Wert oder ein Optionsobjekt akzeptiert (`{ maxEvents?: number }`, wobei `network` zusätzlich `captureErrorBodies` und `maxErrorBodyLength` akzeptiert). Request-Bodies und -Header sowie Response-Header werden nie erfasst; Response-Bodies werden nur als begrenzter, redigierter Ausschnitt für 5xx-Antworten (Serverfehler) erfasst (`captureErrorBodies`, Standard true, begrenzt auf `maxErrorBodyLength` Zeichen, Standard 2048) — bei Antworten außerhalb des 5xx-Bereichs sowie bei Netzwerkfehlern wird nie ein Body mitgeführt. URLs werden bereinigt, Nachrichten werden gekürzt, der eigene Ingest-/Tracking-Traffic des Recorders wird ausgeschlossen, und sitzungsbezogene Budgets (1000 Konsolen- / 2000 Netzwerkereignisse) fügen bei Überschreitung einen Kürzungshinweis hinzu.
|
|
242
244
|
|
|
243
245
|
Das Analytics-Template speichert Replay-Metadaten in SQL (`session_recordings`) und Chunks über private Blob-Referenzen (`session_replay_chunks`). Browser und Agenten erhalten niemals Anbieter-URLs. Die Wiedergabe läuft über zugriffsbeschränkte Server-Routen, und die Standard-Agent-Tools liefern Zusammenfassungen oder begrenzte Replay-Ereignisse zurück, keinen Rohzugriff auf die Chunk-Tabelle.
|
|
@@ -238,6 +238,8 @@ Los valores predeterminados de privacidad son intencionalmente conservadores per
|
|
|
238
238
|
- Las URL se depuran con el mismo ayudante `scrubUrl()` que utiliza el análisis del navegador.
|
|
239
239
|
- La captura de repetición es solo para web y opcional; no graba pantallas de escritorio nativas.
|
|
240
240
|
|
|
241
|
+
Los iframes administrados por el framework, incluidas las extensiones y el contenido de correo electrónico renderizado, se incluyen en la captura de repetición. Los mismos selectores de enmascaramiento y bloqueo se aplican dentro de los frames grabados. Un iframe de terceros con origen distinto permanece opaco a menos que su propio documento ejecute un grabador rrweb compatible con la grabación de iframes de origen cruzado habilitada; la página principal no puede eludir los límites de origen del navegador.
|
|
242
|
+
|
|
241
243
|
Durante la grabación, la repetición de sesión también captura la salida de la consola del navegador (`log`, `info`, `warn`, `error`, `debug`, además de `error`/`unhandledrejection` de la ventana) y los metadatos de solicitudes de red (`fetch` y XHR) como eventos personalizados de rrweb etiquetados, para que los agentes y el visor de repeticiones puedan depurar los problemas reportados por los usuarios. La captura está habilitada de forma predeterminada cuando la repetición está activada; ajuste o desactive con las opciones `sessionReplay.console` y `sessionReplay.network`, cada una acepta un booleano o un objeto de opciones (`{ maxEvents?: number }`, y `network` acepta además `captureErrorBodies` y `maxErrorBodyLength`). Los cuerpos y encabezados de solicitud nunca se capturan; los cuerpos de respuesta solo se capturan como un fragmento acotado y redactado para respuestas 5xx (error del servidor) (`captureErrorBodies`, predeterminado true, limitado a `maxErrorBodyLength` caracteres, predeterminado 2048) — las respuestas que no son 5xx y los fallos de red nunca incluyen un cuerpo. Las URL se depuran, los mensajes se truncan, el propio tráfico de ingesta/seguimiento del grabador se excluye, y los presupuestos por sesión (1000 eventos de consola / 2000 eventos de red) agregan un aviso de truncamiento cuando se superan.
|
|
242
244
|
|
|
243
245
|
La plantilla de Analytics almacena los metadatos de repetición en SQL (`session_recordings`) y almacena los fragmentos mediante referencias de blob privadas (`session_replay_chunks`). Los navegadores y los agentes nunca reciben las URL del proveedor. La reproducción pasa por rutas del servidor con alcance limitado y las herramientas del agente predeterminadas devuelven resúmenes o eventos de repetición acotados, no acceso sin procesar a la tabla de fragmentos.
|
|
@@ -236,9 +236,11 @@ Les paramètres de confidentialité par défaut sont volontairement prudents tou
|
|
|
236
236
|
- Le texte de la page reste visible sauf si un élément est marqué avec `.an-mask` ou `data-an-mask`.
|
|
237
237
|
- Les zones sensibles sont bloquées avec des sélecteurs tels que `[data-sensitive]`, `.an-block`, `.an-private`, `data-an-block`, `data-an-private`, ainsi que les champs de type carte bancaire/mot de passe/numéro de sécurité sociale.
|
|
238
238
|
- Les URL sont nettoyées avec le même assistant `scrubUrl()` utilisé par les analyses du navigateur.
|
|
239
|
-
- La capture de relecture est réservée au web et opt-in
|
|
239
|
+
- La capture de relecture est réservée au web et opt-in ; elle n'enregistre pas les écrans natifs du bureau.
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
Les iframes gérées par le framework, notamment les extensions et le contenu d'e-mail rendu, sont incluses dans la capture de relecture. Les mêmes sélecteurs de masquage et de blocage s'appliquent dans les frames enregistrées. Une iframe tierce d'origine différente reste opaque, sauf si son propre document exécute un enregistreur rrweb compatible avec l'enregistrement des iframes inter-origines activé ; la page parente ne peut pas contourner les limites d'origine imposées par le navigateur.
|
|
242
|
+
|
|
243
|
+
Pendant l'enregistrement, la relecture de session capture également la sortie de la console du navigateur (`log`, `info`, `warn`, `error`, `debug`, ainsi que les événements globaux `error` / `unhandledrejection`) et les métadonnées des requêtes réseau (`fetch` et XHR) sous forme d'événements personnalisés rrweb balisés, afin que les agents et la visionneuse de relecture puissent déboguer les problèmes signalés par les utilisateurs. La capture est activée par défaut lorsque la relecture est activée ; ajustez-la ou désactivez-la avec les options `sessionReplay.console` et `sessionReplay.network`, chacune acceptant un booléen ou un objet d'options (`{ maxEvents?: number }`, `network` acceptant en plus `captureErrorBodies` et `maxErrorBodyLength`). Les corps et en-têtes des requêtes ne sont jamais capturés ; les corps des réponses ne sont capturés que sous forme d'extrait borné et expurgé pour les réponses 5xx (erreur serveur) (`captureErrorBodies`, activé par défaut, plafonné à `maxErrorBodyLength` caractères, 2048 par défaut) — les réponses hors 5xx et les échecs réseau ne comportent jamais de corps. Les URL sont nettoyées, les messages sont tronqués, le trafic d'ingestion/de suivi propre à l'enregistreur est exclu, et des budgets par session (1000 événements console / 2000 événements réseau) ajoutent une notice de troncature en cas de dépassement.
|
|
242
244
|
|
|
243
245
|
Le modèle Analytics stocke les métadonnées de relecture en SQL (`session_recordings`) et stocke les blocs via des références blob privées (`session_replay_chunks`). Les navigateurs et les agents ne reçoivent jamais les URL du fournisseur. La lecture passe par des routes serveur à portée limitée, et les outils d'agent par défaut renvoient des résumés ou des événements de relecture bornés, et non un accès brut à la table des blocs.
|
|
244
246
|
|
|
@@ -238,6 +238,8 @@ Session replay प्रत्येक ब्राउज़र session के
|
|
|
238
238
|
- URLs को ब्राउज़र एनालिटिक्स द्वारा उपयोग किए जाने वाले समान `scrubUrl()` हेल्पर के साथ स्क्रब किया जाता है।
|
|
239
239
|
- Replay capture केवल-वेब और ऑप्ट-इन है; यह नेटिव डेस्कटॉप स्क्रीन को रिकॉर्ड नहीं करता।
|
|
240
240
|
|
|
241
|
+
Framework के स्वामित्व वाले iframes, जिनमें extensions और render किया गया email content शामिल है, replay capture में शामिल किए जाते हैं। रिकॉर्ड किए गए frames के अंदर भी वही masking और blocking selectors लागू होते हैं। कोई third-party cross-origin iframe तब तक opaque रहता है जब तक उसका अपना document cross-origin iframe recording सक्षम किए हुए compatible rrweb recorder को न चलाए; parent page ब्राउज़र की origin boundaries को bypass नहीं कर सकता।
|
|
242
|
+
|
|
241
243
|
रिकॉर्डिंग के दौरान, session replay ब्राउज़र कंसोल आउटपुट (`log`, `info`, `warn`, `error`, `debug`, साथ ही window `error` / `unhandledrejection`) और नेटवर्क रिक्वेस्ट मेटाडेटा (`fetch` और XHR) को टैग किए गए rrweb कस्टम इवेंट्स के रूप में भी कैप्चर करता है, ताकि एजेंट और replay viewer उपयोगकर्ता-रिपोर्ट की गई समस्याओं को डीबग कर सकें। जब replay सक्षम होता है तो capture डिफ़ॉल्ट रूप से चालू होता है; इसे `sessionReplay.console` और `sessionReplay.network` विकल्पों के साथ ट्यून या अक्षम करें, प्रत्येक एक बूलियन या एक विकल्प ऑब्जेक्ट स्वीकार करता है (`{ maxEvents?: number }`, जिसमें `network` अतिरिक्त रूप से `captureErrorBodies` और `maxErrorBodyLength` भी स्वीकार करता है)। Request bodies और headers कभी कैप्चर नहीं किए जाते; response bodies केवल 5xx (सर्वर एरर) रिस्पॉन्स के लिए एक बाउंडेड, रिडैक्टेड स्निपेट के रूप में कैप्चर किए जाते हैं (`captureErrorBodies`, डिफ़ॉल्ट true, `maxErrorBodyLength` वर्णों तक सीमित, डिफ़ॉल्ट 2048) — non-5xx और नेटवर्क-फेलियर (status 0) रिस्पॉन्स में कभी कोई body नहीं होती। URLs स्क्रब किए जाते हैं, संदेश छोटे किए जाते हैं, रिकॉर्डर का अपना ingest/tracking ट्रैफ़िक बाहर रखा जाता है, और प्रति-session बजट (1000 console / 2000 network events) से अधिक होने पर एक truncation नोटिस जोड़ते हैं।
|
|
242
244
|
|
|
243
245
|
Analytics टेम्पलेट replay मेटाडेटा को SQL (`session_recordings`) में संग्रहीत करता है और chunks को प्राइवेट blob refs (`session_replay_chunks`) के माध्यम से संग्रहीत करता है। ब्राउज़र और एजेंट को कभी भी प्रदाता URLs प्राप्त नहीं होते। Playback स्कोप्ड सर्वर रूट्स के माध्यम से जाता है और डिफ़ॉल्ट एजेंट टूल्स सारांश या बाउंडेड replay events लौटाते हैं, कच्ची chunk table एक्सेस नहीं।
|
|
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
|
|
|
238
238
|
- URL は、ブラウザー分析で使用されるものと同じ `scrubUrl()` ヘルパーでスクラブされます。
|
|
239
239
|
- リプレイ キャプチャは Web 専用でオプトインです。ネイティブ デスクトップ画面は記録しません。
|
|
240
240
|
|
|
241
|
+
拡張機能やレンダリングされたメール コンテンツなど、フレームワークが管理する iframe はリプレイ キャプチャに含まれます。記録されたフレーム内でも、同じマスキングおよびブロック用セレクターが適用されます。サードパーティのクロスオリジン iframe は、そのドキュメント自体がクロスオリジン iframe 記録を有効にした互換性のある rrweb レコーダーを実行しない限り不透明なままです。親ページからブラウザーのオリジン境界を回避することはできません。
|
|
242
|
+
|
|
241
243
|
記録中、セッション リプレイはブラウザーのコンソール出力 (`log`、`info`、`warn`、`error`、`debug`、およびウィンドウの `error`/`unhandledrejection`) とネットワーク リクエストのメタデータ (`fetch` および XHR) もタグ付けされた rrweb カスタム イベントとしてキャプチャするため、エージェントとリプレイ ビューアーがユーザー報告の問題をデバッグできます。キャプチャは、リプレイが有効な場合デフォルトでオンになっています。`sessionReplay.console` と `sessionReplay.network` オプション (それぞれ真偽値またはオプション オブジェクト `{ maxEvents?: number }` を受け取り、`network` はさらに `captureErrorBodies` と `maxErrorBodyLength` を受け取ります) で調整または無効化できます。リクエストの本文とヘッダーは記録されませんが、レスポンスの本文は 5xx (サーバー エラー) レスポンスに限り、境界付きでレダクト済みのスニペットとしてキャプチャされます (`captureErrorBodies`、デフォルトは `true`、上限は `maxErrorBodyLength` 文字、デフォルト 2048) — 5xx 以外およびネットワーク障害 (ステータス 0) のレスポンスに本文が含まれることはありません。URL はスクラブされ、メッセージは切り詰められ、レコーダー自身の取り込み/追跡トラフィックは除外されます。セッションごとの上限 (コンソール 1000 件/ネットワーク 2000 件) を超えると切り詰めの通知が追加されます。
|
|
242
244
|
|
|
243
245
|
Analytics テンプレートは、リプレイ メタデータを SQL (`session_recordings`) に保存し、チャンクはプライベートな blob 参照 (`session_replay_chunks`) を通じて保存します。ブラウザーとエージェントはプロバイダーの URL を受け取ることはありません。再生はスコープ付きのサーバー ルートを経由し、デフォルトのエージェント ツールは要約または範囲を限定したリプレイ イベントを返すのみで、生のチャンク テーブルへのアクセスはできません。
|
|
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
|
|
|
238
238
|
- URL은 브라우저 분석에서 사용하는 것과 동일한 `scrubUrl()` 도우미로 정제됩니다.
|
|
239
239
|
- 리플레이 캡처는 웹 전용이며 옵트인 방식입니다. 네이티브 데스크톱 화면은 기록하지 않습니다.
|
|
240
240
|
|
|
241
|
+
확장 프로그램과 렌더링된 이메일 콘텐츠를 포함하여 프레임워크가 관리하는 iframe은 리플레이 캡처에 포함됩니다. 기록된 프레임 내부에도 동일한 마스킹 및 차단 선택자가 적용됩니다. 타사 교차 출처 iframe은 자체 문서가 교차 출처 iframe 기록을 활성화한 호환 rrweb 레코더를 실행하지 않는 한 불투명하게 유지되며, 부모 페이지에서 브라우저의 출처 경계를 우회할 수 없습니다.
|
|
242
|
+
|
|
241
243
|
기록하는 동안 세션 리플레이는 브라우저 콘솔 출력(`log`, `info`, `warn`, `error`, `debug` 및 window `error` / `unhandledrejection`)과 네트워크 요청 메타데이터(`fetch` 및 XHR)를 태그가 지정된 rrweb 커스텀 이벤트로 캡처하므로, 에이전트와 리플레이 뷰어가 사용자가 보고한 문제를 디버그할 수 있습니다. 리플레이가 활성화되면 캡처는 기본적으로 켜져 있으며, `sessionReplay.console` 및 `sessionReplay.network` 옵션으로 조정하거나 비활성화할 수 있습니다. 각 옵션은 불리언 또는 옵션 객체(`{ maxEvents?: number }`)를 받으며, `network`는 추가로 `captureErrorBodies`와 `maxErrorBodyLength`를 받습니다. 요청 본문과 헤더는 절대 캡처되지 않으며, 응답 본문은 5xx(서버 오류) 응답에 한해서만 경계가 지정된 정제된 스니펫으로 캡처됩니다(`captureErrorBodies`, 기본값 `true`, `maxErrorBodyLength` 문자 수로 상한 설정, 기본값 2048) — 5xx가 아닌 응답과 네트워크 실패(상태 0) 응답에는 본문이 포함되지 않습니다. URL은 정제되며, 메시지는 잘리고, 레코더 자체의 수집/추적 트래픽은 제외되며, 세션당 한도(콘솔 1000개 / 네트워크 2000개 이벤트)를 초과하면 잘림 안내가 추가됩니다.
|
|
242
244
|
|
|
243
245
|
Analytics 템플릿은 리플레이 메타데이터를 SQL(`session_recordings`)에 저장하고 청크는 프라이빗 blob 참조(`session_replay_chunks`)를 통해 저장합니다. 브라우저와 에이전트는 공급자 URL을 절대 받지 않습니다. 재생은 범위가 지정된 서버 경로를 거치며, 기본 에이전트 도구는 원시 청크 테이블 접근이 아닌 요약 또는 범위가 지정된 리플레이 이벤트를 반환합니다.
|
|
@@ -238,6 +238,8 @@ Os padrões de privacidade são intencionalmente conservadores, mas ainda úteis
|
|
|
238
238
|
- As URLs são higienizadas com o mesmo auxiliar `scrubUrl()` usado pela análise do navegador.
|
|
239
239
|
- A captura de replay é somente para web e opcional; ela não grava telas de desktop nativas.
|
|
240
240
|
|
|
241
|
+
Os iframes gerenciados pelo framework, incluindo extensões e conteúdo de e-mail renderizado, são incluídos na captura de replay. Os mesmos seletores de mascaramento e bloqueio se aplicam dentro dos frames gravados. Um iframe de terceiros com origem diferente permanece opaco, a menos que seu próprio documento execute um gravador rrweb compatível com a gravação de iframes entre origens habilitada; a página principal não pode contornar os limites de origem do navegador.
|
|
242
|
+
|
|
241
243
|
Durante a gravação, o replay de sessão também captura a saída do console do navegador (`log`, `info`, `warn`, `error`, `debug`, além dos eventos `error`/`unhandledrejection` da janela) e metadados de solicitações de rede (`fetch` e XHR) como eventos personalizados do rrweb marcados, para que agentes e o visualizador de replay possam depurar problemas relatados por usuários. A captura é ativada por padrão quando o replay está habilitado; ajuste ou desabilite-a com as opções `sessionReplay.console` e `sessionReplay.network`, cada uma aceitando um booleano ou um objeto de opções (`{ maxEvents?: number }`, sendo que `network` também aceita `captureErrorBodies` e `maxErrorBodyLength`). Corpos e cabeçalhos de solicitação nunca são capturados; corpos de resposta são capturados apenas como um trecho limitado e higienizado para respostas 5xx (erro de servidor) (`captureErrorBodies`, padrão `true`, limitado a `maxErrorBodyLength` caracteres, padrão 2048) — respostas que não sejam 5xx e falhas de rede (status 0) nunca carregam um corpo. As URLs são higienizadas, as mensagens são truncadas, o próprio tráfego de ingestão/rastreamento do gravador é excluído, e os orçamentos por sessão (1000 eventos de console / 2000 eventos de rede) adicionam um aviso de truncamento quando excedidos.
|
|
242
244
|
|
|
243
245
|
O modelo Analytics armazena os metadados de replay em SQL (`session_recordings`) e armazena os blocos por meio de referências privadas de blob (`session_replay_chunks`). Navegadores e agentes nunca recebem URLs de provedores. A reprodução passa por rotas de servidor com escopo definido, e as ferramentas padrão do agente retornam resumos ou eventos de replay limitados, não acesso bruto à tabela de blocos.
|
|
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
|
|
|
238
238
|
- URL 会使用与浏览器分析相同的 `scrubUrl()` 辅助函数进行清理。
|
|
239
239
|
- 重放采集仅限 Web 端且为选择性加入(opt-in);不会录制原生桌面屏幕。
|
|
240
240
|
|
|
241
|
+
框架管理的 iframe(包括扩展和渲染后的电子邮件内容)会纳入重放采集。录制的 frame 内同样适用遮罩和屏蔽选择器。第三方跨源 iframe 会保持不可见,除非其自身文档运行兼容的 rrweb 录制器并启用跨源 iframe 录制;父页面无法绕过浏览器的源边界。
|
|
242
|
+
|
|
241
243
|
录制期间,会话重放还会捕获浏览器控制台输出(`log`、`info`、`warn`、`error`、`debug`,以及 window 的 `error` / `unhandledrejection`)和网络请求元数据(`fetch` 和 XHR),并将其作为带标签的 rrweb 自定义事件记录下来,以便代理和重放查看器调试用户报告的问题。启用重放后,此项捕获默认开启;可通过 `sessionReplay.console` 和 `sessionReplay.network` 选项进行调整或禁用,两者均可接受布尔值或选项对象(`{ maxEvents?: number }`,其中 `network` 还可接受 `captureErrorBodies` 和 `maxErrorBodyLength`)。请求正文和请求头永远不会被捕获;响应正文仅在 5xx(服务器错误)响应下才会被捕获,且只捕获一段有边界、经过脱敏处理的片段(`captureErrorBodies`,默认值为 `true`,长度上限为 `maxErrorBodyLength` 个字符,默认 2048)——非 5xx 响应以及网络失败(状态码 0)的响应永远不会携带正文。URL 会被清理,消息会被截断,录制器自身的上报/跟踪流量会被排除,并且每个会话的配额(1000 条控制台事件 / 2000 条网络事件)在超出时会附加截断提示。
|
|
242
244
|
|
|
243
245
|
Analytics 模板将重放元数据存储在 SQL(`session_recordings`)中,并通过私有 blob 引用(`session_replay_chunks`)存储数据块。浏览器和代理永远不会收到提供商的 URL。回放通过受限的服务器路由进行,默认的代理工具返回的是摘要或有限范围的重放事件,而非原始数据块表的直接访问权限。
|
|
@@ -145,6 +145,20 @@ Netlify 背景函式是**付費方案**功能(Personal / Pro,不含免費方
|
|
|
145
145
|
|
|
146
146
|
</Callout>
|
|
147
147
|
|
|
148
|
+
## 前景自我續跑鏈:一個範圍較小、選用的退路 {#foreground-self-chain}
|
|
149
|
+
|
|
150
|
+
還有第二個獨立旗標控制另一種續跑機制:`AGENT_CHAT_FOREGROUND_SELF_CHAIN`。持久背景執行會把整個長回合移到上面提到的 15 分鐘背景函式;相較之下,前景自我續跑鏈是讓一般(非持久背景)回合在遇到軟逾時的區塊邊界時,透過**一般**請求函式上的伺服器端自我分派來繼續,而不是依賴用戶端重新送出 `auto_continue`。
|
|
151
|
+
|
|
152
|
+
它的組合條件與 `AGENT_CHAT_DURABLE_BACKGROUND` 相同:只有在旗標明確為真值(`true` / `1` / `yes` / `on`)、應用在託管環境中執行,且已設定 `A2A_SECRET` 時才會成立。這兩個旗標彼此獨立,不需要一致——應用可以只啟用這個範圍較小的功能,而不需要選用完整的背景函式 worker 路徑。當某個 run 已符合持久背景分派條件時,該決定會優先評估並生效;該 run 會透過背景 worker 續跑,而不會走這條路徑。
|
|
153
|
+
|
|
154
|
+
<Callout id="doc-block-fgschn1" tone="warning">
|
|
155
|
+
|
|
156
|
+
這個旗標**預設為關閉,屬於選用功能**。一般 Netlify 函式有固定的 **60 秒**上限——遠短於上面背景函式的 15 分鐘預算——因此自我分派的後續呼叫可能會在完成前就被中止,導致還沒儲存下一段續跑內容,讓長回覆在句子中間被截斷。旗標關閉時,託管應用會改用既有的用戶端驅動 `auto_continue` 重新送出路徑,該路徑續跑速度較慢,但不會被伺服器端逾時中止。
|
|
157
|
+
|
|
158
|
+
</Callout>
|
|
159
|
+
|
|
160
|
+
只有在確認託管環境的一般函式能在 60 秒上限內可靠完成自我分派的續跑之後,才建議啟用這個旗標。對於長時間、多步驟的回合,請優先使用上面的 `AGENT_CHAT_DURABLE_BACKGROUND`——它的背景函式預算大得多,是建議採用的路徑。
|
|
161
|
+
|
|
148
162
|
## 相關
|
|
149
163
|
|
|
150
164
|
- [**持久恢復**](/docs/durable-resume) — 中斷的 run 如何恢復而不重複已完成的副作用(另一個永遠啟用的保護)。
|
|
@@ -238,6 +238,8 @@ VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE=1
|
|
|
238
238
|
- URL 會使用瀏覽器分析所用的同一個 `scrubUrl()` 輔助函式進行清理。
|
|
239
239
|
- 重播擷取僅限於網頁,且為選擇加入;它不會錄製原生桌面畫面。
|
|
240
240
|
|
|
241
|
+
由框架管理的 iframe(包括擴充功能與轉譯後的電子郵件內容)會納入重播擷取。錄製的 frame 內同樣套用遮罩與封鎖選擇器。第三方跨來源 iframe 會維持不透明,除非其本身的文件執行相容的 rrweb 記錄器並啟用跨來源 iframe 錄製;父頁面無法繞過瀏覽器的來源界線。
|
|
242
|
+
|
|
241
243
|
在錄製期間,工作階段重播還會擷取瀏覽器主控台輸出(`log`、`info`、`warn`、`error`、`debug`,以及視窗的 `error`/`unhandledrejection`)與網路請求元資料(`fetch` 與 XHR),並以帶標籤的 rrweb 自訂事件形式儲存,讓代理與重播檢視器能夠偵錯使用者回報的問題。啟用重播後,擷取功能預設為開啟;可透過 `sessionReplay.console` 與 `sessionReplay.network` 選項進行調整或停用,這兩個選項都接受布林值或選項物件(`{ maxEvents?: number }`,其中 `network` 另外還可接受 `captureErrorBodies` 與 `maxErrorBodyLength`)。請求主體與標頭永遠不會被擷取;回應主體僅在 5xx(伺服器錯誤)回應時才會被擷取,且僅擷取一段有邊界、經過遮蔽處理的片段(`captureErrorBodies`,預設為 `true`,上限為 `maxErrorBodyLength` 個字元,預設 2048)——非 5xx 及網路失敗(狀態碼 0)的回應永遠不會帶有主體。URL 會被清理,訊息會被截斷,記錄器自身的擷取/追蹤流量會被排除,且每個工作階段的預算(1000 個主控台事件/2000 個網路事件)在超過時會加上截斷提示。
|
|
242
244
|
|
|
243
245
|
Analytics 範本將重播中繼資料儲存在 SQL(`session_recordings`)中,並透過私有 blob 參照(`session_replay_chunks`)儲存區塊。瀏覽器與代理永遠不會收到提供者 URL。播放透過範圍受限的伺服器路由進行,且預設代理工具傳回摘要或範圍受限的重播事件,而非原始區塊資料表存取權。
|
|
@@ -237,6 +237,8 @@ Privacy defaults are intentionally conservative but still useful for playback:
|
|
|
237
237
|
- URLs are scrubbed with the same `scrubUrl()` helper used by browser analytics.
|
|
238
238
|
- Replay capture is web-only and opt-in; it does not record native desktop screens.
|
|
239
239
|
|
|
240
|
+
Framework-owned iframes, including extensions and rendered email content, are included in replay capture. The same masking and blocking selectors apply inside recorded frames. A third-party cross-origin iframe remains opaque unless its own document runs a compatible rrweb recorder with cross-origin iframe recording enabled; browser origin boundaries cannot be bypassed from the parent page.
|
|
241
|
+
|
|
240
242
|
While recording, session replay also captures browser console output (`log`, `info`, `warn`, `error`, `debug`, plus window `error` / `unhandledrejection`) and network request metadata (`fetch` and XHR) as tagged rrweb custom events, so agents and the replay viewer can debug user-reported issues. Capture is on by default when replay is enabled; tune or disable it with the `sessionReplay.console` and `sessionReplay.network` options, each accepting a boolean or an options object (`{ maxEvents?: number }`, with `network` additionally accepting `captureErrorBodies` and `maxErrorBodyLength`). Request bodies and headers are never captured; response bodies are captured only as a bounded, redacted snippet for 5xx (server error) responses (`captureErrorBodies`, default true, capped at `maxErrorBodyLength` chars, default 2048) — non-5xx and network-failure responses never carry a body. URLs are scrubbed, messages are truncated, the recorder's own ingest/tracking traffic is excluded, and per-session budgets (1000 console / 2000 network events) add a truncation notice when exceeded.
|
|
241
243
|
|
|
242
244
|
The Analytics template stores replay metadata in SQL (`session_recordings`) and stores chunks through private blob refs (`session_replay_chunks`). Browsers and agents never receive provider URLs. Playback goes through scoped server routes and the default agent tools return summaries or bounded replay events, not raw chunk table access.
|