@agent-native/core 0.98.4 → 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.
Files changed (217) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +16 -0
  3. package/corpus/core/docs/content/durable-background-runs.mdx +37 -0
  4. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +2 -0
  5. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +2 -0
  6. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +2 -0
  7. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +4 -2
  8. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +2 -0
  9. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +2 -0
  10. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +2 -0
  11. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +2 -0
  12. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +2 -0
  13. package/corpus/core/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  14. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +2 -0
  15. package/corpus/core/docs/content/tracking.mdx +2 -0
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/agent/durable-background.ts +16 -16
  18. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +25 -8
  19. package/corpus/core/src/agent/engine/anthropic-engine.ts +17 -3
  20. package/corpus/core/src/agent/engine/output-tokens.ts +6 -6
  21. package/corpus/core/src/agent/production-agent.ts +200 -27
  22. package/corpus/core/src/agent/run-manager.ts +81 -1
  23. package/corpus/core/src/agent/run-store.ts +301 -41
  24. package/corpus/core/src/client/AgentPanel.tsx +6 -2
  25. package/corpus/core/src/client/AssistantChat.tsx +364 -69
  26. package/corpus/core/src/client/agent-chat-adapter.ts +169 -1
  27. package/corpus/core/src/client/chat/message-components.tsx +3 -0
  28. package/corpus/core/src/client/chat/tool-call-display.tsx +20 -36
  29. package/corpus/core/src/client/conversation/use-near-bottom-autoscroll.ts +7 -0
  30. package/corpus/core/src/client/extensions/AgentNativeExtensionFrame.tsx +2 -0
  31. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +2 -0
  32. package/corpus/core/src/client/extensions/ExtensionEditor.tsx +9 -2
  33. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +2 -0
  34. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +2 -0
  35. package/corpus/core/src/client/extensions/portable-extension.ts +2 -0
  36. package/corpus/core/src/client/session-replay.ts +361 -29
  37. package/corpus/core/src/client/sse-event-processor.ts +43 -1
  38. package/corpus/core/src/demo/actions/toggle-demo-mode.ts +1 -1
  39. package/corpus/core/src/demo/config.ts +6 -6
  40. package/corpus/core/src/demo/fetch-interceptor.ts +13 -4
  41. package/corpus/core/src/demo/redact.ts +13 -149
  42. package/corpus/core/src/extensions/html-shell.ts +3 -0
  43. package/corpus/core/src/extensions/session-replay-iframe.ts +131 -0
  44. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -20
  45. package/corpus/core/src/session-replay-iframe-protocol.ts +58 -0
  46. package/corpus/core/src/shared/reasoning-effort.ts +35 -0
  47. package/corpus/core/src/styles/agent-conversation.css +26 -0
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  49. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +30 -21
  50. package/corpus/templates/analytics/AGENTS.md +12 -0
  51. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -0
  52. package/corpus/templates/analytics/actions/get-session-replay-events.ts +1 -0
  53. package/corpus/templates/analytics/actions/get-session-replay-summary.ts +1 -0
  54. package/corpus/templates/analytics/actions/list-error-issues.ts +1 -0
  55. package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -0
  56. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +2 -1
  57. package/corpus/templates/analytics/app/global.css +2 -2
  58. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +41 -4
  59. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +52 -203
  60. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +34 -12
  61. package/corpus/templates/analytics/changelog/2026-07-12-analytics-chat-retries-before-showing-a-generic-no-data-mess.md +6 -0
  62. package/corpus/templates/analytics/changelog/2026-07-12-analytics-sessions-search-no-longer-loses-fast-keystrokes-an.md +6 -0
  63. package/corpus/templates/analytics/changelog/2026-07-12-chart-selection-respects-chat-state.md +6 -0
  64. package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-anonymizes-error-reporting-emails.md +6 -0
  65. package/corpus/templates/analytics/changelog/2026-07-12-session-replays-show-iframe-content.md +6 -0
  66. package/corpus/templates/analytics/netlify.toml +0 -3
  67. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +14 -0
  68. package/corpus/templates/analytics/server/lib/error-capture.ts +59 -2
  69. package/corpus/templates/analytics/server/lib/real-data-actions.ts +24 -0
  70. package/corpus/templates/analytics/server/lib/session-replay.ts +2 -9
  71. package/corpus/templates/analytics/server/plugins/agent-chat.ts +39 -6
  72. package/corpus/templates/assets/app/global.css +1 -1
  73. package/corpus/templates/brain/app/global.css +2 -2
  74. package/corpus/templates/brain/changelog/2026-07-12-fix-long-response-progress.md +6 -0
  75. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +1 -1
  76. package/corpus/templates/forms/app/components/ThemeToggle.tsx +22 -6
  77. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +5 -5
  78. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +3 -3
  79. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +16 -16
  80. package/corpus/templates/forms/app/global.css +110 -5
  81. package/corpus/templates/forms/app/pages/AskPage.tsx +3 -3
  82. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +134 -52
  83. package/corpus/templates/forms/app/pages/FormFillPage.tsx +44 -11
  84. package/corpus/templates/forms/app/pages/FormsListPage.tsx +42 -24
  85. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +28 -15
  86. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +38 -15
  87. package/corpus/templates/forms/app/routes/_app.settings.tsx +1 -1
  88. package/corpus/templates/forms/changelog/2026-07-12-form-builder-surfaces-are-calmer-fields-stay-stable-on-hover.md +6 -0
  89. package/corpus/templates/forms/changelog/2026-07-12-smoother-more-tactile-controls-throughout-animated-icon-and-.md +6 -0
  90. package/corpus/templates/mail/app/components/email/EmailThread.tsx +21 -13
  91. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +18 -0
  92. package/dist/agent/durable-background.d.ts +10 -10
  93. package/dist/agent/durable-background.d.ts.map +1 -1
  94. package/dist/agent/durable-background.js +16 -16
  95. package/dist/agent/durable-background.js.map +1 -1
  96. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  97. package/dist/agent/engine/ai-sdk-engine.js +19 -8
  98. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  99. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  100. package/dist/agent/engine/anthropic-engine.js +11 -3
  101. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  102. package/dist/agent/engine/output-tokens.js +6 -6
  103. package/dist/agent/engine/output-tokens.js.map +1 -1
  104. package/dist/agent/production-agent.d.ts +52 -0
  105. package/dist/agent/production-agent.d.ts.map +1 -1
  106. package/dist/agent/production-agent.js +154 -26
  107. package/dist/agent/production-agent.js.map +1 -1
  108. package/dist/agent/run-manager.d.ts +9 -0
  109. package/dist/agent/run-manager.d.ts.map +1 -1
  110. package/dist/agent/run-manager.js +71 -1
  111. package/dist/agent/run-manager.js.map +1 -1
  112. package/dist/agent/run-store.d.ts +9 -0
  113. package/dist/agent/run-store.d.ts.map +1 -1
  114. package/dist/agent/run-store.js +243 -48
  115. package/dist/agent/run-store.js.map +1 -1
  116. package/dist/client/AgentPanel.d.ts.map +1 -1
  117. package/dist/client/AgentPanel.js +6 -2
  118. package/dist/client/AgentPanel.js.map +1 -1
  119. package/dist/client/AssistantChat.d.ts +21 -0
  120. package/dist/client/AssistantChat.d.ts.map +1 -1
  121. package/dist/client/AssistantChat.js +298 -67
  122. package/dist/client/AssistantChat.js.map +1 -1
  123. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  124. package/dist/client/agent-chat-adapter.js +146 -1
  125. package/dist/client/agent-chat-adapter.js.map +1 -1
  126. package/dist/client/chat/message-components.d.ts.map +1 -1
  127. package/dist/client/chat/message-components.js +2 -1
  128. package/dist/client/chat/message-components.js.map +1 -1
  129. package/dist/client/chat/tool-call-display.d.ts +3 -1
  130. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  131. package/dist/client/chat/tool-call-display.js +13 -37
  132. package/dist/client/chat/tool-call-display.js.map +1 -1
  133. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -0
  134. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  135. package/dist/client/conversation/use-near-bottom-autoscroll.js +6 -0
  136. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  137. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  138. package/dist/client/extensions/AgentNativeExtensionFrame.js +2 -1
  139. package/dist/client/extensions/AgentNativeExtensionFrame.js.map +1 -1
  140. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  141. package/dist/client/extensions/EmbeddedExtension.js +2 -1
  142. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  143. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  144. package/dist/client/extensions/ExtensionEditor.js +5 -2
  145. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  146. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  147. package/dist/client/extensions/ExtensionViewer.js +2 -1
  148. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  149. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  150. package/dist/client/extensions/InlineExtensionFrame.js +2 -1
  151. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  152. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  153. package/dist/client/extensions/portable-extension.js +2 -0
  154. package/dist/client/extensions/portable-extension.js.map +1 -1
  155. package/dist/client/session-replay.d.ts.map +1 -1
  156. package/dist/client/session-replay.js +308 -29
  157. package/dist/client/session-replay.js.map +1 -1
  158. package/dist/client/sse-event-processor.d.ts +5 -0
  159. package/dist/client/sse-event-processor.d.ts.map +1 -1
  160. package/dist/client/sse-event-processor.js +37 -1
  161. package/dist/client/sse-event-processor.js.map +1 -1
  162. package/dist/collab/routes.d.ts +1 -1
  163. package/dist/collab/struct-routes.d.ts +1 -1
  164. package/dist/demo/actions/toggle-demo-mode.js +1 -1
  165. package/dist/demo/actions/toggle-demo-mode.js.map +1 -1
  166. package/dist/demo/config.js +6 -6
  167. package/dist/demo/config.js.map +1 -1
  168. package/dist/demo/fetch-interceptor.d.ts.map +1 -1
  169. package/dist/demo/fetch-interceptor.js +13 -4
  170. package/dist/demo/fetch-interceptor.js.map +1 -1
  171. package/dist/demo/redact.d.ts +7 -7
  172. package/dist/demo/redact.d.ts.map +1 -1
  173. package/dist/demo/redact.js +8 -145
  174. package/dist/demo/redact.js.map +1 -1
  175. package/dist/extensions/html-shell.d.ts.map +1 -1
  176. package/dist/extensions/html-shell.js +2 -0
  177. package/dist/extensions/html-shell.js.map +1 -1
  178. package/dist/extensions/session-replay-iframe.d.ts +10 -0
  179. package/dist/extensions/session-replay-iframe.d.ts.map +1 -0
  180. package/dist/extensions/session-replay-iframe.js +121 -0
  181. package/dist/extensions/session-replay-iframe.js.map +1 -0
  182. package/dist/progress/routes.d.ts +1 -1
  183. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  184. package/dist/resources/handlers.d.ts +3 -3
  185. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  186. package/dist/scripts/agent-engines/list-agent-engines.js +1 -19
  187. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  188. package/dist/session-replay-iframe-protocol.d.ts +36 -0
  189. package/dist/session-replay-iframe-protocol.d.ts.map +1 -0
  190. package/dist/session-replay-iframe-protocol.js +24 -0
  191. package/dist/session-replay-iframe-protocol.js.map +1 -0
  192. package/dist/shared/reasoning-effort.d.ts +11 -0
  193. package/dist/shared/reasoning-effort.d.ts.map +1 -1
  194. package/dist/shared/reasoning-effort.js +36 -0
  195. package/dist/shared/reasoning-effort.js.map +1 -1
  196. package/dist/styles/agent-conversation.css +26 -0
  197. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  198. package/docs/content/durable-background-runs.mdx +37 -0
  199. package/docs/content/locales/ar-SA/tracking.mdx +2 -0
  200. package/docs/content/locales/de-DE/tracking.mdx +2 -0
  201. package/docs/content/locales/es-ES/tracking.mdx +2 -0
  202. package/docs/content/locales/fr-FR/tracking.mdx +4 -2
  203. package/docs/content/locales/hi-IN/tracking.mdx +2 -0
  204. package/docs/content/locales/ja-JP/tracking.mdx +2 -0
  205. package/docs/content/locales/ko-KR/tracking.mdx +2 -0
  206. package/docs/content/locales/pt-BR/tracking.mdx +2 -0
  207. package/docs/content/locales/zh-CN/tracking.mdx +2 -0
  208. package/docs/content/locales/zh-TW/durable-background-runs.mdx +14 -0
  209. package/docs/content/locales/zh-TW/tracking.mdx +2 -0
  210. package/docs/content/tracking.mdx +2 -0
  211. package/package.json +2 -2
  212. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +0 -15
  213. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  214. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  215. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  216. package/dist/observability/hosted-model-experiment.js +0 -90
  217. package/dist/observability/hosted-model-experiment.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AgentNativeExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type IframeHTMLAttributes,\n} from \"react\";\n\nimport {\n createAgentNativeHostBridge,\n type AgentNativeClientAction,\n type AgentNativeClientActions,\n type AgentNativeHostAuth,\n type AgentNativeHostBridge,\n type AgentNativeHostBridgeEvent,\n type AgentNativeHostCommandHandler,\n type AgentNativeHostCommandHandlers,\n type AgentNativeHostContext,\n type AgentNativeHostContextGetter,\n type AgentNativeHostSession,\n} from \"../host-bridge.js\";\nimport {\n AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n buildAgentNativeExtensionHtml,\n createLocalStorageAgentNativeExtensionStorage,\n getAgentNativeExtensionManifest,\n isAgentNativeExtensionAllowedInSlot,\n normalizeAgentNativeExtensionSandbox,\n type AgentNativeExtensionDefinition,\n type AgentNativeExtensionStorage,\n type AgentNativeExtensionStorageContext,\n type AgentNativeExtensionStorageOptions,\n type AgentNativeExtensionStorageScope,\n} from \"./portable-extension.js\";\n\nexport type AgentNativeExtensionPermissionList =\n | readonly string[]\n | ((\n extension: AgentNativeExtensionDefinition,\n ) => readonly string[] | undefined)\n | undefined;\n\nexport type AgentNativeExtensionStorageScopeList =\n | readonly AgentNativeExtensionStorageScope[]\n | ((\n extension: AgentNativeExtensionDefinition,\n ) => readonly AgentNativeExtensionStorageScope[] | undefined)\n | undefined;\n\nexport interface AgentNativeExtensionFrameProps extends Omit<\n IframeHTMLAttributes<HTMLIFrameElement>,\n \"src\" | \"srcDoc\"\n> {\n extension: AgentNativeExtensionDefinition;\n /** Stable slot identifier, for example `customer-detail.sidebar`. */\n slotId?: string;\n /** Context pushed into `window.slotContext` and merged into host context. */\n context?: Record<string, unknown> | null;\n /** Live actions exposed to the extension through `appAction()` and `agentNative.action()`. */\n actions?: AgentNativeClientActions;\n /** Page/app context exposed through `agentNative.context()`. */\n getContext?: AgentNativeHostContextGetter;\n /** Host commands exposed through `agentNative.command()` and `agentNative.refresh()`. */\n commands?: AgentNativeHostCommandHandlers;\n /** Host-enforced action allowlist. Defaults to extension manifest requestedActions. */\n allowedActions?: AgentNativeExtensionPermissionList;\n /** Host-enforced command allowlist. Defaults to extension manifest requestedCommands. */\n allowedCommands?: AgentNativeExtensionPermissionList;\n auth?: AgentNativeHostAuth;\n session?: string | Partial<AgentNativeHostSession>;\n /** Storage adapter used by `extensionData.*`. Defaults to browser localStorage. */\n storage?: AgentNativeExtensionStorage | false;\n /** Host-enforced storage scope allowlist. Defaults to extension manifest storageScopes. */\n allowedStorageScopes?: AgentNativeExtensionStorageScopeList;\n storageNamespace?: string;\n storageContext?: Omit<\n AgentNativeExtensionStorageContext,\n \"extensionId\" | \"slotId\"\n >;\n themeCss?: string;\n isDark?: boolean;\n autoHeight?: boolean;\n initialHeight?: number;\n onBridgeEvent?: (event: AgentNativeHostBridgeEvent) => void;\n onBridgeReady?: (bridge: AgentNativeHostBridge) => void;\n onStorageError?: (\n error: Error,\n request: AgentNativeExtensionStorageRequest,\n ) => void;\n}\n\nexport interface AgentNativeExtensionSlotProps extends Omit<\n AgentNativeExtensionFrameProps,\n \"extension\" | \"className\" | \"style\" | \"children\"\n> {\n id: string;\n extensions: AgentNativeExtensionDefinition[];\n className?: string;\n extensionClassName?: string;\n extensionStyle?: CSSProperties;\n empty?: React.ReactNode;\n showEmptyAffordance?: boolean;\n}\n\ninterface AgentNativeExtensionStorageRequest {\n requestId: string;\n op: \"list\" | \"get\" | \"set\" | \"remove\";\n collection: string;\n id?: string;\n data?: unknown;\n options?: AgentNativeExtensionStorageOptions;\n}\n\nconst defaultFrameStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n width: \"100%\",\n};\n\nconst BUILT_IN_COMMAND_NAMES = [\n \"navigate\",\n \"refreshData\",\n \"refresh-data\",\n \"remountView\",\n \"remount-view\",\n \"hardReload\",\n \"hard-reload\",\n \"openResource\",\n \"open-resource\",\n \"requestApproval\",\n \"request-approval\",\n];\n\nconst COMMAND_ALIASES: Record<string, readonly string[]> = {\n refreshData: [\"refreshData\", \"refresh-data\"],\n \"refresh-data\": [\"refreshData\", \"refresh-data\"],\n remountView: [\"remountView\", \"remount-view\"],\n \"remount-view\": [\"remountView\", \"remount-view\"],\n hardReload: [\"hardReload\", \"hard-reload\"],\n \"hard-reload\": [\"hardReload\", \"hard-reload\"],\n openResource: [\"openResource\", \"open-resource\"],\n \"open-resource\": [\"openResource\", \"open-resource\"],\n requestApproval: [\"requestApproval\", \"request-approval\"],\n \"request-approval\": [\"requestApproval\", \"request-approval\"],\n};\n\nfunction setForwardedRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction safeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nfunction resolvePermissionList(\n value: AgentNativeExtensionPermissionList,\n extension: AgentNativeExtensionDefinition,\n fallback: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (typeof value === \"function\") return value(extension);\n if (Array.isArray(value)) return value;\n return fallback;\n}\n\nfunction resolveStorageScopeList(\n value: AgentNativeExtensionStorageScopeList,\n extension: AgentNativeExtensionDefinition,\n fallback: readonly AgentNativeExtensionStorageScope[] | undefined,\n): readonly AgentNativeExtensionStorageScope[] | undefined {\n if (typeof value === \"function\") return value(extension);\n if (Array.isArray(value)) return value;\n return fallback;\n}\n\nfunction toPermissionSet(\n value: readonly string[] | undefined,\n): Set<string> | null {\n return value ? new Set(value) : null;\n}\n\nfunction commandPermissionSet(\n value: readonly string[] | undefined,\n): Set<string> | null {\n if (!value) return null;\n const expanded = new Set<string>();\n for (const command of value) {\n expanded.add(command);\n for (const alias of COMMAND_ALIASES[command] ?? []) expanded.add(alias);\n }\n return expanded;\n}\n\nasync function resolveActions(\n actions: AgentNativeClientActions | undefined,\n): Promise<AgentNativeClientAction[]> {\n const resolved = typeof actions === \"function\" ? await actions() : actions;\n return Array.isArray(resolved) ? resolved : [];\n}\n\nfunction scopeExtensionActions(\n actions: AgentNativeClientActions | undefined,\n allowedNames: Set<string> | null,\n): AgentNativeClientActions | undefined {\n if (!actions || !allowedNames) return actions;\n return async () =>\n (await resolveActions(actions)).filter((action) =>\n allowedNames.has(action.name),\n );\n}\n\nfunction blockedCommand(command: string): AgentNativeHostCommandHandler {\n return () => {\n throw new Error(\n `Extension is not allowed to call host command \"${command}\"`,\n );\n };\n}\n\nfunction scopeExtensionCommands(\n commands: AgentNativeHostCommandHandlers | undefined,\n allowedNames: Set<string> | null,\n): AgentNativeHostCommandHandlers | undefined {\n if (!allowedNames) return commands;\n\n const scoped: AgentNativeHostCommandHandlers = {};\n for (const command of BUILT_IN_COMMAND_NAMES) {\n if (!allowedNames.has(command)) scoped[command] = blockedCommand(command);\n }\n\n for (const [command, handler] of Object.entries(commands ?? {})) {\n scoped[command] = allowedNames.has(command)\n ? handler\n : blockedCommand(command);\n }\n\n return scoped;\n}\n\nfunction normalizeStorageRequest(\n value: unknown,\n): AgentNativeExtensionStorageRequest | null {\n if (!isRecord(value)) return null;\n const requestId = typeof value.requestId === \"string\" ? value.requestId : \"\";\n const op =\n value.op === \"list\" ||\n value.op === \"get\" ||\n value.op === \"set\" ||\n value.op === \"remove\"\n ? value.op\n : null;\n const collection =\n typeof value.collection === \"string\" ? value.collection.trim() : \"\";\n const id = typeof value.id === \"string\" ? value.id : undefined;\n const options = isRecord(value.options)\n ? (value.options as AgentNativeExtensionStorageOptions)\n : undefined;\n\n if (!requestId || !op || !collection) return null;\n if ((op === \"get\" || op === \"set\" || op === \"remove\") && !id) {\n return null;\n }\n\n return {\n requestId,\n op,\n collection,\n id,\n data: value.data,\n options,\n };\n}\n\nfunction mergeExtensionContext(\n base: AgentNativeHostContext | undefined,\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n slotContext: Record<string, unknown> | null | undefined,\n): AgentNativeHostContext {\n return {\n ...(base ?? {}),\n extension: {\n id: extension.id,\n name: extension.name,\n description: extension.description,\n },\n slot: slotId\n ? {\n id: slotId,\n context: slotContext ?? {},\n }\n : undefined,\n data: {\n ...(base?.data ?? {}),\n extension: {\n id: extension.id,\n name: extension.name,\n },\n slotContext: slotContext ?? {},\n },\n };\n}\n\nexport const AgentNativeExtensionFrame = forwardRef<\n HTMLIFrameElement,\n AgentNativeExtensionFrameProps\n>(function AgentNativeExtensionFrame(\n {\n extension,\n slotId,\n context,\n actions,\n getContext,\n commands,\n allowedActions,\n allowedCommands,\n auth,\n session,\n storage,\n allowedStorageScopes,\n storageNamespace = \"default\",\n storageContext,\n themeCss,\n isDark,\n autoHeight = true,\n initialHeight = 120,\n onBridgeEvent,\n onBridgeReady,\n onStorageError,\n title,\n sandbox,\n allow = \"clipboard-read; clipboard-write\",\n referrerPolicy = \"no-referrer\",\n style,\n onLoad,\n ...iframeProps\n },\n forwardedRef,\n) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const bridgeRef = useRef<AgentNativeHostBridge | null>(null);\n const [height, setHeight] = useState(initialHeight);\n const localStorageAdapter = useMemo(\n () => createLocalStorageAgentNativeExtensionStorage(storageNamespace),\n [storageNamespace],\n );\n const storageAdapter = storage === undefined ? localStorageAdapter : storage;\n const contextJson = safeStringify(context);\n const sandboxValue = useMemo(\n () => normalizeAgentNativeExtensionSandbox(sandbox),\n [sandbox],\n );\n const sessionValue =\n session ?? `extension:${extension.id}:${slotId ?? \"standalone\"}`;\n const manifest = useMemo(\n () => getAgentNativeExtensionManifest(extension),\n [extension],\n );\n const actionAllowlist = useMemo(\n () =>\n toPermissionSet(\n resolvePermissionList(\n allowedActions,\n extension,\n manifest.requestedActions,\n ),\n ),\n [allowedActions, extension, manifest.requestedActions],\n );\n const commandAllowlist = useMemo(\n () =>\n commandPermissionSet(\n resolvePermissionList(\n allowedCommands,\n extension,\n manifest.requestedCommands,\n ),\n ),\n [allowedCommands, extension, manifest.requestedCommands],\n );\n const storageScopeAllowlist = useMemo(() => {\n const scopes = resolveStorageScopeList(\n allowedStorageScopes,\n extension,\n manifest.storageScopes,\n );\n return scopes ? new Set(scopes) : null;\n }, [allowedStorageScopes, extension, manifest.storageScopes]);\n const scopedActions = useMemo(\n () => scopeExtensionActions(actions, actionAllowlist),\n [actions, actionAllowlist],\n );\n const scopedCommands = useMemo(\n () => scopeExtensionCommands(commands, commandAllowlist),\n [commands, commandAllowlist],\n );\n\n const getMergedContext = useCallback(async () => {\n const base = getContext ? await getContext() : {};\n return mergeExtensionContext(base, extension, slotId, context);\n }, [contextJson, extension, getContext, slotId]);\n\n const srcDoc = useMemo(\n () =>\n buildAgentNativeExtensionHtml({\n extensionId: extension.id,\n title: title ?? extension.name,\n content: extension.content,\n slotId,\n slotContext: context,\n themeCss,\n isDark,\n }),\n [\n contextJson,\n extension.content,\n extension.id,\n extension.name,\n isDark,\n slotId,\n themeCss,\n title,\n ],\n );\n\n const postSlotContext = useCallback(() => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.SLOT_CONTEXT,\n extensionId: extension.id,\n slotId,\n context: context ?? {},\n },\n \"*\",\n );\n }, [contextJson, extension.id, slotId]);\n\n useEffect(() => {\n const bridge = createAgentNativeHostBridge({\n session: sessionValue,\n getContext: getMergedContext,\n commands: scopedCommands,\n actions: scopedActions,\n auth,\n onEvent: onBridgeEvent,\n targetWindow: iframeRef.current?.contentWindow ?? null,\n }).start();\n bridgeRef.current = bridge;\n onBridgeReady?.(bridge);\n return () => {\n bridge.stop();\n if (bridgeRef.current === bridge) bridgeRef.current = null;\n };\n }, [\n actions,\n auth,\n getMergedContext,\n onBridgeEvent,\n onBridgeReady,\n sessionValue,\n scopedActions,\n scopedCommands,\n ]);\n\n useEffect(() => {\n postSlotContext();\n void bridgeRef.current?.refreshContext();\n }, [postSlotContext]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const respond = (requestId: string, payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_RESPONSE,\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n const handleStorageRequest = async (\n request: AgentNativeExtensionStorageRequest,\n ) => {\n try {\n if (!storageAdapter) {\n throw new Error(\"No extension storage adapter is registered\");\n }\n const requestContext: AgentNativeExtensionStorageContext = {\n ...(storageContext ?? {}),\n extensionId: extension.id,\n slotId,\n };\n const { op, collection, id, data, options } = request;\n const requestedScope =\n typeof options?.scope === \"string\"\n ? options.scope\n : (requestContext.scope ?? \"user\");\n if (\n storageScopeAllowlist &&\n !storageScopeAllowlist.has(requestedScope)\n ) {\n throw new Error(\n `Extension is not allowed to use storage scope \"${requestedScope}\"`,\n );\n }\n const result =\n op === \"list\"\n ? await storageAdapter.list(collection, options, requestContext)\n : op === \"get\"\n ? await storageAdapter.get(\n collection,\n id as string,\n options,\n requestContext,\n )\n : op === \"set\"\n ? await storageAdapter.set(\n collection,\n id as string,\n data,\n options,\n requestContext,\n )\n : await storageAdapter.remove(\n collection,\n id as string,\n options,\n requestContext,\n );\n respond(request.requestId, { ok: true, result });\n } catch (error) {\n const err = safeError(error);\n onStorageError?.(err, request);\n respond(request.requestId, { ok: false, error: err.message });\n }\n };\n\n function onMessage(event: MessageEvent) {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!isRecord(message)) return;\n\n if (message.type === AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.RESIZE) {\n if (!autoHeight) return;\n const nextHeight = Number(message.height);\n if (Number.isFinite(nextHeight) && nextHeight > 0) {\n setHeight(Math.ceil(nextHeight));\n }\n return;\n }\n\n if (\n message.type !== AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_REQUEST\n ) {\n return;\n }\n\n const request = normalizeStorageRequest(message);\n if (!request) {\n const requestId =\n typeof message.requestId === \"string\" ? message.requestId : \"\";\n if (requestId) {\n respond(requestId, {\n ok: false,\n error: \"Invalid extension storage request\",\n });\n }\n return;\n }\n\n void handleStorageRequest(request);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [\n autoHeight,\n extension.id,\n onStorageError,\n slotId,\n storageAdapter,\n storageContext,\n storageScopeAllowlist,\n ]);\n\n return (\n <iframe\n {...iframeProps}\n key={`${extension.id}:${extension.updatedAt ?? \"\"}`}\n ref={(node) => {\n iframeRef.current = node;\n setForwardedRef(forwardedRef, node);\n bridgeRef.current?.setTargetWindow(node?.contentWindow ?? null);\n }}\n title={title ?? extension.name}\n srcDoc={srcDoc}\n sandbox={sandboxValue}\n allow={allow}\n referrerPolicy={referrerPolicy}\n style={{\n ...defaultFrameStyle,\n height: autoHeight ? height : \"100%\",\n ...style,\n }}\n onLoad={(event) => {\n bridgeRef.current?.setTargetWindow(\n event.currentTarget.contentWindow ?? null,\n );\n postSlotContext();\n void bridgeRef.current?.sendInit();\n onLoad?.(event);\n }}\n />\n );\n});\n\nexport function AgentNativeExtensionSlot({\n id,\n extensions,\n context,\n actions,\n getContext,\n commands,\n allowedActions,\n allowedCommands,\n auth,\n session,\n storage,\n allowedStorageScopes,\n storageNamespace,\n storageContext,\n themeCss,\n isDark,\n autoHeight,\n initialHeight,\n onBridgeEvent,\n onBridgeReady,\n onStorageError,\n className,\n extensionClassName,\n extensionStyle,\n empty = null,\n showEmptyAffordance = false,\n ...iframeProps\n}: AgentNativeExtensionSlotProps) {\n const slotExtensions = extensions.filter((extension) =>\n isAgentNativeExtensionAllowedInSlot(extension, id),\n );\n\n if (slotExtensions.length === 0) {\n if (!showEmptyAffordance) return null;\n return <div className={className}>{empty}</div>;\n }\n\n return (\n <div className={className}>\n {slotExtensions.map((extension) => (\n <AgentNativeExtensionFrame\n {...iframeProps}\n key={extension.id}\n extension={extension}\n slotId={id}\n context={context}\n actions={actions}\n getContext={getContext}\n commands={commands}\n allowedActions={allowedActions}\n allowedCommands={allowedCommands}\n auth={auth}\n session={session}\n storage={storage}\n allowedStorageScopes={allowedStorageScopes}\n storageNamespace={storageNamespace}\n storageContext={storageContext}\n themeCss={themeCss}\n isDark={isDark}\n autoHeight={autoHeight}\n initialHeight={initialHeight}\n onBridgeEvent={onBridgeEvent}\n onBridgeReady={onBridgeReady}\n onStorageError={onStorageError}\n className={extensionClassName}\n style={extensionStyle}\n />\n ))}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"AgentNativeExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/AgentNativeExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type IframeHTMLAttributes,\n} from \"react\";\n\nimport { SESSION_REPLAY_IFRAME_ATTRIBUTE } from \"../../session-replay-iframe-protocol.js\";\nimport {\n createAgentNativeHostBridge,\n type AgentNativeClientAction,\n type AgentNativeClientActions,\n type AgentNativeHostAuth,\n type AgentNativeHostBridge,\n type AgentNativeHostBridgeEvent,\n type AgentNativeHostCommandHandler,\n type AgentNativeHostCommandHandlers,\n type AgentNativeHostContext,\n type AgentNativeHostContextGetter,\n type AgentNativeHostSession,\n} from \"../host-bridge.js\";\nimport {\n AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n buildAgentNativeExtensionHtml,\n createLocalStorageAgentNativeExtensionStorage,\n getAgentNativeExtensionManifest,\n isAgentNativeExtensionAllowedInSlot,\n normalizeAgentNativeExtensionSandbox,\n type AgentNativeExtensionDefinition,\n type AgentNativeExtensionStorage,\n type AgentNativeExtensionStorageContext,\n type AgentNativeExtensionStorageOptions,\n type AgentNativeExtensionStorageScope,\n} from \"./portable-extension.js\";\n\nexport type AgentNativeExtensionPermissionList =\n | readonly string[]\n | ((\n extension: AgentNativeExtensionDefinition,\n ) => readonly string[] | undefined)\n | undefined;\n\nexport type AgentNativeExtensionStorageScopeList =\n | readonly AgentNativeExtensionStorageScope[]\n | ((\n extension: AgentNativeExtensionDefinition,\n ) => readonly AgentNativeExtensionStorageScope[] | undefined)\n | undefined;\n\nexport interface AgentNativeExtensionFrameProps extends Omit<\n IframeHTMLAttributes<HTMLIFrameElement>,\n \"src\" | \"srcDoc\"\n> {\n extension: AgentNativeExtensionDefinition;\n /** Stable slot identifier, for example `customer-detail.sidebar`. */\n slotId?: string;\n /** Context pushed into `window.slotContext` and merged into host context. */\n context?: Record<string, unknown> | null;\n /** Live actions exposed to the extension through `appAction()` and `agentNative.action()`. */\n actions?: AgentNativeClientActions;\n /** Page/app context exposed through `agentNative.context()`. */\n getContext?: AgentNativeHostContextGetter;\n /** Host commands exposed through `agentNative.command()` and `agentNative.refresh()`. */\n commands?: AgentNativeHostCommandHandlers;\n /** Host-enforced action allowlist. Defaults to extension manifest requestedActions. */\n allowedActions?: AgentNativeExtensionPermissionList;\n /** Host-enforced command allowlist. Defaults to extension manifest requestedCommands. */\n allowedCommands?: AgentNativeExtensionPermissionList;\n auth?: AgentNativeHostAuth;\n session?: string | Partial<AgentNativeHostSession>;\n /** Storage adapter used by `extensionData.*`. Defaults to browser localStorage. */\n storage?: AgentNativeExtensionStorage | false;\n /** Host-enforced storage scope allowlist. Defaults to extension manifest storageScopes. */\n allowedStorageScopes?: AgentNativeExtensionStorageScopeList;\n storageNamespace?: string;\n storageContext?: Omit<\n AgentNativeExtensionStorageContext,\n \"extensionId\" | \"slotId\"\n >;\n themeCss?: string;\n isDark?: boolean;\n autoHeight?: boolean;\n initialHeight?: number;\n onBridgeEvent?: (event: AgentNativeHostBridgeEvent) => void;\n onBridgeReady?: (bridge: AgentNativeHostBridge) => void;\n onStorageError?: (\n error: Error,\n request: AgentNativeExtensionStorageRequest,\n ) => void;\n}\n\nexport interface AgentNativeExtensionSlotProps extends Omit<\n AgentNativeExtensionFrameProps,\n \"extension\" | \"className\" | \"style\" | \"children\"\n> {\n id: string;\n extensions: AgentNativeExtensionDefinition[];\n className?: string;\n extensionClassName?: string;\n extensionStyle?: CSSProperties;\n empty?: React.ReactNode;\n showEmptyAffordance?: boolean;\n}\n\ninterface AgentNativeExtensionStorageRequest {\n requestId: string;\n op: \"list\" | \"get\" | \"set\" | \"remove\";\n collection: string;\n id?: string;\n data?: unknown;\n options?: AgentNativeExtensionStorageOptions;\n}\n\nconst defaultFrameStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n width: \"100%\",\n};\n\nconst BUILT_IN_COMMAND_NAMES = [\n \"navigate\",\n \"refreshData\",\n \"refresh-data\",\n \"remountView\",\n \"remount-view\",\n \"hardReload\",\n \"hard-reload\",\n \"openResource\",\n \"open-resource\",\n \"requestApproval\",\n \"request-approval\",\n];\n\nconst COMMAND_ALIASES: Record<string, readonly string[]> = {\n refreshData: [\"refreshData\", \"refresh-data\"],\n \"refresh-data\": [\"refreshData\", \"refresh-data\"],\n remountView: [\"remountView\", \"remount-view\"],\n \"remount-view\": [\"remountView\", \"remount-view\"],\n hardReload: [\"hardReload\", \"hard-reload\"],\n \"hard-reload\": [\"hardReload\", \"hard-reload\"],\n openResource: [\"openResource\", \"open-resource\"],\n \"open-resource\": [\"openResource\", \"open-resource\"],\n requestApproval: [\"requestApproval\", \"request-approval\"],\n \"request-approval\": [\"requestApproval\", \"request-approval\"],\n};\n\nfunction setForwardedRef<T>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction safeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value ?? {});\n } catch {\n return \"{}\";\n }\n}\n\nfunction resolvePermissionList(\n value: AgentNativeExtensionPermissionList,\n extension: AgentNativeExtensionDefinition,\n fallback: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (typeof value === \"function\") return value(extension);\n if (Array.isArray(value)) return value;\n return fallback;\n}\n\nfunction resolveStorageScopeList(\n value: AgentNativeExtensionStorageScopeList,\n extension: AgentNativeExtensionDefinition,\n fallback: readonly AgentNativeExtensionStorageScope[] | undefined,\n): readonly AgentNativeExtensionStorageScope[] | undefined {\n if (typeof value === \"function\") return value(extension);\n if (Array.isArray(value)) return value;\n return fallback;\n}\n\nfunction toPermissionSet(\n value: readonly string[] | undefined,\n): Set<string> | null {\n return value ? new Set(value) : null;\n}\n\nfunction commandPermissionSet(\n value: readonly string[] | undefined,\n): Set<string> | null {\n if (!value) return null;\n const expanded = new Set<string>();\n for (const command of value) {\n expanded.add(command);\n for (const alias of COMMAND_ALIASES[command] ?? []) expanded.add(alias);\n }\n return expanded;\n}\n\nasync function resolveActions(\n actions: AgentNativeClientActions | undefined,\n): Promise<AgentNativeClientAction[]> {\n const resolved = typeof actions === \"function\" ? await actions() : actions;\n return Array.isArray(resolved) ? resolved : [];\n}\n\nfunction scopeExtensionActions(\n actions: AgentNativeClientActions | undefined,\n allowedNames: Set<string> | null,\n): AgentNativeClientActions | undefined {\n if (!actions || !allowedNames) return actions;\n return async () =>\n (await resolveActions(actions)).filter((action) =>\n allowedNames.has(action.name),\n );\n}\n\nfunction blockedCommand(command: string): AgentNativeHostCommandHandler {\n return () => {\n throw new Error(\n `Extension is not allowed to call host command \"${command}\"`,\n );\n };\n}\n\nfunction scopeExtensionCommands(\n commands: AgentNativeHostCommandHandlers | undefined,\n allowedNames: Set<string> | null,\n): AgentNativeHostCommandHandlers | undefined {\n if (!allowedNames) return commands;\n\n const scoped: AgentNativeHostCommandHandlers = {};\n for (const command of BUILT_IN_COMMAND_NAMES) {\n if (!allowedNames.has(command)) scoped[command] = blockedCommand(command);\n }\n\n for (const [command, handler] of Object.entries(commands ?? {})) {\n scoped[command] = allowedNames.has(command)\n ? handler\n : blockedCommand(command);\n }\n\n return scoped;\n}\n\nfunction normalizeStorageRequest(\n value: unknown,\n): AgentNativeExtensionStorageRequest | null {\n if (!isRecord(value)) return null;\n const requestId = typeof value.requestId === \"string\" ? value.requestId : \"\";\n const op =\n value.op === \"list\" ||\n value.op === \"get\" ||\n value.op === \"set\" ||\n value.op === \"remove\"\n ? value.op\n : null;\n const collection =\n typeof value.collection === \"string\" ? value.collection.trim() : \"\";\n const id = typeof value.id === \"string\" ? value.id : undefined;\n const options = isRecord(value.options)\n ? (value.options as AgentNativeExtensionStorageOptions)\n : undefined;\n\n if (!requestId || !op || !collection) return null;\n if ((op === \"get\" || op === \"set\" || op === \"remove\") && !id) {\n return null;\n }\n\n return {\n requestId,\n op,\n collection,\n id,\n data: value.data,\n options,\n };\n}\n\nfunction mergeExtensionContext(\n base: AgentNativeHostContext | undefined,\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n slotContext: Record<string, unknown> | null | undefined,\n): AgentNativeHostContext {\n return {\n ...(base ?? {}),\n extension: {\n id: extension.id,\n name: extension.name,\n description: extension.description,\n },\n slot: slotId\n ? {\n id: slotId,\n context: slotContext ?? {},\n }\n : undefined,\n data: {\n ...(base?.data ?? {}),\n extension: {\n id: extension.id,\n name: extension.name,\n },\n slotContext: slotContext ?? {},\n },\n };\n}\n\nexport const AgentNativeExtensionFrame = forwardRef<\n HTMLIFrameElement,\n AgentNativeExtensionFrameProps\n>(function AgentNativeExtensionFrame(\n {\n extension,\n slotId,\n context,\n actions,\n getContext,\n commands,\n allowedActions,\n allowedCommands,\n auth,\n session,\n storage,\n allowedStorageScopes,\n storageNamespace = \"default\",\n storageContext,\n themeCss,\n isDark,\n autoHeight = true,\n initialHeight = 120,\n onBridgeEvent,\n onBridgeReady,\n onStorageError,\n title,\n sandbox,\n allow = \"clipboard-read; clipboard-write\",\n referrerPolicy = \"no-referrer\",\n style,\n onLoad,\n ...iframeProps\n },\n forwardedRef,\n) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const bridgeRef = useRef<AgentNativeHostBridge | null>(null);\n const [height, setHeight] = useState(initialHeight);\n const localStorageAdapter = useMemo(\n () => createLocalStorageAgentNativeExtensionStorage(storageNamespace),\n [storageNamespace],\n );\n const storageAdapter = storage === undefined ? localStorageAdapter : storage;\n const contextJson = safeStringify(context);\n const sandboxValue = useMemo(\n () => normalizeAgentNativeExtensionSandbox(sandbox),\n [sandbox],\n );\n const sessionValue =\n session ?? `extension:${extension.id}:${slotId ?? \"standalone\"}`;\n const manifest = useMemo(\n () => getAgentNativeExtensionManifest(extension),\n [extension],\n );\n const actionAllowlist = useMemo(\n () =>\n toPermissionSet(\n resolvePermissionList(\n allowedActions,\n extension,\n manifest.requestedActions,\n ),\n ),\n [allowedActions, extension, manifest.requestedActions],\n );\n const commandAllowlist = useMemo(\n () =>\n commandPermissionSet(\n resolvePermissionList(\n allowedCommands,\n extension,\n manifest.requestedCommands,\n ),\n ),\n [allowedCommands, extension, manifest.requestedCommands],\n );\n const storageScopeAllowlist = useMemo(() => {\n const scopes = resolveStorageScopeList(\n allowedStorageScopes,\n extension,\n manifest.storageScopes,\n );\n return scopes ? new Set(scopes) : null;\n }, [allowedStorageScopes, extension, manifest.storageScopes]);\n const scopedActions = useMemo(\n () => scopeExtensionActions(actions, actionAllowlist),\n [actions, actionAllowlist],\n );\n const scopedCommands = useMemo(\n () => scopeExtensionCommands(commands, commandAllowlist),\n [commands, commandAllowlist],\n );\n\n const getMergedContext = useCallback(async () => {\n const base = getContext ? await getContext() : {};\n return mergeExtensionContext(base, extension, slotId, context);\n }, [contextJson, extension, getContext, slotId]);\n\n const srcDoc = useMemo(\n () =>\n buildAgentNativeExtensionHtml({\n extensionId: extension.id,\n title: title ?? extension.name,\n content: extension.content,\n slotId,\n slotContext: context,\n themeCss,\n isDark,\n }),\n [\n contextJson,\n extension.content,\n extension.id,\n extension.name,\n isDark,\n slotId,\n themeCss,\n title,\n ],\n );\n\n const postSlotContext = useCallback(() => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.SLOT_CONTEXT,\n extensionId: extension.id,\n slotId,\n context: context ?? {},\n },\n \"*\",\n );\n }, [contextJson, extension.id, slotId]);\n\n useEffect(() => {\n const bridge = createAgentNativeHostBridge({\n session: sessionValue,\n getContext: getMergedContext,\n commands: scopedCommands,\n actions: scopedActions,\n auth,\n onEvent: onBridgeEvent,\n targetWindow: iframeRef.current?.contentWindow ?? null,\n }).start();\n bridgeRef.current = bridge;\n onBridgeReady?.(bridge);\n return () => {\n bridge.stop();\n if (bridgeRef.current === bridge) bridgeRef.current = null;\n };\n }, [\n actions,\n auth,\n getMergedContext,\n onBridgeEvent,\n onBridgeReady,\n sessionValue,\n scopedActions,\n scopedCommands,\n ]);\n\n useEffect(() => {\n postSlotContext();\n void bridgeRef.current?.refreshContext();\n }, [postSlotContext]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const respond = (requestId: string, payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_RESPONSE,\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n const handleStorageRequest = async (\n request: AgentNativeExtensionStorageRequest,\n ) => {\n try {\n if (!storageAdapter) {\n throw new Error(\"No extension storage adapter is registered\");\n }\n const requestContext: AgentNativeExtensionStorageContext = {\n ...(storageContext ?? {}),\n extensionId: extension.id,\n slotId,\n };\n const { op, collection, id, data, options } = request;\n const requestedScope =\n typeof options?.scope === \"string\"\n ? options.scope\n : (requestContext.scope ?? \"user\");\n if (\n storageScopeAllowlist &&\n !storageScopeAllowlist.has(requestedScope)\n ) {\n throw new Error(\n `Extension is not allowed to use storage scope \"${requestedScope}\"`,\n );\n }\n const result =\n op === \"list\"\n ? await storageAdapter.list(collection, options, requestContext)\n : op === \"get\"\n ? await storageAdapter.get(\n collection,\n id as string,\n options,\n requestContext,\n )\n : op === \"set\"\n ? await storageAdapter.set(\n collection,\n id as string,\n data,\n options,\n requestContext,\n )\n : await storageAdapter.remove(\n collection,\n id as string,\n options,\n requestContext,\n );\n respond(request.requestId, { ok: true, result });\n } catch (error) {\n const err = safeError(error);\n onStorageError?.(err, request);\n respond(request.requestId, { ok: false, error: err.message });\n }\n };\n\n function onMessage(event: MessageEvent) {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!isRecord(message)) return;\n\n if (message.type === AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.RESIZE) {\n if (!autoHeight) return;\n const nextHeight = Number(message.height);\n if (Number.isFinite(nextHeight) && nextHeight > 0) {\n setHeight(Math.ceil(nextHeight));\n }\n return;\n }\n\n if (\n message.type !== AGENT_NATIVE_EXTENSION_MESSAGE_TYPES.STORAGE_REQUEST\n ) {\n return;\n }\n\n const request = normalizeStorageRequest(message);\n if (!request) {\n const requestId =\n typeof message.requestId === \"string\" ? message.requestId : \"\";\n if (requestId) {\n respond(requestId, {\n ok: false,\n error: \"Invalid extension storage request\",\n });\n }\n return;\n }\n\n void handleStorageRequest(request);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [\n autoHeight,\n extension.id,\n onStorageError,\n slotId,\n storageAdapter,\n storageContext,\n storageScopeAllowlist,\n ]);\n\n return (\n <iframe\n {...iframeProps}\n {...{ [SESSION_REPLAY_IFRAME_ATTRIBUTE]: \"\" }}\n key={`${extension.id}:${extension.updatedAt ?? \"\"}`}\n ref={(node) => {\n iframeRef.current = node;\n setForwardedRef(forwardedRef, node);\n bridgeRef.current?.setTargetWindow(node?.contentWindow ?? null);\n }}\n title={title ?? extension.name}\n srcDoc={srcDoc}\n sandbox={sandboxValue}\n allow={allow}\n referrerPolicy={referrerPolicy}\n style={{\n ...defaultFrameStyle,\n height: autoHeight ? height : \"100%\",\n ...style,\n }}\n onLoad={(event) => {\n bridgeRef.current?.setTargetWindow(\n event.currentTarget.contentWindow ?? null,\n );\n postSlotContext();\n void bridgeRef.current?.sendInit();\n onLoad?.(event);\n }}\n />\n );\n});\n\nexport function AgentNativeExtensionSlot({\n id,\n extensions,\n context,\n actions,\n getContext,\n commands,\n allowedActions,\n allowedCommands,\n auth,\n session,\n storage,\n allowedStorageScopes,\n storageNamespace,\n storageContext,\n themeCss,\n isDark,\n autoHeight,\n initialHeight,\n onBridgeEvent,\n onBridgeReady,\n onStorageError,\n className,\n extensionClassName,\n extensionStyle,\n empty = null,\n showEmptyAffordance = false,\n ...iframeProps\n}: AgentNativeExtensionSlotProps) {\n const slotExtensions = extensions.filter((extension) =>\n isAgentNativeExtensionAllowedInSlot(extension, id),\n );\n\n if (slotExtensions.length === 0) {\n if (!showEmptyAffordance) return null;\n return <div className={className}>{empty}</div>;\n }\n\n return (\n <div className={className}>\n {slotExtensions.map((extension) => (\n <AgentNativeExtensionFrame\n {...iframeProps}\n key={extension.id}\n extension={extension}\n slotId={id}\n context={context}\n actions={actions}\n getContext={getContext}\n commands={commands}\n allowedActions={allowedActions}\n allowedCommands={allowedCommands}\n auth={auth}\n session={session}\n storage={storage}\n allowedStorageScopes={allowedStorageScopes}\n storageNamespace={storageNamespace}\n storageContext={storageContext}\n themeCss={themeCss}\n isDark={isDark}\n autoHeight={autoHeight}\n initialHeight={initialHeight}\n onBridgeEvent={onBridgeEvent}\n onBridgeReady={onBridgeReady}\n onStorageError={onStorageError}\n className={extensionClassName}\n style={extensionStyle}\n />\n ))}\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedExtension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/EmbeddedExtension.tsx"],"names":[],"mappings":"AAuFA;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB;2CACuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf;iDAC6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;qEAEiE;IACjE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;4EAGwE;IACxE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,MAAM,EACN,OAAO,EACP,SAAS,EACT,aAAkB,EAClB,OAAO,EACP,aAAa,GACd,EAAE,sBAAsB,sCA6TxB"}
