@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/InlineExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { buildExtensionHtml } from \"../../extensions/html-shell.js\";\nimport { getThemeVars } from \"../../extensions/theme.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n isAllowedExtensionPath,\n sanitizeExtensionRequestOptions,\n checkBridgePolicy,\n type BridgePolicyContext,\n type ExtensionBridgeRole,\n} from \"./iframe-bridge.js\";\nimport { normalizeAgentNativeExtensionSandbox } from \"./portable-extension.js\";\n\nconst THEME_CSS_VARS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--popover\",\n \"--popover-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--secondary\",\n \"--secondary-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--destructive\",\n \"--destructive-foreground\",\n \"--border\",\n \"--input\",\n \"--ring\",\n \"--radius\",\n \"--sidebar-background\",\n \"--sidebar-foreground\",\n \"--sidebar-primary\",\n \"--sidebar-primary-foreground\",\n \"--sidebar-accent\",\n \"--sidebar-accent-foreground\",\n \"--sidebar-border\",\n \"--sidebar-ring\",\n];\n\nconst EXTENSION_IFRAME_SANDBOX =\n normalizeAgentNativeExtensionSandbox(undefined);\n\ninterface InlineExtensionSource {\n mode?: \"database\" | \"local-files\";\n permissions?: BridgePolicyContext[\"permissions\"];\n}\n\nexport interface InlineExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n mode?: \"transient\" | \"persisted\";\n source?: InlineExtensionSource;\n}\n\nexport interface InlineExtensionFrameProps {\n extensionId?: string;\n extension?: InlineExtensionDefinition;\n slotId?: string;\n context?: Record<string, unknown> | null;\n className?: string;\n initialHeight?: number;\n}\n\nfunction getParentThemeVars(): Record<string, string> {\n if (typeof document === \"undefined\") return {};\n const computed = getComputedStyle(document.documentElement);\n const vars: Record<string, string> = {};\n for (const name of THEME_CSS_VARS) {\n const val = computed.getPropertyValue(name).trim();\n if (val) vars[name] = val;\n }\n return vars;\n}\n\nfunction normalizeRole(value: unknown): ExtensionBridgeRole {\n return value === \"owner\" ||\n value === \"admin\" ||\n value === \"editor\" ||\n value === \"viewer\"\n ? value\n : \"viewer\";\n}\n\nfunction serializeChatValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction transientDataKey(\n extensionId: string,\n collection: string,\n scope: string,\n): string {\n return `agent-native:inline-extension-data:${extensionId}:${scope}:${collection}`;\n}\n\ninterface TransientDataRow {\n id: string;\n extensionId: string;\n toolId: string;\n collection: string;\n data: string;\n ownerEmail: string;\n scope: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction readTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n): TransientDataRow[] {\n if (typeof localStorage === \"undefined\") return [];\n try {\n const parsed = JSON.parse(\n localStorage.getItem(transientDataKey(extensionId, collection, scope)) ??\n \"[]\",\n );\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction writeTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n rows: TransientDataRow[],\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n transientDataKey(extensionId, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction parseTransientDataPath(\n extensionId: string,\n path: string,\n): { collection: string; itemId?: string; scope: string } | null {\n try {\n const url = new URL(path, \"http://agent-native.local\");\n const parts = url.pathname.split(\"/\");\n if (\n parts.length < 6 ||\n parts.length > 7 ||\n parts[1] !== \"_agent-native\" ||\n parts[2] !== \"extensions\" ||\n parts[3] !== \"data\" ||\n decodeURIComponent(parts[4]) !== extensionId\n ) {\n return null;\n }\n return {\n collection: decodeURIComponent(parts[5] ?? \"\"),\n itemId: parts[6] ? decodeURIComponent(parts[6]) : undefined,\n scope: url.searchParams.get(\"scope\") || \"user\",\n };\n } catch {\n return null;\n }\n}\n\nasync function handleTransientExtensionData(\n extensionId: string,\n path: string,\n options: RequestInit,\n): Promise<Record<string, unknown> | null> {\n const parsed = parseTransientDataPath(extensionId, path);\n if (!parsed?.collection) return null;\n\n const method = String(options.method ?? \"GET\").toUpperCase();\n if (method === \"GET\" || method === \"HEAD\") {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: rows,\n },\n };\n }\n\n if (method === \"POST\") {\n const bodyText = typeof options.body === \"string\" ? options.body : \"{}\";\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(bodyText);\n } catch {\n body = {};\n }\n if (body.data === undefined) {\n return {\n response: {\n ok: false,\n status: 400,\n statusText: \"Bad Request\",\n body: { error: \"data is required\" },\n },\n };\n }\n const itemId =\n typeof body.id === \"string\" && body.id.trim()\n ? body.id.trim()\n : `item-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n const requestedScope =\n body.scope === \"org\" || parsed.scope === \"org\" ? \"org\" : \"user\";\n const now = new Date().toISOString();\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n requestedScope,\n );\n const existing = rows.find((row) => row.id === itemId);\n const row: TransientDataRow = {\n id: itemId,\n extensionId,\n toolId: extensionId,\n collection: parsed.collection,\n data:\n typeof body.data === \"string\" ? body.data : JSON.stringify(body.data),\n ownerEmail: \"\",\n scope: requestedScope,\n orgId: requestedScope === \"org\" ? \"inline\" : null,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n writeTransientRows(extensionId, parsed.collection, requestedScope, [\n row,\n ...rows.filter((item) => item.id !== itemId),\n ]);\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: row,\n },\n };\n }\n\n if (method === \"DELETE\" && parsed.itemId) {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n writeTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n rows.filter((row) => row.id !== parsed.itemId),\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: { ok: true },\n },\n };\n }\n\n return {\n response: {\n ok: false,\n status: 405,\n statusText: \"Method Not Allowed\",\n body: { error: \"Unsupported transient extensionData request\" },\n },\n };\n}\n\nfunction buildTransientSrcDoc(\n extension: InlineExtensionDefinition,\n isDark: boolean,\n): string {\n return buildExtensionHtml(\n extension.content ?? \"\",\n getThemeVars(isDark),\n isDark,\n extension.id,\n {\n authorEmail: \"\",\n viewerEmail: \"\",\n isAuthor: true,\n role: \"owner\",\n },\n );\n}\n\nexport function InlineExtensionFrame({\n extensionId,\n extension: providedExtension,\n slotId = \"agent-chat.inline\",\n context,\n className,\n initialHeight = 260,\n}: InlineExtensionFrameProps) {\n const providedId = providedExtension?.id ?? extensionId ?? \"\";\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const [height, setHeight] = useState<number>(initialHeight);\n const [isDark, setIsDark] = useState(() =>\n typeof document === \"undefined\"\n ? false\n : document.documentElement.classList.contains(\"dark\"),\n );\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: providedExtension?.content ? \"owner\" : \"viewer\",\n isAuthor: !!providedExtension?.content,\n });\n const bindingLatchedRef = useRef(false);\n const [fetchedExtension, setFetchedExtension] =\n useState<InlineExtensionDefinition | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!providedId || providedExtension) {\n setFetchedExtension(null);\n setIsLoading(false);\n return;\n }\n let cancelled = false;\n setIsLoading(true);\n fetch(agentNativePath(`/_agent-native/extensions/${providedId}`))\n .then(async (res) => {\n if (!res.ok) return null;\n return (await res.json()) as InlineExtensionDefinition;\n })\n .then((row) => {\n if (!cancelled) setFetchedExtension(row);\n })\n .catch(() => {\n if (!cancelled) setFetchedExtension(null);\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [providedExtension, providedId]);\n\n const extension = providedExtension ?? fetchedExtension ?? null;\n const resolvedId = extension?.id ?? providedId;\n const isTransient =\n extension?.mode === \"transient\" ||\n (!!extension?.content && !extensionId && extension?.mode !== \"persisted\");\n\n const initialDarkRef = useRef(isDark);\n const iframeSrc = useMemo(() => {\n if (!resolvedId || isTransient) return undefined;\n const v = encodeURIComponent(extension?.updatedAt ?? \"\");\n return agentNativePath(\n `/_agent-native/extensions/${resolvedId}/render?slot=${encodeURIComponent(slotId)}&dark=${initialDarkRef.current}&v=${v}`,\n );\n }, [extension?.updatedAt, isTransient, resolvedId, slotId]);\n\n const srcDoc = useMemo(() => {\n if (!extension || !isTransient) return undefined;\n return buildTransientSrcDoc(extension, initialDarkRef.current);\n }, [extension, isTransient]);\n\n useEffect(() => {\n bridgeContextRef.current = isTransient\n ? { role: \"owner\", isAuthor: true }\n : { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n setHeight(initialHeight);\n }, [initialHeight, isTransient, resolvedId, extension?.updatedAt]);\n\n const sendThemeToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark,\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendThemeToIframe();\n }, [isDark, srcDoc, iframeSrc]);\n\n const contextJson = JSON.stringify(context ?? {});\n const sendContextToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { type: \"agent-native-slot-context\", context: context ?? {} },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendContextToIframe();\n }, [contextJson, srcDoc, iframeSrc]);\n\n useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!message || typeof message !== \"object\") return;\n\n if (message.type === \"agent-native-extension-binding\") {\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = (message as any).binding ?? {};\n const role = normalizeRole(binding.role);\n bridgeContextRef.current = {\n role,\n isAuthor: !!binding.isAuthor,\n source: binding.source === \"local-files\" ? \"local-files\" : \"database\",\n permissions:\n binding && typeof binding.permissions === \"object\"\n ? binding.permissions\n : undefined,\n };\n return;\n }\n\n if (message.type === \"agent-native-extension-resize\") {\n const h = Number((message as any).height);\n if (Number.isFinite(h) && h > 0) {\n setHeight(Math.ceil(Math.min(Math.max(h, 96), 1000)));\n }\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: (message as any).key,\n code: (message as any).code,\n metaKey: !!(message as any).metaKey,\n ctrlKey: !!(message as any).ctrlKey,\n shiftKey: !!(message as any).shiftKey,\n altKey: !!(message as any).altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-send-to-chat\") {\n const text = serializeChatValue((message as any).message);\n if (!text?.trim()) return;\n sendToAgentChat({\n message: text,\n context: serializeChatValue((message as any).context),\n submit: (message as any).submit !== false,\n openSidebar: (message as any).openSidebar !== false,\n });\n return;\n }\n\n if (message.type === \"agent-native-ui-output\") {\n window.dispatchEvent(\n new CustomEvent(\"agentNative.inlineUiOutput\", {\n detail: {\n extensionId: resolvedId,\n key:\n typeof (message as any).key === \"string\"\n ? (message as any).key\n : undefined,\n value: (message as any).value,\n output: (message as any).output,\n },\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const errors: string[] = Array.isArray((message as any).errors)\n ? (message as any).errors\n : [];\n sendToAgentChat({\n message: `Fix runtime errors in the inline extension \"${extension?.name ?? resolvedId}\".\\n\\nErrors:\\n${errors.join(\"\\n\")}`,\n context: [\n `The user is viewing an inline generated extension named \"${extension?.name ?? resolvedId}\".`,\n isTransient\n ? \"This is a transient chat-only extension. Re-render it with render-inline-extension instead of update-extension.\"\n : `This is saved as extension id ${resolvedId}. Use get-extension/update-extension for durable edits.`,\n extension?.content\n ? `\\nCurrent inline content:\\n\\`\\`\\`html\\n${extension.content}\\n\\`\\`\\``\n : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n submit: true,\n openSidebar: true,\n });\n return;\n }\n\n if (message.type !== \"agent-native-extension-request\") return;\n\n const requestId = String((message as any).requestId ?? \"\");\n const path = String((message as any).path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-extension-response\",\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n if (\n !requestId ||\n !resolvedId ||\n !isAllowedExtensionPath(path, resolvedId)\n ) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(\n (message as any).options,\n );\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId: resolvedId,\n });\n if (!policy.ok) {\n respond({\n response: {\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n body: { error: policy.error },\n },\n });\n return;\n }\n\n if (isTransient) {\n const localData = await handleTransientExtensionData(\n resolvedId,\n path,\n options,\n );\n if (localData) {\n respond(localData);\n return;\n }\n }\n\n const finalHeaders = new Headers(options.headers ?? undefined);\n finalHeaders.set(\"X-Agent-Native-Extension-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Extension-Id\", resolvedId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", resolvedId);\n const res = await fetch(agentNativePath(path), {\n ...options,\n headers: finalHeaders,\n credentials: \"same-origin\",\n });\n const text = await res.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n respond({\n response: {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText,\n body,\n },\n });\n } catch (err: any) {\n respond({ error: err?.message ?? \"Extension host request failed\" });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [extension, isTransient, resolvedId]);\n\n if (!extension) {\n if (!isLoading) return null;\n return (\n <div\n className={className}\n style={{ height: initialHeight }}\n aria-busy=\"true\"\n />\n );\n }\n\n return (\n <div className={`relative ${className ?? \"\"}`}>\n <iframe\n ref={iframeRef}\n key={`${resolvedId}-${extension.updatedAt ?? \"inline\"}-${isTransient ? \"transient\" : \"persisted\"}`}\n src={iframeSrc}\n srcDoc={srcDoc}\n title={extension.name}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n style={{ width: \"100%\", border: 0, height, display: \"block\" }}\n onLoad={() => {\n sendThemeToIframe();\n sendContextToIframe();\n }}\n />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"InlineExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/InlineExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { buildExtensionHtml } from \"../../extensions/html-shell.js\";\nimport { getThemeVars } from \"../../extensions/theme.js\";\nimport { SESSION_REPLAY_IFRAME_ATTRIBUTE } from \"../../session-replay-iframe-protocol.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n isAllowedExtensionPath,\n sanitizeExtensionRequestOptions,\n checkBridgePolicy,\n type BridgePolicyContext,\n type ExtensionBridgeRole,\n} from \"./iframe-bridge.js\";\nimport { normalizeAgentNativeExtensionSandbox } from \"./portable-extension.js\";\n\nconst THEME_CSS_VARS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--popover\",\n \"--popover-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--secondary\",\n \"--secondary-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--destructive\",\n \"--destructive-foreground\",\n \"--border\",\n \"--input\",\n \"--ring\",\n \"--radius\",\n \"--sidebar-background\",\n \"--sidebar-foreground\",\n \"--sidebar-primary\",\n \"--sidebar-primary-foreground\",\n \"--sidebar-accent\",\n \"--sidebar-accent-foreground\",\n \"--sidebar-border\",\n \"--sidebar-ring\",\n];\n\nconst EXTENSION_IFRAME_SANDBOX =\n normalizeAgentNativeExtensionSandbox(undefined);\n\ninterface InlineExtensionSource {\n mode?: \"database\" | \"local-files\";\n permissions?: BridgePolicyContext[\"permissions\"];\n}\n\nexport interface InlineExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n mode?: \"transient\" | \"persisted\";\n source?: InlineExtensionSource;\n}\n\nexport interface InlineExtensionFrameProps {\n extensionId?: string;\n extension?: InlineExtensionDefinition;\n slotId?: string;\n context?: Record<string, unknown> | null;\n className?: string;\n initialHeight?: number;\n}\n\nfunction getParentThemeVars(): Record<string, string> {\n if (typeof document === \"undefined\") return {};\n const computed = getComputedStyle(document.documentElement);\n const vars: Record<string, string> = {};\n for (const name of THEME_CSS_VARS) {\n const val = computed.getPropertyValue(name).trim();\n if (val) vars[name] = val;\n }\n return vars;\n}\n\nfunction normalizeRole(value: unknown): ExtensionBridgeRole {\n return value === \"owner\" ||\n value === \"admin\" ||\n value === \"editor\" ||\n value === \"viewer\"\n ? value\n : \"viewer\";\n}\n\nfunction serializeChatValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction transientDataKey(\n extensionId: string,\n collection: string,\n scope: string,\n): string {\n return `agent-native:inline-extension-data:${extensionId}:${scope}:${collection}`;\n}\n\ninterface TransientDataRow {\n id: string;\n extensionId: string;\n toolId: string;\n collection: string;\n data: string;\n ownerEmail: string;\n scope: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction readTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n): TransientDataRow[] {\n if (typeof localStorage === \"undefined\") return [];\n try {\n const parsed = JSON.parse(\n localStorage.getItem(transientDataKey(extensionId, collection, scope)) ??\n \"[]\",\n );\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction writeTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n rows: TransientDataRow[],\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n transientDataKey(extensionId, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction parseTransientDataPath(\n extensionId: string,\n path: string,\n): { collection: string; itemId?: string; scope: string } | null {\n try {\n const url = new URL(path, \"http://agent-native.local\");\n const parts = url.pathname.split(\"/\");\n if (\n parts.length < 6 ||\n parts.length > 7 ||\n parts[1] !== \"_agent-native\" ||\n parts[2] !== \"extensions\" ||\n parts[3] !== \"data\" ||\n decodeURIComponent(parts[4]) !== extensionId\n ) {\n return null;\n }\n return {\n collection: decodeURIComponent(parts[5] ?? \"\"),\n itemId: parts[6] ? decodeURIComponent(parts[6]) : undefined,\n scope: url.searchParams.get(\"scope\") || \"user\",\n };\n } catch {\n return null;\n }\n}\n\nasync function handleTransientExtensionData(\n extensionId: string,\n path: string,\n options: RequestInit,\n): Promise<Record<string, unknown> | null> {\n const parsed = parseTransientDataPath(extensionId, path);\n if (!parsed?.collection) return null;\n\n const method = String(options.method ?? \"GET\").toUpperCase();\n if (method === \"GET\" || method === \"HEAD\") {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: rows,\n },\n };\n }\n\n if (method === \"POST\") {\n const bodyText = typeof options.body === \"string\" ? options.body : \"{}\";\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(bodyText);\n } catch {\n body = {};\n }\n if (body.data === undefined) {\n return {\n response: {\n ok: false,\n status: 400,\n statusText: \"Bad Request\",\n body: { error: \"data is required\" },\n },\n };\n }\n const itemId =\n typeof body.id === \"string\" && body.id.trim()\n ? body.id.trim()\n : `item-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n const requestedScope =\n body.scope === \"org\" || parsed.scope === \"org\" ? \"org\" : \"user\";\n const now = new Date().toISOString();\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n requestedScope,\n );\n const existing = rows.find((row) => row.id === itemId);\n const row: TransientDataRow = {\n id: itemId,\n extensionId,\n toolId: extensionId,\n collection: parsed.collection,\n data:\n typeof body.data === \"string\" ? body.data : JSON.stringify(body.data),\n ownerEmail: \"\",\n scope: requestedScope,\n orgId: requestedScope === \"org\" ? \"inline\" : null,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n writeTransientRows(extensionId, parsed.collection, requestedScope, [\n row,\n ...rows.filter((item) => item.id !== itemId),\n ]);\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: row,\n },\n };\n }\n\n if (method === \"DELETE\" && parsed.itemId) {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n writeTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n rows.filter((row) => row.id !== parsed.itemId),\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: { ok: true },\n },\n };\n }\n\n return {\n response: {\n ok: false,\n status: 405,\n statusText: \"Method Not Allowed\",\n body: { error: \"Unsupported transient extensionData request\" },\n },\n };\n}\n\nfunction buildTransientSrcDoc(\n extension: InlineExtensionDefinition,\n isDark: boolean,\n): string {\n return buildExtensionHtml(\n extension.content ?? \"\",\n getThemeVars(isDark),\n isDark,\n extension.id,\n {\n authorEmail: \"\",\n viewerEmail: \"\",\n isAuthor: true,\n role: \"owner\",\n },\n );\n}\n\nexport function InlineExtensionFrame({\n extensionId,\n extension: providedExtension,\n slotId = \"agent-chat.inline\",\n context,\n className,\n initialHeight = 260,\n}: InlineExtensionFrameProps) {\n const providedId = providedExtension?.id ?? extensionId ?? \"\";\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const [height, setHeight] = useState<number>(initialHeight);\n const [isDark, setIsDark] = useState(() =>\n typeof document === \"undefined\"\n ? false\n : document.documentElement.classList.contains(\"dark\"),\n );\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: providedExtension?.content ? \"owner\" : \"viewer\",\n isAuthor: !!providedExtension?.content,\n });\n const bindingLatchedRef = useRef(false);\n const [fetchedExtension, setFetchedExtension] =\n useState<InlineExtensionDefinition | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!providedId || providedExtension) {\n setFetchedExtension(null);\n setIsLoading(false);\n return;\n }\n let cancelled = false;\n setIsLoading(true);\n fetch(agentNativePath(`/_agent-native/extensions/${providedId}`))\n .then(async (res) => {\n if (!res.ok) return null;\n return (await res.json()) as InlineExtensionDefinition;\n })\n .then((row) => {\n if (!cancelled) setFetchedExtension(row);\n })\n .catch(() => {\n if (!cancelled) setFetchedExtension(null);\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [providedExtension, providedId]);\n\n const extension = providedExtension ?? fetchedExtension ?? null;\n const resolvedId = extension?.id ?? providedId;\n const isTransient =\n extension?.mode === \"transient\" ||\n (!!extension?.content && !extensionId && extension?.mode !== \"persisted\");\n\n const initialDarkRef = useRef(isDark);\n const iframeSrc = useMemo(() => {\n if (!resolvedId || isTransient) return undefined;\n const v = encodeURIComponent(extension?.updatedAt ?? \"\");\n return agentNativePath(\n `/_agent-native/extensions/${resolvedId}/render?slot=${encodeURIComponent(slotId)}&dark=${initialDarkRef.current}&v=${v}`,\n );\n }, [extension?.updatedAt, isTransient, resolvedId, slotId]);\n\n const srcDoc = useMemo(() => {\n if (!extension || !isTransient) return undefined;\n return buildTransientSrcDoc(extension, initialDarkRef.current);\n }, [extension, isTransient]);\n\n useEffect(() => {\n bridgeContextRef.current = isTransient\n ? { role: \"owner\", isAuthor: true }\n : { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n setHeight(initialHeight);\n }, [initialHeight, isTransient, resolvedId, extension?.updatedAt]);\n\n const sendThemeToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark,\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendThemeToIframe();\n }, [isDark, srcDoc, iframeSrc]);\n\n const contextJson = JSON.stringify(context ?? {});\n const sendContextToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { type: \"agent-native-slot-context\", context: context ?? {} },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendContextToIframe();\n }, [contextJson, srcDoc, iframeSrc]);\n\n useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!message || typeof message !== \"object\") return;\n\n if (message.type === \"agent-native-extension-binding\") {\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = (message as any).binding ?? {};\n const role = normalizeRole(binding.role);\n bridgeContextRef.current = {\n role,\n isAuthor: !!binding.isAuthor,\n source: binding.source === \"local-files\" ? \"local-files\" : \"database\",\n permissions:\n binding && typeof binding.permissions === \"object\"\n ? binding.permissions\n : undefined,\n };\n return;\n }\n\n if (message.type === \"agent-native-extension-resize\") {\n const h = Number((message as any).height);\n if (Number.isFinite(h) && h > 0) {\n setHeight(Math.ceil(Math.min(Math.max(h, 96), 1000)));\n }\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: (message as any).key,\n code: (message as any).code,\n metaKey: !!(message as any).metaKey,\n ctrlKey: !!(message as any).ctrlKey,\n shiftKey: !!(message as any).shiftKey,\n altKey: !!(message as any).altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-send-to-chat\") {\n const text = serializeChatValue((message as any).message);\n if (!text?.trim()) return;\n sendToAgentChat({\n message: text,\n context: serializeChatValue((message as any).context),\n submit: (message as any).submit !== false,\n openSidebar: (message as any).openSidebar !== false,\n });\n return;\n }\n\n if (message.type === \"agent-native-ui-output\") {\n window.dispatchEvent(\n new CustomEvent(\"agentNative.inlineUiOutput\", {\n detail: {\n extensionId: resolvedId,\n key:\n typeof (message as any).key === \"string\"\n ? (message as any).key\n : undefined,\n value: (message as any).value,\n output: (message as any).output,\n },\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const errors: string[] = Array.isArray((message as any).errors)\n ? (message as any).errors\n : [];\n sendToAgentChat({\n message: `Fix runtime errors in the inline extension \"${extension?.name ?? resolvedId}\".\\n\\nErrors:\\n${errors.join(\"\\n\")}`,\n context: [\n `The user is viewing an inline generated extension named \"${extension?.name ?? resolvedId}\".`,\n isTransient\n ? \"This is a transient chat-only extension. Re-render it with render-inline-extension instead of update-extension.\"\n : `This is saved as extension id ${resolvedId}. Use get-extension/update-extension for durable edits.`,\n extension?.content\n ? `\\nCurrent inline content:\\n\\`\\`\\`html\\n${extension.content}\\n\\`\\`\\``\n : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n submit: true,\n openSidebar: true,\n });\n return;\n }\n\n if (message.type !== \"agent-native-extension-request\") return;\n\n const requestId = String((message as any).requestId ?? \"\");\n const path = String((message as any).path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-extension-response\",\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n if (\n !requestId ||\n !resolvedId ||\n !isAllowedExtensionPath(path, resolvedId)\n ) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(\n (message as any).options,\n );\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId: resolvedId,\n });\n if (!policy.ok) {\n respond({\n response: {\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n body: { error: policy.error },\n },\n });\n return;\n }\n\n if (isTransient) {\n const localData = await handleTransientExtensionData(\n resolvedId,\n path,\n options,\n );\n if (localData) {\n respond(localData);\n return;\n }\n }\n\n const finalHeaders = new Headers(options.headers ?? undefined);\n finalHeaders.set(\"X-Agent-Native-Extension-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Extension-Id\", resolvedId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", resolvedId);\n const res = await fetch(agentNativePath(path), {\n ...options,\n headers: finalHeaders,\n credentials: \"same-origin\",\n });\n const text = await res.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n respond({\n response: {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText,\n body,\n },\n });\n } catch (err: any) {\n respond({ error: err?.message ?? \"Extension host request failed\" });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [extension, isTransient, resolvedId]);\n\n if (!extension) {\n if (!isLoading) return null;\n return (\n <div\n className={className}\n style={{ height: initialHeight }}\n aria-busy=\"true\"\n />\n );\n }\n\n return (\n <div className={`relative ${className ?? \"\"}`}>\n <iframe\n {...{ [SESSION_REPLAY_IFRAME_ATTRIBUTE]: \"\" }}\n ref={iframeRef}\n key={`${resolvedId}-${extension.updatedAt ?? \"inline\"}-${isTransient ? \"transient\" : \"persisted\"}`}\n src={iframeSrc}\n srcDoc={srcDoc}\n title={extension.name}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n style={{ width: \"100%\", border: 0, height, display: \"block\" }}\n onLoad={() => {\n sendThemeToIframe();\n sendContextToIframe();\n }}\n />\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portable-extension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"portable-extension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EXTENSION_IFRAME_META_CSP } from "../../extensions/html-shell.js";
|
|
2
|
+
import { buildSessionReplayIframeBootstrap } from "../../extensions/session-replay-iframe.js";
|
|
2
3
|
import { AGENT_NATIVE_HOST_MESSAGE_TYPES } from "../host-bridge.js";
|
|
3
4
|
export const AGENT_NATIVE_EXTENSION_MESSAGE_TYPES = {
|
|
4
5
|
STORAGE_REQUEST: "agentNative.extension.storage",
|
|
@@ -472,6 +473,7 @@ export function buildAgentNativeExtensionHtml({ extensionId, content, title, slo
|
|
|
472
473
|
}, '*');
|
|
473
474
|
})();
|
|
474
475
|
</script>
|
|
476
|
+
${buildSessionReplayIframeBootstrap()}
|
|
475
477
|
</head>
|
|
476
478
|
<body>
|
|
477
479
|
${content}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portable-extension.js","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,CAAC,MAAM,oCAAoC,GAAG;IAClD,eAAe,EAAE,+BAA+B;IAChD,gBAAgB,EAAE,qCAAqC;IACvD,MAAM,EAAE,8BAA8B;IACtC,YAAY,EAAE,mCAAmC;CACzC,CAAC;AA+GX,SAAS,SAAS,CAChB,GAAG,MAAuC;IAE1C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,SAAyC;IAEzC,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;QAC5D,gBAAgB,EAAE,SAAS,CACzB,SAAS,CAAC,QAAQ,EAAE,gBAAgB,EACpC,SAAS,CAAC,gBAAgB,CAC3B;QACD,iBAAiB,EAAE,SAAS,CAC1B,SAAS,CAAC,QAAQ,EAAE,iBAAiB,EACrC,SAAS,CAAC,iBAAiB,CAC5B;QACD,aAAa,EAAE,SAAS,CACtB,SAAS,CAAC,QAAQ,EAAE,aAAa,EACjC,SAAS,CAAC,aAAa,CACxB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,SAAyC,EACzC,MAA0B;IAE1B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,+BAA+B,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CACnB,OAAuD,EACvD,OAA2C;IAE3C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAChB,SAAiB,EACjB,WAAmB,EACnB,KAAa,EACb,UAAkB;IAElB,OAAO;QACL,cAAc;QACd,gBAAgB;QAChB,cAAc,CAAC,SAAS,CAAC;QACzB,cAAc,CAAC,WAAW,CAAC;QAC3B,cAAc,CAAC,KAAK,CAAC;QACrB,cAAc,CAAC,UAAU,CAAC;KAC3B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CACjB,OAAgB,EAChB,GAAW;IAEX,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,CAAC,CAAE,MAAyD;YAC5D,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,OAAgB,EAChB,GAAW,EACX,KAAqD;IAErD,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAgB,EAChB,SAAiB,EACjB,WAAmB,EACnB,UAAkB;IAElB,MAAM,MAAM,GAAG;QACb,cAAc;QACd,gBAAgB;QAChB,cAAc,CAAC,SAAS,CAAC;QACzB,cAAc,CAAC,WAAW,CAAC;QAC3B,EAAE;KACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;IAChD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,6CAA6C,CAC3D,SAAS,GAAG,SAAS;IAErB,OAAO;QACL,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO;YAC/B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,IAAI,GACR,KAAK,KAAK,KAAK;gBACb,CAAC,CAAC,uBAAuB,CACrB,OAAO,EACP,SAAS,EACT,OAAO,CAAC,WAAW,EACnB,UAAU,CACX;gBACH,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;YACrE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAChC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CACxC,CAAC;YACF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC;YACpC,OAAO,IAAI;iBACR,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iBACtD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAC5D,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;QACnD,CAAC;QACD,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;YACxC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAmC;gBAC1C,EAAE;gBACF,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU;gBACV,IAAI;gBACJ,KAAK;gBACL,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,GAAG;gBACvC,SAAS,EAAE,GAAG;aACf,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACjB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;YACrC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;YAClB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,OAAgE,EAChE,OAA2C;IAE3C,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,QAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GACX,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI;YACjD,CAAC,CAAC,MAAM,CAAE,IAA2B,CAAC,KAAK,CAAC;YAC5C,CAAC,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACzD,OAAQ,IAA4B,CAAC,MAAM,CAAC;IAC9C,CAAC;IACD,OAAO,IAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,qCAAqC,CAAC,EACpD,QAAQ,EACR,KAAK,EAAE,SAAS,EAChB,OAAO,EACP,WAAW,GAAG,aAAa,GACkB;IAC7C,MAAM,GAAG,GAAG,KAAK,EACf,SAA4C,EAC5C,UAAkB,EAClB,OAA2C,EAC3C,OAA4C,EAC5C,EAAW,EACX,IAAc,EACI,EAAE;QACpB,MAAM,YAAY,GAAG,SAAS,IAAI,KAAK,CAAC;QACxC,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,OAAO,CACjC,MAAM,yBAAyB,CAAC,OAAO,EAAE,OAAO,CAAC,CAClD,CAAC;QACF,eAAe,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,WAAW;YACX,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS;gBACT,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,UAAU;gBACV,EAAE;gBACF,IAAI;gBACJ,OAAO,EAAE,OAAO,IAAI,EAAE;gBACtB,OAAO;aACR,CAAC;SACH,CAAC,CAAC;QACH,OAAO,uBAAuB,CAAU,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO;YAC/B,OAAO,GAAG,CACR,MAAM,EACN,UAAU,EACV,OAAO,EACP,OAAO,CACR,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;YAClC,OAAO,GAAG,CACR,KAAK,EACL,UAAU,EACV,OAAO,EACP,OAAO,EACP,EAAE,CACH,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;YACxC,OAAO,GAAG,CACR,KAAK,EACL,UAAU,EACV,OAAO,EACP,OAAO,EACP,EAAE,EACF,IAAI,CACL,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO;YACrC,OAAO,GAAG,CACR,QAAQ,EACR,UAAU,EACV,OAAO,EACP,OAAO,EACP,EAAE,CACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,OAA2B;IAE3B,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,CAAC,OAAO,IAAI,wDAAwD,CAAC;SAClE,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACF,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAC5C,WAAW,EACX,OAAO,EACP,KAAK,EACL,MAAM,EACN,WAAW,EACX,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,KAAK,GACuB;IACrC,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,QAAQ,CAAC;QAChC,IAAI,EAAE,+BAA+B;QACrC,SAAS,EAAE,oCAAoC;KAChD,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,KAAK,IAAI,wBAAwB,CAAC;IAEpD,OAAO;iBACQ,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;;;;wDAIU,mBAAmB,CAAC,yBAAyB,CAAC;WAC3F,mBAAmB,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;WAe9B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAkCQ,gBAAgB;0BACjB,eAAe;qBACpB,UAAU;0BACL,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiLvC,OAAO;;QAED,CAAC;AACT,CAAC","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\nimport { AGENT_NATIVE_HOST_MESSAGE_TYPES } from \"../host-bridge.js\";\n\nexport const AGENT_NATIVE_EXTENSION_MESSAGE_TYPES = {\n STORAGE_REQUEST: \"agentNative.extension.storage\",\n STORAGE_RESPONSE: \"agentNative.extension.storageResult\",\n RESIZE: \"agentNative.extension.resize\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n} as const;\n\nexport type AgentNativeExtensionMessageType =\n (typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES)[keyof typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES];\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\" | \"all\" | string;\n\nexport interface AgentNativeExtensionManifest {\n /** Slot IDs this extension may render into. Omit to let the host decide. */\n slots?: readonly string[];\n /** Host action names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedActions?: readonly string[];\n /** Host command names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedCommands?: readonly string[];\n /** Storage scopes this extension is allowed to use. Omit to inherit the slot policy. */\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n}\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n content: string;\n description?: string;\n updatedAt?: string;\n manifest?: AgentNativeExtensionManifest;\n slots?: readonly string[];\n requestedActions?: readonly string[];\n requestedCommands?: readonly string[];\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageOptions {\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n scope?: Exclude<AgentNativeExtensionStorageScope, \"all\">;\n userId?: string;\n organizationId?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageRow<TData = unknown> {\n id: string;\n extensionId: string;\n collection: string;\n data: TData;\n scope: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow[]\n | Promise<AgentNativeExtensionStorageRow[]>;\n get(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow\n | null\n | Promise<AgentNativeExtensionStorageRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): AgentNativeExtensionStorageRow | Promise<AgentNativeExtensionStorageRow>;\n remove(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): { removed: boolean } | Promise<{ removed: boolean }>;\n}\n\nexport interface CreateHttpAgentNativeExtensionStorageOptions {\n /** Endpoint that receives storage operation POSTs. */\n endpoint: string;\n fetch?: typeof fetch;\n headers?:\n | HeadersInit\n | ((\n context: AgentNativeExtensionStorageContext,\n ) => HeadersInit | Promise<HeadersInit>);\n credentials?: RequestCredentials;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n themeCss?: string;\n isDark?: boolean;\n}\n\nfunction firstList<T>(\n ...values: Array<readonly T[] | undefined>\n): readonly T[] | undefined {\n return values.find((value) => Array.isArray(value));\n}\n\nexport function getAgentNativeExtensionManifest(\n extension: AgentNativeExtensionDefinition,\n): AgentNativeExtensionManifest {\n return {\n slots: firstList(extension.manifest?.slots, extension.slots),\n requestedActions: firstList(\n extension.manifest?.requestedActions,\n extension.requestedActions,\n ),\n requestedCommands: firstList(\n extension.manifest?.requestedCommands,\n extension.requestedCommands,\n ),\n storageScopes: firstList(\n extension.manifest?.storageScopes,\n extension.storageScopes,\n ),\n };\n}\n\nexport function isAgentNativeExtensionAllowedInSlot(\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n): boolean {\n if (!slotId) return true;\n const slots = getAgentNativeExtensionManifest(extension).slots;\n if (!slots) return true;\n return slots.includes(slotId);\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction safeJson(value: unknown): string {\n try {\n const json = JSON.stringify(value);\n return typeof json === \"string\" ? json.replace(/</g, \"\\\\u003c\") : \"null\";\n } catch {\n return \"null\";\n }\n}\n\nfunction encodedSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction storageScope(\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n): string {\n const scope = options?.scope ?? context.scope ?? \"user\";\n return typeof scope === \"string\" && scope ? scope : \"user\";\n}\n\nfunction localStorageRef(): Storage {\n if (typeof window === \"undefined\" || !window.localStorage) {\n throw new Error(\"Extension localStorage is not available\");\n }\n return window.localStorage;\n}\n\nfunction bucketKey(\n namespace: string,\n extensionId: string,\n scope: string,\n collection: string,\n): string {\n return [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n encodedSegment(scope),\n encodedSegment(collection),\n ].join(\":\");\n}\n\nfunction readBucket(\n storage: Storage,\n key: string,\n): Record<string, AgentNativeExtensionStorageRow> {\n const raw = storage.getItem(key);\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, AgentNativeExtensionStorageRow>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction writeBucket(\n storage: Storage,\n key: string,\n value: Record<string, AgentNativeExtensionStorageRow>,\n) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nfunction listLocalStorageBuckets(\n storage: Storage,\n namespace: string,\n extensionId: string,\n collection: string,\n): string[] {\n const prefix = [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n \"\",\n ].join(\":\");\n const suffix = `:${encodedSegment(collection)}`;\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (key?.startsWith(prefix) && key.endsWith(suffix)) keys.push(key);\n }\n return keys;\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n list(collection, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n const keys =\n scope === \"all\"\n ? listLocalStorageBuckets(\n storage,\n namespace,\n context.extensionId,\n collection,\n )\n : [bucketKey(namespace, context.extensionId, scope, collection)];\n const rows = keys.flatMap((key) =>\n Object.values(readBucket(storage, key)),\n );\n const limit = options?.limit ?? 100;\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, Math.max(0, limit));\n },\n get(collection, id, options, context) {\n const rows = this.list(collection, options, context);\n if (rows instanceof Promise) {\n return rows.then(\n (resolved) => resolved.find((row) => row.id === id) ?? null,\n );\n }\n return rows.find((row) => row.id === id) ?? null;\n },\n set(collection, id, data, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data writes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const now = new Date().toISOString();\n const row: AgentNativeExtensionStorageRow = {\n id,\n extensionId: context.extensionId,\n collection,\n data,\n scope,\n createdAt: bucket[id]?.createdAt ?? now,\n updatedAt: now,\n };\n bucket[id] = row;\n writeBucket(storage, key, bucket);\n return row;\n },\n remove(collection, id, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data deletes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const removed = Boolean(bucket[id]);\n delete bucket[id];\n writeBucket(storage, key, bucket);\n return { removed };\n },\n };\n}\n\nasync function resolveHttpStorageHeaders(\n headers: CreateHttpAgentNativeExtensionStorageOptions[\"headers\"],\n context: AgentNativeExtensionStorageContext,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(context) : headers;\n}\n\nasync function readHttpStorageResponse<TResult>(\n response: Response,\n): Promise<TResult> {\n const text = await response.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body\n ? String((body as { error: unknown }).error)\n : `Extension storage request failed: ${response.status}`;\n throw new Error(message);\n }\n\n if (body && typeof body === \"object\" && \"result\" in body) {\n return (body as { result: TResult }).result;\n }\n return body as TResult;\n}\n\nexport function createHttpAgentNativeExtensionStorage({\n endpoint,\n fetch: fetchImpl,\n headers,\n credentials = \"same-origin\",\n}: CreateHttpAgentNativeExtensionStorageOptions): AgentNativeExtensionStorage {\n const run = async <TResult>(\n operation: \"list\" | \"get\" | \"set\" | \"remove\",\n collection: string,\n context: AgentNativeExtensionStorageContext,\n options?: AgentNativeExtensionStorageOptions,\n id?: string,\n data?: unknown,\n ): Promise<TResult> => {\n const requestFetch = fetchImpl ?? fetch;\n if (typeof requestFetch !== \"function\") {\n throw new Error(\"fetch is not available for extension storage\");\n }\n const resolvedHeaders = new Headers(\n await resolveHttpStorageHeaders(headers, context),\n );\n resolvedHeaders.set(\"Content-Type\", \"application/json\");\n\n const response = await requestFetch(endpoint, {\n method: \"POST\",\n credentials,\n headers: resolvedHeaders,\n body: JSON.stringify({\n operation,\n extensionId: context.extensionId,\n slotId: context.slotId,\n collection,\n id,\n data,\n options: options ?? {},\n context,\n }),\n });\n return readHttpStorageResponse<TResult>(response);\n };\n\n return {\n list(collection, options, context) {\n return run<AgentNativeExtensionStorageRow[]>(\n \"list\",\n collection,\n context,\n options,\n );\n },\n get(collection, id, options, context) {\n return run<AgentNativeExtensionStorageRow | null>(\n \"get\",\n collection,\n context,\n options,\n id,\n );\n },\n set(collection, id, data, options, context) {\n return run<AgentNativeExtensionStorageRow>(\n \"set\",\n collection,\n context,\n options,\n id,\n data,\n );\n },\n remove(collection, id, options, context) {\n return run<{ removed: boolean }>(\n \"remove\",\n collection,\n context,\n options,\n id,\n );\n },\n };\n}\n\nexport function normalizeAgentNativeExtensionSandbox(\n sandbox: string | undefined,\n): string {\n const tokens = new Set(\n (sandbox ?? \"allow-scripts allow-forms allow-popups allow-downloads\")\n .split(/\\s+/)\n .filter(Boolean),\n );\n tokens.delete(\"allow-same-origin\");\n tokens.add(\"allow-scripts\");\n tokens.add(\"allow-downloads\");\n return Array.from(tokens).join(\" \");\n}\n\nexport function buildAgentNativeExtensionHtml({\n extensionId,\n content,\n title,\n slotId,\n slotContext,\n themeCss = \"\",\n isDark = false,\n}: BuildAgentNativeExtensionHtmlOptions): string {\n const extensionIdJson = safeJson(extensionId);\n const slotIdJson = safeJson(slotId ?? \"\");\n const slotContextJson = safeJson(slotContext ?? {});\n const messageTypesJson = safeJson({\n host: AGENT_NATIVE_HOST_MESSAGE_TYPES,\n extension: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n });\n const titleText = title ?? \"Agent Native extension\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\"${isDark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${escapeHtmlAttribute(EXTENSION_IFRAME_META_CSP)}\" />\n <title>${escapeHtmlAttribute(titleText)}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-border: hsl(var(--border, 214 32% 91%));\n --color-background: hsl(var(--background, 0 0% 100%));\n --color-foreground: hsl(var(--foreground, 222 47% 11%));\n --color-primary: hsl(var(--primary, 222 47% 11%));\n --color-primary-foreground: hsl(var(--primary-foreground, 210 40% 98%));\n --color-muted: hsl(var(--muted, 210 40% 96%));\n --color-muted-foreground: hsl(var(--muted-foreground, 215 16% 47%));\n --color-card: hsl(var(--card, 0 0% 100%));\n --color-card-foreground: hsl(var(--card-foreground, 222 47% 11%));\n --radius-lg: var(--radius, .5rem);\n --radius-md: calc(var(--radius, .5rem) - 2px);\n --radius-sm: calc(var(--radius, .5rem) - 4px);\n }\n </style>\n <style>\n *, *::before, *::after { box-sizing: border-box; border-color: hsl(var(--border, 214 32% 91%)); }\n html, body { margin: 0; min-height: 100%; background: transparent; color: hsl(var(--foreground, 222 47% 11%)); }\n body {\n --agent-native-extension-padding: clamp(12px, 2vw, 20px);\n font-family: Inter, ui-sans-serif, system-ui, sans-serif;\n padding: var(--agent-native-extension-padding);\n }\n body:has(> [data-extension-layout=\"full-bleed\"]),\n body:has(> [data-extension-padding=\"none\"]),\n body:has(> .agent-native-extension-bleed) {\n padding: 0;\n }\n </style>\n <script>\n (function() {\n var messageTypes = ${messageTypesJson};\n var extensionId = ${extensionIdJson};\n var slotId = ${slotIdJson};\n var slotContext = ${slotContextJson};\n var requestSeq = 0;\n var pending = {};\n\n function nextRequestId(prefix) {\n requestSeq += 1;\n return prefix + '-' + Date.now() + '-' + requestSeq;\n }\n\n function failMessage(message, fallback) {\n return typeof message.error === 'string' ? message.error : fallback;\n }\n\n function requestParent(message, responseType, timeoutMs) {\n timeoutMs = timeoutMs || 30000;\n return new Promise(function(resolve, reject) {\n var requestId = message.requestId || nextRequestId('extension');\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error('Timed out waiting for host response'));\n }, timeoutMs);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer,\n };\n window.parent.postMessage(Object.assign({}, message, { requestId: requestId }), '*');\n });\n }\n\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n\n if (message.type === messageTypes.host.INIT) {\n agentNative.init = message;\n agentNative.contextSnapshot = message.context || null;\n agentNative.actionsSnapshot = message.actions || [];\n window.dispatchEvent(new CustomEvent('agentNative:init', { detail: message }));\n return;\n }\n\n if (message.type === messageTypes.extension.SLOT_CONTEXT) {\n slotContext = message.context || {};\n agentNative.slotContext = slotContext;\n window.slotContext = slotContext;\n window.dispatchEvent(new CustomEvent('agentNative:slot-context', { detail: slotContext }));\n return;\n }\n\n var entry = pending[message.requestId];\n if (!entry || message.type !== entry.responseType) return;\n delete pending[message.requestId];\n clearTimeout(entry.timer);\n if (message.ok === false) {\n entry.reject(new Error(failMessage(message, 'Host request failed')));\n } else {\n entry.resolve(message);\n }\n });\n\n function hostContext() {\n return requestParent(\n { type: messageTypes.host.GET_CONTEXT },\n messageTypes.host.CONTEXT,\n ).then(function(message) { return message.context || {}; });\n }\n\n function hostActions() {\n return requestParent(\n { type: messageTypes.host.LIST_ACTIONS },\n messageTypes.host.ACTIONS,\n ).then(function(message) { return message.actions || []; });\n }\n\n function hostAction(name, args) {\n return requestParent(\n { type: messageTypes.host.RUN_ACTION, name: name, args: args || {} },\n messageTypes.host.ACTION_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function hostCommand(command, payload) {\n return requestParent(\n { type: messageTypes.host.COMMAND, command: command, payload: payload },\n messageTypes.host.COMMAND_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function storageRequest(op, collection, id, data, options) {\n return requestParent(\n {\n type: messageTypes.extension.STORAGE_REQUEST,\n op: op,\n collection: collection,\n id: id,\n data: data,\n options: options || {},\n },\n messageTypes.extension.STORAGE_RESPONSE,\n ).then(function(message) { return message.result; });\n }\n\n var extensionData = {\n list: function(collection, options) {\n return storageRequest('list', collection, undefined, undefined, options);\n },\n get: function(collection, id, options) {\n return storageRequest('get', collection, id, undefined, options);\n },\n set: function(collection, id, data, options) {\n return storageRequest('set', collection, id, data, options);\n },\n remove: function(collection, id, options) {\n return storageRequest('remove', collection, id, undefined, options);\n },\n };\n\n var agentNative = {\n version: '0.1.0',\n extensionId: extensionId,\n slotId: slotId,\n slotContext: slotContext,\n contextSnapshot: null,\n actionsSnapshot: [],\n init: null,\n context: hostContext,\n listActions: hostActions,\n action: hostAction,\n command: hostCommand,\n refresh: function(payload) { return hostCommand('refreshData', payload); },\n data: extensionData,\n };\n\n window.agentNative = agentNative;\n window.appAction = hostAction;\n window.extensionData = extensionData;\n window.toolData = extensionData;\n window.extensionId = extensionId;\n window.toolId = extensionId;\n window.slotContext = slotContext;\n\n function reportHeight() {\n try {\n var doc = document.documentElement;\n var body = document.body;\n var height = Math.max(\n doc ? doc.scrollHeight : 0,\n doc ? doc.offsetHeight : 0,\n body ? body.scrollHeight : 0,\n body ? body.offsetHeight : 0,\n );\n window.parent.postMessage({\n type: messageTypes.extension.RESIZE,\n extensionId: extensionId,\n slotId: slotId,\n height: height,\n }, '*');\n } catch (_) {}\n }\n\n window.addEventListener('load', reportHeight);\n if (typeof ResizeObserver !== 'undefined') {\n new ResizeObserver(reportHeight).observe(document.documentElement);\n } else {\n setInterval(reportHeight, 1000);\n }\n\n window.parent.postMessage({\n type: messageTypes.host.READY,\n requestId: nextRequestId('ready'),\n }, '*');\n })();\n </script>\n</head>\n<body>\n${content}\n</body>\n</html>`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"portable-extension.js","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\nimport { buildSessionReplayIframeBootstrap } from \"../../extensions/session-replay-iframe.js\";\nimport { AGENT_NATIVE_HOST_MESSAGE_TYPES } from \"../host-bridge.js\";\n\nexport const AGENT_NATIVE_EXTENSION_MESSAGE_TYPES = {\n STORAGE_REQUEST: \"agentNative.extension.storage\",\n STORAGE_RESPONSE: \"agentNative.extension.storageResult\",\n RESIZE: \"agentNative.extension.resize\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n} as const;\n\nexport type AgentNativeExtensionMessageType =\n (typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES)[keyof typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES];\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\" | \"all\" | string;\n\nexport interface AgentNativeExtensionManifest {\n /** Slot IDs this extension may render into. Omit to let the host decide. */\n slots?: readonly string[];\n /** Host action names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedActions?: readonly string[];\n /** Host command names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedCommands?: readonly string[];\n /** Storage scopes this extension is allowed to use. Omit to inherit the slot policy. */\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n}\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n content: string;\n description?: string;\n updatedAt?: string;\n manifest?: AgentNativeExtensionManifest;\n slots?: readonly string[];\n requestedActions?: readonly string[];\n requestedCommands?: readonly string[];\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageOptions {\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n scope?: Exclude<AgentNativeExtensionStorageScope, \"all\">;\n userId?: string;\n organizationId?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageRow<TData = unknown> {\n id: string;\n extensionId: string;\n collection: string;\n data: TData;\n scope: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow[]\n | Promise<AgentNativeExtensionStorageRow[]>;\n get(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow\n | null\n | Promise<AgentNativeExtensionStorageRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): AgentNativeExtensionStorageRow | Promise<AgentNativeExtensionStorageRow>;\n remove(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): { removed: boolean } | Promise<{ removed: boolean }>;\n}\n\nexport interface CreateHttpAgentNativeExtensionStorageOptions {\n /** Endpoint that receives storage operation POSTs. */\n endpoint: string;\n fetch?: typeof fetch;\n headers?:\n | HeadersInit\n | ((\n context: AgentNativeExtensionStorageContext,\n ) => HeadersInit | Promise<HeadersInit>);\n credentials?: RequestCredentials;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n themeCss?: string;\n isDark?: boolean;\n}\n\nfunction firstList<T>(\n ...values: Array<readonly T[] | undefined>\n): readonly T[] | undefined {\n return values.find((value) => Array.isArray(value));\n}\n\nexport function getAgentNativeExtensionManifest(\n extension: AgentNativeExtensionDefinition,\n): AgentNativeExtensionManifest {\n return {\n slots: firstList(extension.manifest?.slots, extension.slots),\n requestedActions: firstList(\n extension.manifest?.requestedActions,\n extension.requestedActions,\n ),\n requestedCommands: firstList(\n extension.manifest?.requestedCommands,\n extension.requestedCommands,\n ),\n storageScopes: firstList(\n extension.manifest?.storageScopes,\n extension.storageScopes,\n ),\n };\n}\n\nexport function isAgentNativeExtensionAllowedInSlot(\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n): boolean {\n if (!slotId) return true;\n const slots = getAgentNativeExtensionManifest(extension).slots;\n if (!slots) return true;\n return slots.includes(slotId);\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction safeJson(value: unknown): string {\n try {\n const json = JSON.stringify(value);\n return typeof json === \"string\" ? json.replace(/</g, \"\\\\u003c\") : \"null\";\n } catch {\n return \"null\";\n }\n}\n\nfunction encodedSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction storageScope(\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n): string {\n const scope = options?.scope ?? context.scope ?? \"user\";\n return typeof scope === \"string\" && scope ? scope : \"user\";\n}\n\nfunction localStorageRef(): Storage {\n if (typeof window === \"undefined\" || !window.localStorage) {\n throw new Error(\"Extension localStorage is not available\");\n }\n return window.localStorage;\n}\n\nfunction bucketKey(\n namespace: string,\n extensionId: string,\n scope: string,\n collection: string,\n): string {\n return [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n encodedSegment(scope),\n encodedSegment(collection),\n ].join(\":\");\n}\n\nfunction readBucket(\n storage: Storage,\n key: string,\n): Record<string, AgentNativeExtensionStorageRow> {\n const raw = storage.getItem(key);\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, AgentNativeExtensionStorageRow>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction writeBucket(\n storage: Storage,\n key: string,\n value: Record<string, AgentNativeExtensionStorageRow>,\n) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nfunction listLocalStorageBuckets(\n storage: Storage,\n namespace: string,\n extensionId: string,\n collection: string,\n): string[] {\n const prefix = [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n \"\",\n ].join(\":\");\n const suffix = `:${encodedSegment(collection)}`;\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (key?.startsWith(prefix) && key.endsWith(suffix)) keys.push(key);\n }\n return keys;\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n list(collection, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n const keys =\n scope === \"all\"\n ? listLocalStorageBuckets(\n storage,\n namespace,\n context.extensionId,\n collection,\n )\n : [bucketKey(namespace, context.extensionId, scope, collection)];\n const rows = keys.flatMap((key) =>\n Object.values(readBucket(storage, key)),\n );\n const limit = options?.limit ?? 100;\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, Math.max(0, limit));\n },\n get(collection, id, options, context) {\n const rows = this.list(collection, options, context);\n if (rows instanceof Promise) {\n return rows.then(\n (resolved) => resolved.find((row) => row.id === id) ?? null,\n );\n }\n return rows.find((row) => row.id === id) ?? null;\n },\n set(collection, id, data, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data writes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const now = new Date().toISOString();\n const row: AgentNativeExtensionStorageRow = {\n id,\n extensionId: context.extensionId,\n collection,\n data,\n scope,\n createdAt: bucket[id]?.createdAt ?? now,\n updatedAt: now,\n };\n bucket[id] = row;\n writeBucket(storage, key, bucket);\n return row;\n },\n remove(collection, id, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data deletes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const removed = Boolean(bucket[id]);\n delete bucket[id];\n writeBucket(storage, key, bucket);\n return { removed };\n },\n };\n}\n\nasync function resolveHttpStorageHeaders(\n headers: CreateHttpAgentNativeExtensionStorageOptions[\"headers\"],\n context: AgentNativeExtensionStorageContext,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(context) : headers;\n}\n\nasync function readHttpStorageResponse<TResult>(\n response: Response,\n): Promise<TResult> {\n const text = await response.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body\n ? String((body as { error: unknown }).error)\n : `Extension storage request failed: ${response.status}`;\n throw new Error(message);\n }\n\n if (body && typeof body === \"object\" && \"result\" in body) {\n return (body as { result: TResult }).result;\n }\n return body as TResult;\n}\n\nexport function createHttpAgentNativeExtensionStorage({\n endpoint,\n fetch: fetchImpl,\n headers,\n credentials = \"same-origin\",\n}: CreateHttpAgentNativeExtensionStorageOptions): AgentNativeExtensionStorage {\n const run = async <TResult>(\n operation: \"list\" | \"get\" | \"set\" | \"remove\",\n collection: string,\n context: AgentNativeExtensionStorageContext,\n options?: AgentNativeExtensionStorageOptions,\n id?: string,\n data?: unknown,\n ): Promise<TResult> => {\n const requestFetch = fetchImpl ?? fetch;\n if (typeof requestFetch !== \"function\") {\n throw new Error(\"fetch is not available for extension storage\");\n }\n const resolvedHeaders = new Headers(\n await resolveHttpStorageHeaders(headers, context),\n );\n resolvedHeaders.set(\"Content-Type\", \"application/json\");\n\n const response = await requestFetch(endpoint, {\n method: \"POST\",\n credentials,\n headers: resolvedHeaders,\n body: JSON.stringify({\n operation,\n extensionId: context.extensionId,\n slotId: context.slotId,\n collection,\n id,\n data,\n options: options ?? {},\n context,\n }),\n });\n return readHttpStorageResponse<TResult>(response);\n };\n\n return {\n list(collection, options, context) {\n return run<AgentNativeExtensionStorageRow[]>(\n \"list\",\n collection,\n context,\n options,\n );\n },\n get(collection, id, options, context) {\n return run<AgentNativeExtensionStorageRow | null>(\n \"get\",\n collection,\n context,\n options,\n id,\n );\n },\n set(collection, id, data, options, context) {\n return run<AgentNativeExtensionStorageRow>(\n \"set\",\n collection,\n context,\n options,\n id,\n data,\n );\n },\n remove(collection, id, options, context) {\n return run<{ removed: boolean }>(\n \"remove\",\n collection,\n context,\n options,\n id,\n );\n },\n };\n}\n\nexport function normalizeAgentNativeExtensionSandbox(\n sandbox: string | undefined,\n): string {\n const tokens = new Set(\n (sandbox ?? \"allow-scripts allow-forms allow-popups allow-downloads\")\n .split(/\\s+/)\n .filter(Boolean),\n );\n tokens.delete(\"allow-same-origin\");\n tokens.add(\"allow-scripts\");\n tokens.add(\"allow-downloads\");\n return Array.from(tokens).join(\" \");\n}\n\nexport function buildAgentNativeExtensionHtml({\n extensionId,\n content,\n title,\n slotId,\n slotContext,\n themeCss = \"\",\n isDark = false,\n}: BuildAgentNativeExtensionHtmlOptions): string {\n const extensionIdJson = safeJson(extensionId);\n const slotIdJson = safeJson(slotId ?? \"\");\n const slotContextJson = safeJson(slotContext ?? {});\n const messageTypesJson = safeJson({\n host: AGENT_NATIVE_HOST_MESSAGE_TYPES,\n extension: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n });\n const titleText = title ?? \"Agent Native extension\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\"${isDark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${escapeHtmlAttribute(EXTENSION_IFRAME_META_CSP)}\" />\n <title>${escapeHtmlAttribute(titleText)}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-border: hsl(var(--border, 214 32% 91%));\n --color-background: hsl(var(--background, 0 0% 100%));\n --color-foreground: hsl(var(--foreground, 222 47% 11%));\n --color-primary: hsl(var(--primary, 222 47% 11%));\n --color-primary-foreground: hsl(var(--primary-foreground, 210 40% 98%));\n --color-muted: hsl(var(--muted, 210 40% 96%));\n --color-muted-foreground: hsl(var(--muted-foreground, 215 16% 47%));\n --color-card: hsl(var(--card, 0 0% 100%));\n --color-card-foreground: hsl(var(--card-foreground, 222 47% 11%));\n --radius-lg: var(--radius, .5rem);\n --radius-md: calc(var(--radius, .5rem) - 2px);\n --radius-sm: calc(var(--radius, .5rem) - 4px);\n }\n </style>\n <style>\n *, *::before, *::after { box-sizing: border-box; border-color: hsl(var(--border, 214 32% 91%)); }\n html, body { margin: 0; min-height: 100%; background: transparent; color: hsl(var(--foreground, 222 47% 11%)); }\n body {\n --agent-native-extension-padding: clamp(12px, 2vw, 20px);\n font-family: Inter, ui-sans-serif, system-ui, sans-serif;\n padding: var(--agent-native-extension-padding);\n }\n body:has(> [data-extension-layout=\"full-bleed\"]),\n body:has(> [data-extension-padding=\"none\"]),\n body:has(> .agent-native-extension-bleed) {\n padding: 0;\n }\n </style>\n <script>\n (function() {\n var messageTypes = ${messageTypesJson};\n var extensionId = ${extensionIdJson};\n var slotId = ${slotIdJson};\n var slotContext = ${slotContextJson};\n var requestSeq = 0;\n var pending = {};\n\n function nextRequestId(prefix) {\n requestSeq += 1;\n return prefix + '-' + Date.now() + '-' + requestSeq;\n }\n\n function failMessage(message, fallback) {\n return typeof message.error === 'string' ? message.error : fallback;\n }\n\n function requestParent(message, responseType, timeoutMs) {\n timeoutMs = timeoutMs || 30000;\n return new Promise(function(resolve, reject) {\n var requestId = message.requestId || nextRequestId('extension');\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error('Timed out waiting for host response'));\n }, timeoutMs);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer,\n };\n window.parent.postMessage(Object.assign({}, message, { requestId: requestId }), '*');\n });\n }\n\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n\n if (message.type === messageTypes.host.INIT) {\n agentNative.init = message;\n agentNative.contextSnapshot = message.context || null;\n agentNative.actionsSnapshot = message.actions || [];\n window.dispatchEvent(new CustomEvent('agentNative:init', { detail: message }));\n return;\n }\n\n if (message.type === messageTypes.extension.SLOT_CONTEXT) {\n slotContext = message.context || {};\n agentNative.slotContext = slotContext;\n window.slotContext = slotContext;\n window.dispatchEvent(new CustomEvent('agentNative:slot-context', { detail: slotContext }));\n return;\n }\n\n var entry = pending[message.requestId];\n if (!entry || message.type !== entry.responseType) return;\n delete pending[message.requestId];\n clearTimeout(entry.timer);\n if (message.ok === false) {\n entry.reject(new Error(failMessage(message, 'Host request failed')));\n } else {\n entry.resolve(message);\n }\n });\n\n function hostContext() {\n return requestParent(\n { type: messageTypes.host.GET_CONTEXT },\n messageTypes.host.CONTEXT,\n ).then(function(message) { return message.context || {}; });\n }\n\n function hostActions() {\n return requestParent(\n { type: messageTypes.host.LIST_ACTIONS },\n messageTypes.host.ACTIONS,\n ).then(function(message) { return message.actions || []; });\n }\n\n function hostAction(name, args) {\n return requestParent(\n { type: messageTypes.host.RUN_ACTION, name: name, args: args || {} },\n messageTypes.host.ACTION_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function hostCommand(command, payload) {\n return requestParent(\n { type: messageTypes.host.COMMAND, command: command, payload: payload },\n messageTypes.host.COMMAND_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function storageRequest(op, collection, id, data, options) {\n return requestParent(\n {\n type: messageTypes.extension.STORAGE_REQUEST,\n op: op,\n collection: collection,\n id: id,\n data: data,\n options: options || {},\n },\n messageTypes.extension.STORAGE_RESPONSE,\n ).then(function(message) { return message.result; });\n }\n\n var extensionData = {\n list: function(collection, options) {\n return storageRequest('list', collection, undefined, undefined, options);\n },\n get: function(collection, id, options) {\n return storageRequest('get', collection, id, undefined, options);\n },\n set: function(collection, id, data, options) {\n return storageRequest('set', collection, id, data, options);\n },\n remove: function(collection, id, options) {\n return storageRequest('remove', collection, id, undefined, options);\n },\n };\n\n var agentNative = {\n version: '0.1.0',\n extensionId: extensionId,\n slotId: slotId,\n slotContext: slotContext,\n contextSnapshot: null,\n actionsSnapshot: [],\n init: null,\n context: hostContext,\n listActions: hostActions,\n action: hostAction,\n command: hostCommand,\n refresh: function(payload) { return hostCommand('refreshData', payload); },\n data: extensionData,\n };\n\n window.agentNative = agentNative;\n window.appAction = hostAction;\n window.extensionData = extensionData;\n window.toolData = extensionData;\n window.extensionId = extensionId;\n window.toolId = extensionId;\n window.slotContext = slotContext;\n\n function reportHeight() {\n try {\n var doc = document.documentElement;\n var body = document.body;\n var height = Math.max(\n doc ? doc.scrollHeight : 0,\n doc ? doc.offsetHeight : 0,\n body ? body.scrollHeight : 0,\n body ? body.offsetHeight : 0,\n );\n window.parent.postMessage({\n type: messageTypes.extension.RESIZE,\n extensionId: extensionId,\n slotId: slotId,\n height: height,\n }, '*');\n } catch (_) {}\n }\n\n window.addEventListener('load', reportHeight);\n if (typeof ResizeObserver !== 'undefined') {\n new ResizeObserver(reportHeight).observe(document.documentElement);\n } else {\n setInterval(reportHeight, 1000);\n }\n\n window.parent.postMessage({\n type: messageTypes.host.READY,\n requestId: nextRequestId('ready'),\n }, '*');\n })();\n </script>\n${buildSessionReplayIframeBootstrap()}\n</head>\n<body>\n${content}\n</body>\n</html>`;\n}\n"]}
|
|
@@ -26,6 +26,12 @@ export interface SessionReplayNetworkOptions {
|
|
|
26
26
|
captureErrorBodies?: boolean;
|
|
27
27
|
maxErrorBodyLength?: number;
|
|
28
28
|
}
|
|
29
|
+
export interface SessionReplayUploadRejectedDetails {
|
|
30
|
+
status: number;
|
|
31
|
+
restartAttempted: boolean;
|
|
32
|
+
restartSucceeded: boolean;
|
|
33
|
+
restartReason?: SessionReplayStartResult["reason"];
|
|
34
|
+
}
|
|
29
35
|
export interface SessionReplayOptions {
|
|
30
36
|
enabled?: boolean;
|
|
31
37
|
/** Rechecked immediately before rrweb starts to cancel deferred startup. */
|
|
@@ -76,6 +82,8 @@ export interface SessionReplayOptions {
|
|
|
76
82
|
* disable, or an options object to override caps.
|
|
77
83
|
*/
|
|
78
84
|
network?: boolean | SessionReplayNetworkOptions;
|
|
85
|
+
/** Rare recorder lifecycle signal; never includes replay content or URLs. */
|
|
86
|
+
onUploadRejected?: (details: SessionReplayUploadRejectedDetails) => void;
|
|
79
87
|
extraProperties?: Record<string, unknown> | (() => Record<string, unknown> | undefined);
|
|
80
88
|
}
|
|
81
89
|
export interface SessionReplayStartResult {
|
|
@@ -98,9 +106,10 @@ export declare function maybeStartSessionReplay(options?: SessionReplayOptions):
|
|
|
98
106
|
export declare function isSessionReplayActive(): boolean;
|
|
99
107
|
/**
|
|
100
108
|
* The active session replay id when a recording is running, or the last one
|
|
101
|
-
* persisted for this analytics session in `
|
|
102
|
-
* capture uses this to tie each captured exception to the
|
|
103
|
-
* in, so triage can jump straight to
|
|
109
|
+
* persisted for this analytics session in this tab's `sessionStorage`.
|
|
110
|
+
* First-party error capture uses this to tie each captured exception to the
|
|
111
|
+
* replay it happened in, so triage can jump straight to
|
|
112
|
+
* `/sessions/<recordingId>`.
|
|
104
113
|
*/
|
|
105
114
|
export declare function getSessionReplayId(): string | null;
|
|
106
115
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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"}
|