1
+ {"version":3,"file":"EmbeddedExtension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/EmbeddedExtension.tsx"],"names":[],"mappings":"AAwFA;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB;2CACuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf;iDAC6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;qEAEiE;IACjE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;4EAGwE;IACxE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,MAAM,EACN,OAAO,EACP,SAAS,EACT,aAAkB,EAClB,OAAO,EACP,aAAa,GACd,EAAE,sBAAsB,sCA8TxB"}
@@ -5,6 +5,7 @@ import { useEffect, useMemo, useRef, useState } from "react";
5
5
  import { useNavigate } from "react-router";
6
6
  import { extensionPath } from "../../extensions/path.js";
7
7
  import { THEME_VAR_NAMES } from "../../extensions/theme.js";
8
+ import { SESSION_REPLAY_IFRAME_ATTRIBUTE } from "../../session-replay-iframe-protocol.js";
8
9
  import { sendToAgentChat } from "../agent-chat.js";
9
10
  import { agentNativePath } from "../api-path.js";
10
11
  import { useAppearance } from "../appearance.js";
@@ -311,7 +312,7 @@ export function EmbeddedExtension({ extensionId, slotId, context, className, ini
311
312
  return null;
312
313
  return (_jsx("div", { className: className, style: { height: initialHeight }, "aria-busy": "true" }));
313
314
  }
314
- return (_jsxs("div", { className: `relative group/embedded-extension ${className ?? ""}`, children: [_jsx("iframe", { ref: iframeRef, src: iframeSrc, title: extension.name, sandbox: EXTENSION_IFRAME_SANDBOX, style: { width: "100%", border: 0, height, display: "block" }, onLoad: () => {
315
+ return (_jsxs("div", { className: `relative group/embedded-extension ${className ?? ""}`, children: [_jsx("iframe", { [SESSION_REPLAY_IFRAME_ATTRIBUTE]: "", ref: iframeRef, src: iframeSrc, title: extension.name, sandbox: EXTENSION_IFRAME_SANDBOX, style: { width: "100%", border: 0, height, display: "block" }, onLoad: () => {
315
316
  iframeRef.current?.contentWindow?.postMessage({
316
317
  type: "agent-native-slot-context",
317
318
  context: sanitizeSlotContextForPostMessage(context),
@@ -1 +1 @@
1
- {"version":3,"file":"EmbeddedExtension.js","sourceRoot":"","sources":["../../../src/client/extensions/EmbeddedExtension.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconDots,\n IconExternalLink,\n IconLayoutSidebarRightCollapse,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { THEME_VAR_NAMES } from \"../../extensions/theme.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { useAppearance } from \"../appearance.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n extensionLoadError,\n extensionLoadErrorStatus,\n shouldRetryExtensionLoad,\n} from \"./extension-load-error.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\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n canDelete?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n permissions?: BridgePolicyContext[\"permissions\"];\n };\n}\n\nconst EXTENSION_IFRAME_SANDBOX =\n normalizeAgentNativeExtensionSandbox(undefined);\n\n// Read the host app's *actual* computed theme values for the shared token set\n// (THEME_VAR_NAMES). The iframe ships with a generic baked palette\n// (getThemeVars); syncing the live values keeps embedded extensions visually\n// identical to the surrounding app even when a template overrides the default\n// palette (e.g. analytics uses a neutral-gray dark theme, not near-black).\nfunction readHostThemeVars(): 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_VAR_NAMES) {\n const value = computed.getPropertyValue(name).trim();\n if (value) vars[name] = value;\n }\n return vars;\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\n/**\n * Slot contexts (e.g. Design's `DesignExtensionSlotContext`) commonly carry\n * live callback functions alongside plain data — the host component uses\n * those callbacks itself, but `window.postMessage` uses the structured clone\n * algorithm, which throws a `DataCloneError` on any function-valued property\n * (see MDN's postMessage docs). Round-tripping through JSON drops functions\n * (and other non-cloneable values like symbols) the same way\n * `JSON.stringify` already silently omits them, producing a payload that's\n * safe to post. Exported so a test can verify functions never reach the\n * iframe instead of only reading the code.\n */\nexport function sanitizeSlotContextForPostMessage(\n context: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n try {\n return JSON.parse(JSON.stringify(context ?? {}));\n } catch {\n // Circular reference or other non-serializable shape — fail safe to an\n // empty context rather than letting postMessage throw and skip every\n // other message this handler sends in the same tick (theme update,\n // ready signal).\n return {};\n }\n}\n\nexport interface EmbeddedExtensionProps {\n extensionId: string;\n /** Slot identifier passed via the iframe URL so the extension runtime knows it's\n * embedded and enables auto-resize. */\n slotId: string;\n /** Object pushed into the extension as `window.slotContext`. Re-posted whenever\n * the host re-renders with a new context. */\n context?: Record<string, unknown> | null;\n /** Optional className applied to the iframe container. */\n className?: string;\n /** Initial iframe height before content reports a real height. */\n initialHeight?: number;\n /** Fires once when the embedded iframe first signals content readiness — its\n * first height report, or iframe load as a fallback. Hosts that gate on\n * content paint (e.g. dashboard report screenshots) use this. */\n onReady?: () => void;\n /** Fires when the extension can't be loaded for this viewer (e.g. 403/404 —\n * the extension isn't shared with them or no longer exists). Hosts can use\n * this to render an explanatory fallback instead of a blank panel. By default\n * the component renders nothing on failure (slot-style silent skip). */\n onUnavailable?: (status?: number) => void;\n}\n\n/**\n * Renders a extension inline as a small auto-sized iframe — for use inside an\n * `<ExtensionSlot>`. Different from `<ExtensionViewer>` (which is full-page with a\n * toolbar): no header, sized to content, receives a `slotContext`.\n */\nexport function EmbeddedExtension({\n extensionId,\n slotId,\n context,\n className,\n initialHeight = 80,\n onReady,\n onUnavailable,\n}: EmbeddedExtensionProps) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n // Latch the readiness signal so onReady fires at most once per iframe\n // instance. Reset when the iframe is recreated (extensionId/updatedAt change).\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const readyFiredRef = useRef(false);\n const fireReady = () => {\n if (readyFiredRef.current) return;\n readyFiredRef.current = true;\n onReadyRef.current?.();\n };\n const [height, setHeight] = useState<number>(initialHeight);\n const [isDark, setIsDark] = useState(\n () =>\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark\"),\n );\n // (audit H4) Mirror ExtensionViewer's role-aware gating; deny-by-default until\n // the iframe's render binding announcement arrives.\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: \"viewer\",\n isAuthor: false,\n });\n // (audit H4) Latch the render binding once per iframe instance. The shell\n // posts the server-resolved binding BEFORE user content runs; any later\n // agent-native-extension-binding message is attacker-controllable (it\n // originates inside the same sandboxed realm as user code) and must be\n // ignored so a viewer cannot self-escalate to owner.\n const bindingLatchedRef = useRef(false);\n\n useEffect(() => {\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 const {\n data: extension,\n isFetching,\n isLoading,\n isError,\n error,\n } = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (res.status === 404) {\n throw extensionLoadError(404, \"Extension not found\");\n }\n if (res.status === 403) {\n throw extensionLoadError(403, \"Extension access denied\");\n }\n if (!res.ok) {\n throw extensionLoadError(res.status, \"Failed to fetch extension\");\n }\n return res.json();\n },\n retry: shouldRetryExtensionLoad,\n retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 4000),\n });\n\n // Notify the host once when the extension can't be loaded for this viewer so\n // it can show a fallback instead of a blank panel.\n const onUnavailableRef = useRef(onUnavailable);\n onUnavailableRef.current = onUnavailable;\n const unavailableFiredRef = useRef(false);\n useEffect(() => {\n unavailableFiredRef.current = false;\n }, [extensionId]);\n useEffect(() => {\n if (isError && !isFetching && !unavailableFiredRef.current) {\n unavailableFiredRef.current = true;\n onUnavailableRef.current?.(extensionLoadErrorStatus(error));\n }\n }, [isError, isFetching, error]);\n\n // Initial dark state is baked into the URL on first load only; subsequent\n // theme toggles update the iframe's <html class=\"dark\"> via postMessage so\n // the user's interaction state inside the extension survives the toggle.\n const initialDarkRef = useRef(isDark);\n const iframeSrc = useMemo(() => {\n const v = encodeURIComponent(extension?.updatedAt ?? \"\");\n return agentNativePath(\n `/_agent-native/extensions/${extensionId}/render?slot=${encodeURIComponent(slotId)}&dark=${initialDarkRef.current}&v=${v}`,\n );\n }, [extensionId, slotId, extension?.updatedAt]);\n\n // Reset role + binding latch to deny-by-default whenever the iframe is\n // recreated (its key changes). The new render's first binding announcement\n // re-establishes the role.\n useEffect(() => {\n bridgeContextRef.current = { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n readyFiredRef.current = false;\n }, [extensionId, extension?.updatedAt]);\n\n const appearance = useAppearance();\n\n useEffect(() => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { type: \"agent-native-theme-update\", isDark, vars: readHostThemeVars() },\n \"*\",\n );\n }, [isDark, appearance]);\n\n // Forward slot context whenever it changes. The iframe's own load handler\n // posts the initial value once it's ready; this effect handles updates.\n const contextJson = JSON.stringify(context ?? {});\n useEffect(() => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n // Post the JSON-round-tripped context, not the raw `context` object —\n // slot contexts (e.g. Design's DesignExtensionSlotContext) carry live\n // callback functions the host uses internally, and postMessage's\n // structured clone throws a DataCloneError on any function-valued\n // property. See sanitizeSlotContextForPostMessage's docblock.\n win.postMessage(\n {\n type: \"agent-native-slot-context\",\n context: sanitizeSlotContextForPostMessage(context),\n },\n \"*\",\n );\n }, [contextJson]);\n\n // Bridge extension requests + height reports.\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 // Only the FIRST announcement (sent by the shell before user content\n // runs) is trusted. Ignore re-announcements — a malicious extension\n // body could otherwise postMessage a forged owner binding to escalate.\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = (message as any).binding ?? {};\n const role: ExtensionBridgeRole =\n binding.role === \"owner\" ||\n binding.role === \"admin\" ||\n binding.role === \"editor\" ||\n binding.role === \"viewer\"\n ? binding.role\n : \"viewer\";\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.height);\n if (Number.isFinite(h) && h > 0) {\n setHeight(Math.ceil(h));\n // First laid-out height means the content has painted.\n fireReady();\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-extension-request\") return;\n\n const requestId = String(message.requestId ?? \"\");\n const path = String(message.path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n { type: \"agent-native-extension-response\", requestId, ...payload },\n \"*\",\n );\n };\n\n if (!requestId || !isAllowedExtensionPath(path, extensionId)) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(message.options);\n // (audit H4) Role-aware gating: viewer-shared extensions can read but not\n // write. The bridge policy is decided here in the parent before the\n // request leaves; the server enforces a second layer.\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId,\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 // (audit H5) Same extension-bridge tagging as <ExtensionViewer>. action-routes\n // uses these headers to enforce per-action `toolCallable` opt-in.\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\", extensionId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", extensionId);\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 }, [extensionId]);\n\n if (!extension) {\n if (!isLoading && !isFetching) 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 group/embedded-extension ${className ?? \"\"}`}>\n <iframe\n ref={iframeRef}\n key={`${extensionId}-${extension.updatedAt ?? \"\"}`}\n src={iframeSrc}\n title={extension.name}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n style={{ width: \"100%\", border: 0, height, display: \"block\" }}\n onLoad={() => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-slot-context\",\n context: sanitizeSlotContextForPostMessage(context),\n },\n \"*\",\n );\n // Re-assert theme once the iframe document is live. The src bakes in\n // the initial dark state, but this covers the race where isDark\n // settled before the iframe's message listener existed.\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark,\n vars: readHostThemeVars(),\n },\n \"*\",\n );\n // Fallback readiness signal in case the extension never reports a\n // height (e.g. fixed-height content that skips auto-resize).\n fireReady();\n }}\n />\n <EmbeddedToolMenu\n extensionId={extensionId}\n slotId={slotId}\n toolName={extension.name}\n canDelete={extension.canDelete}\n />\n </div>\n );\n}\n\nfunction EmbeddedToolMenu({\n extensionId,\n slotId,\n toolName,\n canDelete,\n}: {\n extensionId: string;\n slotId: string;\n toolName: string;\n canDelete?: boolean;\n}) {\n const t = useT();\n const [open, setOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const queryClient = useQueryClient();\n const navigate = useNavigate();\n\n const closeMenu = () => {\n setOpen(false);\n setConfirmingDelete(false);\n };\n\n const removeFromSlot = async () => {\n closeMenu();\n queryClient.setQueryData<any[]>([\"slot-installs\", slotId], (old) =>\n (old ?? []).filter((i) => i.extensionId !== extensionId),\n );\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const deleteExtension = async () => {\n closeMenu();\n try {\n await deleteOrHideExtension({ id: extensionId, canDelete });\n invalidateExtensionRemoval(queryClient, extensionId);\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n }\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute top-1 right-1 flex h-6 w-6 items-center justify-center rounded-md bg-background/60 text-muted-foreground/60 opacity-0 hover:bg-accent hover:text-foreground hover:opacity-100 group-hover/embedded-extension:opacity-100 cursor-pointer transition-opacity\"\n aria-label={t(\"extensions.optionsFor\", { name: toolName })}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>\n {t(\"extensions.optionsFor\", { name: toolName })}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-56 p-1\">\n {!confirmingDelete ? (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n onClick={() => {\n closeMenu();\n navigate(extensionPath(extensionId, toolName));\n }}\n className=\"flex items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] hover:bg-accent cursor-pointer text-left\"\n >\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.openFullView\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={removeFromSlot}\n className=\"flex items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] hover:bg-accent cursor-pointer text-left\"\n >\n <IconLayoutSidebarRightCollapse className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.removeFromWidgetArea\")}</span>\n </button>\n {canDelete !== false && (\n <>\n <div className=\"my-1 h-px bg-border/40\" />\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.deleteExtensionEllipsis\")}</span>\n </button>\n </>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 p-2\">\n <p className=\"text-[12px]\">\n {t(\"extensions.deleteQuestion\", { name: toolName })}{\" \"}\n {t(\"extensions.deleteEverywhereConfirmation\")}\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={deleteExtension}\n className=\"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\"\n >\n {t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
1
+ {"version":3,"file":"EmbeddedExtension.js","sourceRoot":"","sources":["../../../src/client/extensions/EmbeddedExtension.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconDots,\n IconExternalLink,\n IconLayoutSidebarRightCollapse,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { THEME_VAR_NAMES } 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 { useAppearance } from \"../appearance.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n extensionLoadError,\n extensionLoadErrorStatus,\n shouldRetryExtensionLoad,\n} from \"./extension-load-error.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\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n canDelete?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n permissions?: BridgePolicyContext[\"permissions\"];\n };\n}\n\nconst EXTENSION_IFRAME_SANDBOX =\n normalizeAgentNativeExtensionSandbox(undefined);\n\n// Read the host app's *actual* computed theme values for the shared token set\n// (THEME_VAR_NAMES). The iframe ships with a generic baked palette\n// (getThemeVars); syncing the live values keeps embedded extensions visually\n// identical to the surrounding app even when a template overrides the default\n// palette (e.g. analytics uses a neutral-gray dark theme, not near-black).\nfunction readHostThemeVars(): 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_VAR_NAMES) {\n const value = computed.getPropertyValue(name).trim();\n if (value) vars[name] = value;\n }\n return vars;\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\n/**\n * Slot contexts (e.g. Design's `DesignExtensionSlotContext`) commonly carry\n * live callback functions alongside plain data — the host component uses\n * those callbacks itself, but `window.postMessage` uses the structured clone\n * algorithm, which throws a `DataCloneError` on any function-valued property\n * (see MDN's postMessage docs). Round-tripping through JSON drops functions\n * (and other non-cloneable values like symbols) the same way\n * `JSON.stringify` already silently omits them, producing a payload that's\n * safe to post. Exported so a test can verify functions never reach the\n * iframe instead of only reading the code.\n */\nexport function sanitizeSlotContextForPostMessage(\n context: Record<string, unknown> | null | undefined,\n): Record<string, unknown> {\n try {\n return JSON.parse(JSON.stringify(context ?? {}));\n } catch {\n // Circular reference or other non-serializable shape — fail safe to an\n // empty context rather than letting postMessage throw and skip every\n // other message this handler sends in the same tick (theme update,\n // ready signal).\n return {};\n }\n}\n\nexport interface EmbeddedExtensionProps {\n extensionId: string;\n /** Slot identifier passed via the iframe URL so the extension runtime knows it's\n * embedded and enables auto-resize. */\n slotId: string;\n /** Object pushed into the extension as `window.slotContext`. Re-posted whenever\n * the host re-renders with a new context. */\n context?: Record<string, unknown> | null;\n /** Optional className applied to the iframe container. */\n className?: string;\n /** Initial iframe height before content reports a real height. */\n initialHeight?: number;\n /** Fires once when the embedded iframe first signals content readiness — its\n * first height report, or iframe load as a fallback. Hosts that gate on\n * content paint (e.g. dashboard report screenshots) use this. */\n onReady?: () => void;\n /** Fires when the extension can't be loaded for this viewer (e.g. 403/404 —\n * the extension isn't shared with them or no longer exists). Hosts can use\n * this to render an explanatory fallback instead of a blank panel. By default\n * the component renders nothing on failure (slot-style silent skip). */\n onUnavailable?: (status?: number) => void;\n}\n\n/**\n * Renders a extension inline as a small auto-sized iframe — for use inside an\n * `<ExtensionSlot>`. Different from `<ExtensionViewer>` (which is full-page with a\n * toolbar): no header, sized to content, receives a `slotContext`.\n */\nexport function EmbeddedExtension({\n extensionId,\n slotId,\n context,\n className,\n initialHeight = 80,\n onReady,\n onUnavailable,\n}: EmbeddedExtensionProps) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n // Latch the readiness signal so onReady fires at most once per iframe\n // instance. Reset when the iframe is recreated (extensionId/updatedAt change).\n const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n const readyFiredRef = useRef(false);\n const fireReady = () => {\n if (readyFiredRef.current) return;\n readyFiredRef.current = true;\n onReadyRef.current?.();\n };\n const [height, setHeight] = useState<number>(initialHeight);\n const [isDark, setIsDark] = useState(\n () =>\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark\"),\n );\n // (audit H4) Mirror ExtensionViewer's role-aware gating; deny-by-default until\n // the iframe's render binding announcement arrives.\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: \"viewer\",\n isAuthor: false,\n });\n // (audit H4) Latch the render binding once per iframe instance. The shell\n // posts the server-resolved binding BEFORE user content runs; any later\n // agent-native-extension-binding message is attacker-controllable (it\n // originates inside the same sandboxed realm as user code) and must be\n // ignored so a viewer cannot self-escalate to owner.\n const bindingLatchedRef = useRef(false);\n\n useEffect(() => {\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 const {\n data: extension,\n isFetching,\n isLoading,\n isError,\n error,\n } = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (res.status === 404) {\n throw extensionLoadError(404, \"Extension not found\");\n }\n if (res.status === 403) {\n throw extensionLoadError(403, \"Extension access denied\");\n }\n if (!res.ok) {\n throw extensionLoadError(res.status, \"Failed to fetch extension\");\n }\n return res.json();\n },\n retry: shouldRetryExtensionLoad,\n retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 4000),\n });\n\n // Notify the host once when the extension can't be loaded for this viewer so\n // it can show a fallback instead of a blank panel.\n const onUnavailableRef = useRef(onUnavailable);\n onUnavailableRef.current = onUnavailable;\n const unavailableFiredRef = useRef(false);\n useEffect(() => {\n unavailableFiredRef.current = false;\n }, [extensionId]);\n useEffect(() => {\n if (isError && !isFetching && !unavailableFiredRef.current) {\n unavailableFiredRef.current = true;\n onUnavailableRef.current?.(extensionLoadErrorStatus(error));\n }\n }, [isError, isFetching, error]);\n\n // Initial dark state is baked into the URL on first load only; subsequent\n // theme toggles update the iframe's <html class=\"dark\"> via postMessage so\n // the user's interaction state inside the extension survives the toggle.\n const initialDarkRef = useRef(isDark);\n const iframeSrc = useMemo(() => {\n const v = encodeURIComponent(extension?.updatedAt ?? \"\");\n return agentNativePath(\n `/_agent-native/extensions/${extensionId}/render?slot=${encodeURIComponent(slotId)}&dark=${initialDarkRef.current}&v=${v}`,\n );\n }, [extensionId, slotId, extension?.updatedAt]);\n\n // Reset role + binding latch to deny-by-default whenever the iframe is\n // recreated (its key changes). The new render's first binding announcement\n // re-establishes the role.\n useEffect(() => {\n bridgeContextRef.current = { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n readyFiredRef.current = false;\n }, [extensionId, extension?.updatedAt]);\n\n const appearance = useAppearance();\n\n useEffect(() => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { type: \"agent-native-theme-update\", isDark, vars: readHostThemeVars() },\n \"*\",\n );\n }, [isDark, appearance]);\n\n // Forward slot context whenever it changes. The iframe's own load handler\n // posts the initial value once it's ready; this effect handles updates.\n const contextJson = JSON.stringify(context ?? {});\n useEffect(() => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n // Post the JSON-round-tripped context, not the raw `context` object —\n // slot contexts (e.g. Design's DesignExtensionSlotContext) carry live\n // callback functions the host uses internally, and postMessage's\n // structured clone throws a DataCloneError on any function-valued\n // property. See sanitizeSlotContextForPostMessage's docblock.\n win.postMessage(\n {\n type: \"agent-native-slot-context\",\n context: sanitizeSlotContextForPostMessage(context),\n },\n \"*\",\n );\n }, [contextJson]);\n\n // Bridge extension requests + height reports.\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 // Only the FIRST announcement (sent by the shell before user content\n // runs) is trusted. Ignore re-announcements — a malicious extension\n // body could otherwise postMessage a forged owner binding to escalate.\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = (message as any).binding ?? {};\n const role: ExtensionBridgeRole =\n binding.role === \"owner\" ||\n binding.role === \"admin\" ||\n binding.role === \"editor\" ||\n binding.role === \"viewer\"\n ? binding.role\n : \"viewer\";\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.height);\n if (Number.isFinite(h) && h > 0) {\n setHeight(Math.ceil(h));\n // First laid-out height means the content has painted.\n fireReady();\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-extension-request\") return;\n\n const requestId = String(message.requestId ?? \"\");\n const path = String(message.path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n { type: \"agent-native-extension-response\", requestId, ...payload },\n \"*\",\n );\n };\n\n if (!requestId || !isAllowedExtensionPath(path, extensionId)) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(message.options);\n // (audit H4) Role-aware gating: viewer-shared extensions can read but not\n // write. The bridge policy is decided here in the parent before the\n // request leaves; the server enforces a second layer.\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId,\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 // (audit H5) Same extension-bridge tagging as <ExtensionViewer>. action-routes\n // uses these headers to enforce per-action `toolCallable` opt-in.\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\", extensionId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", extensionId);\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 }, [extensionId]);\n\n if (!extension) {\n if (!isLoading && !isFetching) 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 group/embedded-extension ${className ?? \"\"}`}>\n <iframe\n {...{ [SESSION_REPLAY_IFRAME_ATTRIBUTE]: \"\" }}\n ref={iframeRef}\n key={`${extensionId}-${extension.updatedAt ?? \"\"}`}\n src={iframeSrc}\n title={extension.name}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n style={{ width: \"100%\", border: 0, height, display: \"block\" }}\n onLoad={() => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-slot-context\",\n context: sanitizeSlotContextForPostMessage(context),\n },\n \"*\",\n );\n // Re-assert theme once the iframe document is live. The src bakes in\n // the initial dark state, but this covers the race where isDark\n // settled before the iframe's message listener existed.\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark,\n vars: readHostThemeVars(),\n },\n \"*\",\n );\n // Fallback readiness signal in case the extension never reports a\n // height (e.g. fixed-height content that skips auto-resize).\n fireReady();\n }}\n />\n <EmbeddedToolMenu\n extensionId={extensionId}\n slotId={slotId}\n toolName={extension.name}\n canDelete={extension.canDelete}\n />\n </div>\n );\n}\n\nfunction EmbeddedToolMenu({\n extensionId,\n slotId,\n toolName,\n canDelete,\n}: {\n extensionId: string;\n slotId: string;\n toolName: string;\n canDelete?: boolean;\n}) {\n const t = useT();\n const [open, setOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const queryClient = useQueryClient();\n const navigate = useNavigate();\n\n const closeMenu = () => {\n setOpen(false);\n setConfirmingDelete(false);\n };\n\n const removeFromSlot = async () => {\n closeMenu();\n queryClient.setQueryData<any[]>([\"slot-installs\", slotId], (old) =>\n (old ?? []).filter((i) => i.extensionId !== extensionId),\n );\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const deleteExtension = async () => {\n closeMenu();\n try {\n await deleteOrHideExtension({ id: extensionId, canDelete });\n invalidateExtensionRemoval(queryClient, extensionId);\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n }\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute top-1 right-1 flex h-6 w-6 items-center justify-center rounded-md bg-background/60 text-muted-foreground/60 opacity-0 hover:bg-accent hover:text-foreground hover:opacity-100 group-hover/embedded-extension:opacity-100 cursor-pointer transition-opacity\"\n aria-label={t(\"extensions.optionsFor\", { name: toolName })}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>\n {t(\"extensions.optionsFor\", { name: toolName })}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-56 p-1\">\n {!confirmingDelete ? (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n onClick={() => {\n closeMenu();\n navigate(extensionPath(extensionId, toolName));\n }}\n className=\"flex items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] hover:bg-accent cursor-pointer text-left\"\n >\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.openFullView\")}</span>\n </button>\n <button\n type=\"button\"\n onClick={removeFromSlot}\n className=\"flex items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] hover:bg-accent cursor-pointer text-left\"\n >\n <IconLayoutSidebarRightCollapse className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.removeFromWidgetArea\")}</span>\n </button>\n {canDelete !== false && (\n <>\n <div className=\"my-1 h-px bg-border/40\" />\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.deleteExtensionEllipsis\")}</span>\n </button>\n </>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 p-2\">\n <p className=\"text-[12px]\">\n {t(\"extensions.deleteQuestion\", { name: toolName })}{\" \"}\n {t(\"extensions.deleteEverywhereConfirmation\")}\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={deleteExtension}\n className=\"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\"\n >\n {t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionEditor.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionEditor.tsx"],"names":[],"mappings":"AA8CA,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BAwYpE"}
1
+ {"version":3,"file":"ExtensionEditor.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionEditor.tsx"],"names":[],"mappings":"AAgDA,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BA6YpE"}
@@ -1,9 +1,11 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { IconArrowLeft, IconDeviceFloppy, IconDots, IconTrash, IconX, } from "@tabler/icons-react";
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
- import { useState, useEffect } from "react";
4
+ import { useEffect, useMemo, useState } from "react";
5
5
  import { Link, useNavigate } from "react-router";
6
6
  import { extensionPath } from "../../extensions/path.js";
7
+ import { injectSessionReplayIframeBootstrap } from "../../extensions/session-replay-iframe.js";
8
+ import { SESSION_REPLAY_IFRAME_ATTRIBUTE } from "../../session-replay-iframe-protocol.js";
7
9
  import { agentNativePath } from "../api-path.js";
8
10
  import { Popover, PopoverContent, PopoverTrigger, } from "../components/ui/popover.js";
9
11
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "../components/ui/tooltip.js";
@@ -23,6 +25,7 @@ export function ExtensionEditor({ extensionId }) {
23
25
  const [deleting, setDeleting] = useState(false);
24
26
  const [menuOpen, setMenuOpen] = useState(false);
25
27
  const [confirmingDelete, setConfirmingDelete] = useState(false);
28
+ const previewHtml = useMemo(() => injectSessionReplayIframeBootstrap(content), [content]);
26
29
  const slotsQuery = useQuery({
27
30
  queryKey: ["extension-slots", extensionId],
28
31
  queryFn: async () => {
@@ -161,6 +164,6 @@ export function ExtensionEditor({ extensionId }) {
161
164
  : t("extensions.deleting")
162
165
  : existingTool?.canDelete === false
163
166
  ? t("extensions.remove")
164
- : t("extensions.delete") })] })] })) })] }))] })] }), _jsxs("div", { className: "flex flex-1 overflow-hidden", children: [_jsxs("div", { className: "flex w-1/2 flex-col gap-4 overflow-auto border-r p-4", children: [_jsxs("div", { children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-foreground", children: t("extensions.nameLabel") }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: t("extensions.namePlaceholder"), className: "h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" })] }), _jsxs("div", { children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-foreground", children: t("extensions.descriptionLabel") }), _jsx("textarea", { value: description, onChange: (e) => setDescription(e.target.value), placeholder: t("extensions.descriptionPlaceholder"), rows: 2, className: "w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" })] }), _jsxs("div", { className: "flex flex-1 flex-col", children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-foreground", children: t("extensions.contentLabel") }), _jsx("textarea", { value: content, onChange: (e) => setContent(e.target.value), placeholder: t("extensions.contentPlaceholder"), className: "flex-1 resize-none rounded-md border border-input bg-background p-3 font-mono text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background", spellCheck: false })] })] }), _jsx("div", { className: "w-1/2", children: content ? (_jsx("iframe", { srcDoc: content, className: "h-full w-full border-0", sandbox: "allow-scripts allow-forms", title: t("extensions.previewTitle") })) : (_jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: t("extensions.previewEmpty") })) })] })] }) }));
167
+ : t("extensions.delete") })] })] })) })] }))] })] }), _jsxs("div", { className: "flex flex-1 overflow-hidden", children: [_jsxs("div", { className: "flex w-1/2 flex-col gap-4 overflow-auto border-r p-4", children: [_jsxs("div", { children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-foreground", children: t("extensions.nameLabel") }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: t("extensions.namePlaceholder"), className: "h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" })] }), _jsxs("div", { children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-foreground", children: t("extensions.descriptionLabel") }), _jsx("textarea", { value: description, onChange: (e) => setDescription(e.target.value), placeholder: t("extensions.descriptionPlaceholder"), rows: 2, className: "w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" })] }), _jsxs("div", { className: "flex flex-1 flex-col", children: [_jsx("label", { className: "mb-1.5 block text-sm font-medium text-foreground", children: t("extensions.contentLabel") }), _jsx("textarea", { value: content, onChange: (e) => setContent(e.target.value), placeholder: t("extensions.contentPlaceholder"), className: "flex-1 resize-none rounded-md border border-input bg-background p-3 font-mono text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background", spellCheck: false })] })] }), _jsx("div", { className: "w-1/2", children: content ? (_jsx("iframe", { [SESSION_REPLAY_IFRAME_ATTRIBUTE]: "", srcDoc: previewHtml, className: "h-full w-full border-0", sandbox: "allow-scripts allow-forms", title: t("extensions.previewTitle") })) : (_jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: t("extensions.previewEmpty") })) })] })] }) }));
165
168
  }
166
169
  //# sourceMappingURL=ExtensionEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionEditor.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconArrowLeft,\n IconDeviceFloppy,\n IconDots,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { cn } from \"../utils.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport { ExtensionQueryErrorState } from \"./ExtensionQueryErrorState.js\";\n\ninterface SlotDeclaration {\n id: string;\n extensionId: string;\n slotId: string;\n}\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n canDelete?: boolean;\n}\n\nexport interface ExtensionEditorProps {\n extensionId?: string;\n}\n\nexport function ExtensionEditor({ extensionId }: ExtensionEditorProps) {\n const t = useT();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const isEdit = !!extensionId;\n\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n\n const slotsQuery = useQuery<SlotDeclaration[]>({\n queryKey: [\"extension-slots\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/slots/extension/${extensionId}`),\n );\n if (!res.ok) {\n throw new Error(`Failed to load extension slots (${res.status})`);\n }\n return res.json();\n },\n enabled: isEdit && menuOpen,\n });\n const slots = slotsQuery.data ?? [];\n\n const existingToolQuery = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension\");\n return res.json();\n },\n enabled: isEdit,\n });\n const existingTool = existingToolQuery.data;\n\n useEffect(() => {\n if (existingTool) {\n setName(existingTool.name ?? \"\");\n setDescription(existingTool.description ?? \"\");\n setContent(existingTool.content ?? \"\");\n }\n }, [existingTool]);\n\n const handleSave = async () => {\n if (!name.trim()) return;\n setSaving(true);\n try {\n const body = JSON.stringify({\n name: name.trim(),\n description: description.trim() || undefined,\n content,\n });\n\n if (isEdit) {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n },\n );\n if (!res.ok) throw new Error(\"Update failed\");\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n navigate(extensionPath(extensionId, name.trim()));\n } else {\n const res = await fetch(agentNativePath(\"/_agent-native/extensions\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n if (!res.ok) throw new Error(\"Create failed\");\n const created = await res.json();\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n navigate(extensionPath(created.id, created.name ?? name.trim()));\n }\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async () => {\n if (!extensionId) return;\n setDeleting(true);\n const prev = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n try {\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((t) => t.id !== extensionId),\n );\n\n await deleteOrHideExtension({\n id: extensionId,\n canDelete: existingTool?.canDelete,\n });\n invalidateExtensionRemoval(queryClient, extensionId);\n slots.forEach((s) =>\n queryClient.invalidateQueries({\n queryKey: [\"slot-installs\", s.slotId],\n }),\n );\n navigate(\"/extensions\");\n } catch {\n if (prev) queryClient.setQueryData([\"extensions\"], prev);\n } finally {\n setDeleting(false);\n setConfirmingDelete(false);\n setMenuOpen(false);\n }\n };\n\n const handleRemoveFromSlot = async (slotId: string) => {\n if (!extensionId) return;\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n if (isEdit && existingToolQuery.isLoading) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"h-12 shrink-0 border-b\" />\n <div className=\"flex-1 bg-muted/20 animate-pulse\" />\n </div>\n );\n }\n\n if (isEdit && existingToolQuery.isError) {\n return (\n <ExtensionQueryErrorState\n className=\"h-full min-h-[20rem]\"\n message={t(\"extensions.loadError\")}\n onRetry={() => void existingToolQuery.refetch()}\n retrying={existingToolQuery.isFetching}\n />\n );\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex h-full flex-col\">\n <header className=\"flex items-center justify-between border-b px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <Link\n to={\n extensionId\n ? extensionPath(extensionId, existingTool?.name ?? name)\n : \"/extensions\"\n }\n className=\"inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n aria-label={t(\"extensions.back\")}\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n </Link>\n <h1 className=\"text-sm font-semibold\">\n {isEdit\n ? t(\"extensions.editExtension\")\n : t(\"extensions.newExtension\")}\n </h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving || !name.trim()}\n className={cn(\n \"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm text-primary-foreground hover:bg-primary/90\",\n (saving || !name.trim()) && \"opacity-60\",\n )}\n >\n <IconDeviceFloppy className=\"h-3.5 w-3.5\" />\n {saving\n ? t(\"extensions.saving\")\n : isEdit\n ? t(\"extensions.save\")\n : t(\"extensions.create\")}\n </button>\n {isEdit && (\n <Popover\n open={menuOpen}\n onOpenChange={(o) => {\n setMenuOpen(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n aria-label={t(\"extensions.moreOptions\")}\n >\n <IconDots className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>{t(\"extensions.moreOptions\")}</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-72 p-0\">\n {!confirmingDelete ? (\n <>\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">\n {t(\"extensions.appearsIn\")}\n </p>\n {slotsQuery.isError ? (\n <ExtensionQueryErrorState\n compact\n className=\"px-0\"\n message={t(\"extensions.widgetAreasLoadError\")}\n onRetry={() => void slotsQuery.refetch()}\n retrying={slotsQuery.isFetching}\n />\n ) : slots.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n {t(\"extensions.noWidgetAreas\")}\n </p>\n ) : (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n {t(\"extensions.widgetAreaCount\", {\n count: slots.length,\n })}\n </p>\n )}\n </div>\n {slots.length > 0 && (\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {slots.map((s) => (\n <div\n key={s.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-[12px]\"\n >\n <span className=\"flex-1 truncate font-mono text-[11px] text-muted-foreground\">\n {s.slotId}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() =>\n handleRemoveFromSlot(s.slotId)\n }\n className=\"rounded p-1 text-muted-foreground/60 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label={t(\n \"extensions.removeFromWidgetArea\",\n )}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {t(\"extensions.removeFromWidgetAreaForMe\")}\n </TooltipContent>\n </Tooltip>\n </div>\n ))}\n </div>\n )}\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>\n {existingTool?.canDelete === false\n ? t(\"extensions.removeFromMyListEllipsis\")\n : t(\"extensions.deleteExtensionEllipsis\")}\n </span>\n </button>\n </div>\n </>\n ) : (\n <div className=\"flex flex-col gap-2 p-3\">\n <p className=\"text-[12px]\">\n {existingTool?.canDelete === false\n ? t(\"extensions.removeQuestion\", { name })\n : t(\"extensions.deleteQuestion\", { name })}{\" \"}\n {existingTool?.canDelete === false\n ? t(\"extensions.hideForYouDescription\")\n : t(\"extensions.deleteEverywhereConfirmation\")}\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={deleting}\n className={cn(\n \"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\",\n deleting && \"opacity-60\",\n )}\n >\n {deleting\n ? existingTool?.canDelete === false\n ? t(\"extensions.removing\")\n : t(\"extensions.deleting\")\n : existingTool?.canDelete === false\n ? t(\"extensions.remove\")\n : t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n </header>\n\n <div className=\"flex flex-1 overflow-hidden\">\n <div className=\"flex w-1/2 flex-col gap-4 overflow-auto border-r p-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n {t(\"extensions.nameLabel\")}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t(\"extensions.namePlaceholder\")}\n className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n {t(\"extensions.descriptionLabel\")}\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t(\"extensions.descriptionPlaceholder\")}\n rows={2}\n className=\"w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n </div>\n\n <div className=\"flex flex-1 flex-col\">\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n {t(\"extensions.contentLabel\")}\n </label>\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={t(\"extensions.contentPlaceholder\")}\n className=\"flex-1 resize-none rounded-md border border-input bg-background p-3 font-mono text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n spellCheck={false}\n />\n </div>\n </div>\n\n <div className=\"w-1/2\">\n {content ? (\n <iframe\n srcDoc={content}\n className=\"h-full w-full border-0\"\n sandbox=\"allow-scripts allow-forms\"\n title={t(\"extensions.previewTitle\")}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {t(\"extensions.previewEmpty\")}\n </div>\n )}\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n}\n"]}
1
+ {"version":3,"file":"ExtensionEditor.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconArrowLeft,\n IconDeviceFloppy,\n IconDots,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\n\nimport { extensionPath } from \"../../extensions/path.js\";\nimport { injectSessionReplayIframeBootstrap } from \"../../extensions/session-replay-iframe.js\";\nimport { SESSION_REPLAY_IFRAME_ATTRIBUTE } from \"../../session-replay-iframe-protocol.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { cn } from \"../utils.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport { ExtensionQueryErrorState } from \"./ExtensionQueryErrorState.js\";\n\ninterface SlotDeclaration {\n id: string;\n extensionId: string;\n slotId: string;\n}\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n canDelete?: boolean;\n}\n\nexport interface ExtensionEditorProps {\n extensionId?: string;\n}\n\nexport function ExtensionEditor({ extensionId }: ExtensionEditorProps) {\n const t = useT();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const isEdit = !!extensionId;\n\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const previewHtml = useMemo(\n () => injectSessionReplayIframeBootstrap(content),\n [content],\n );\n\n const slotsQuery = useQuery<SlotDeclaration[]>({\n queryKey: [\"extension-slots\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/slots/extension/${extensionId}`),\n );\n if (!res.ok) {\n throw new Error(`Failed to load extension slots (${res.status})`);\n }\n return res.json();\n },\n enabled: isEdit && menuOpen,\n });\n const slots = slotsQuery.data ?? [];\n\n const existingToolQuery = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension\");\n return res.json();\n },\n enabled: isEdit,\n });\n const existingTool = existingToolQuery.data;\n\n useEffect(() => {\n if (existingTool) {\n setName(existingTool.name ?? \"\");\n setDescription(existingTool.description ?? \"\");\n setContent(existingTool.content ?? \"\");\n }\n }, [existingTool]);\n\n const handleSave = async () => {\n if (!name.trim()) return;\n setSaving(true);\n try {\n const body = JSON.stringify({\n name: name.trim(),\n description: description.trim() || undefined,\n content,\n });\n\n if (isEdit) {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n },\n );\n if (!res.ok) throw new Error(\"Update failed\");\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n navigate(extensionPath(extensionId, name.trim()));\n } else {\n const res = await fetch(agentNativePath(\"/_agent-native/extensions\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n if (!res.ok) throw new Error(\"Create failed\");\n const created = await res.json();\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n navigate(extensionPath(created.id, created.name ?? name.trim()));\n }\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async () => {\n if (!extensionId) return;\n setDeleting(true);\n const prev = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n try {\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((t) => t.id !== extensionId),\n );\n\n await deleteOrHideExtension({\n id: extensionId,\n canDelete: existingTool?.canDelete,\n });\n invalidateExtensionRemoval(queryClient, extensionId);\n slots.forEach((s) =>\n queryClient.invalidateQueries({\n queryKey: [\"slot-installs\", s.slotId],\n }),\n );\n navigate(\"/extensions\");\n } catch {\n if (prev) queryClient.setQueryData([\"extensions\"], prev);\n } finally {\n setDeleting(false);\n setConfirmingDelete(false);\n setMenuOpen(false);\n }\n };\n\n const handleRemoveFromSlot = async (slotId: string) => {\n if (!extensionId) return;\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n if (isEdit && existingToolQuery.isLoading) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"h-12 shrink-0 border-b\" />\n <div className=\"flex-1 bg-muted/20 animate-pulse\" />\n </div>\n );\n }\n\n if (isEdit && existingToolQuery.isError) {\n return (\n <ExtensionQueryErrorState\n className=\"h-full min-h-[20rem]\"\n message={t(\"extensions.loadError\")}\n onRetry={() => void existingToolQuery.refetch()}\n retrying={existingToolQuery.isFetching}\n />\n );\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex h-full flex-col\">\n <header className=\"flex items-center justify-between border-b px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <Link\n to={\n extensionId\n ? extensionPath(extensionId, existingTool?.name ?? name)\n : \"/extensions\"\n }\n className=\"inline-flex cursor-pointer items-center justify-center rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n aria-label={t(\"extensions.back\")}\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n </Link>\n <h1 className=\"text-sm font-semibold\">\n {isEdit\n ? t(\"extensions.editExtension\")\n : t(\"extensions.newExtension\")}\n </h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving || !name.trim()}\n className={cn(\n \"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm text-primary-foreground hover:bg-primary/90\",\n (saving || !name.trim()) && \"opacity-60\",\n )}\n >\n <IconDeviceFloppy className=\"h-3.5 w-3.5\" />\n {saving\n ? t(\"extensions.saving\")\n : isEdit\n ? t(\"extensions.save\")\n : t(\"extensions.create\")}\n </button>\n {isEdit && (\n <Popover\n open={menuOpen}\n onOpenChange={(o) => {\n setMenuOpen(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n aria-label={t(\"extensions.moreOptions\")}\n >\n <IconDots className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>{t(\"extensions.moreOptions\")}</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-72 p-0\">\n {!confirmingDelete ? (\n <>\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">\n {t(\"extensions.appearsIn\")}\n </p>\n {slotsQuery.isError ? (\n <ExtensionQueryErrorState\n compact\n className=\"px-0\"\n message={t(\"extensions.widgetAreasLoadError\")}\n onRetry={() => void slotsQuery.refetch()}\n retrying={slotsQuery.isFetching}\n />\n ) : slots.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n {t(\"extensions.noWidgetAreas\")}\n </p>\n ) : (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n {t(\"extensions.widgetAreaCount\", {\n count: slots.length,\n })}\n </p>\n )}\n </div>\n {slots.length > 0 && (\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {slots.map((s) => (\n <div\n key={s.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-[12px]\"\n >\n <span className=\"flex-1 truncate font-mono text-[11px] text-muted-foreground\">\n {s.slotId}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() =>\n handleRemoveFromSlot(s.slotId)\n }\n className=\"rounded p-1 text-muted-foreground/60 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label={t(\n \"extensions.removeFromWidgetArea\",\n )}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {t(\"extensions.removeFromWidgetAreaForMe\")}\n </TooltipContent>\n </Tooltip>\n </div>\n ))}\n </div>\n )}\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>\n {existingTool?.canDelete === false\n ? t(\"extensions.removeFromMyListEllipsis\")\n : t(\"extensions.deleteExtensionEllipsis\")}\n </span>\n </button>\n </div>\n </>\n ) : (\n <div className=\"flex flex-col gap-2 p-3\">\n <p className=\"text-[12px]\">\n {existingTool?.canDelete === false\n ? t(\"extensions.removeQuestion\", { name })\n : t(\"extensions.deleteQuestion\", { name })}{\" \"}\n {existingTool?.canDelete === false\n ? t(\"extensions.hideForYouDescription\")\n : t(\"extensions.deleteEverywhereConfirmation\")}\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n {t(\"extensions.cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={deleting}\n className={cn(\n \"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\",\n deleting && \"opacity-60\",\n )}\n >\n {deleting\n ? existingTool?.canDelete === false\n ? t(\"extensions.removing\")\n : t(\"extensions.deleting\")\n : existingTool?.canDelete === false\n ? t(\"extensions.remove\")\n : t(\"extensions.delete\")}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n )}\n </div>\n </header>\n\n <div className=\"flex flex-1 overflow-hidden\">\n <div className=\"flex w-1/2 flex-col gap-4 overflow-auto border-r p-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n {t(\"extensions.nameLabel\")}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t(\"extensions.namePlaceholder\")}\n className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n {t(\"extensions.descriptionLabel\")}\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t(\"extensions.descriptionPlaceholder\")}\n rows={2}\n className=\"w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n </div>\n\n <div className=\"flex flex-1 flex-col\">\n <label className=\"mb-1.5 block text-sm font-medium text-foreground\">\n {t(\"extensions.contentLabel\")}\n </label>\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder={t(\"extensions.contentPlaceholder\")}\n className=\"flex-1 resize-none rounded-md border border-input bg-background p-3 font-mono text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n spellCheck={false}\n />\n </div>\n </div>\n\n <div className=\"w-1/2\">\n {content ? (\n <iframe\n {...{ [SESSION_REPLAY_IFRAME_ATTRIBUTE]: \"\" }}\n srcDoc={previewHtml}\n className=\"h-full w-full border-0\"\n sandbox=\"allow-scripts allow-forms\"\n title={t(\"extensions.previewTitle\")}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {t(\"extensions.previewEmpty\")}\n </div>\n )}\n </div>\n </div>\n </div>\n </TooltipProvider>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionViewer.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionViewer.tsx"],"names":[],"mappings":"AAuHA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAsrBD,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BA8lBpE"}
1
+ {"version":3,"file":"ExtensionViewer.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionViewer.tsx"],"names":[],"mappings":"AAwHA,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAsrBD,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BA+lBpE"}