@assistant-ui/react 0.15.15 → 0.15.17

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 (267) hide show
  1. package/README.md +3 -3
  2. package/dist/devtools/DevToolsHooks.d.ts +0 -2
  3. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  4. package/dist/devtools/DevToolsHooks.js +10 -12
  5. package/dist/devtools/DevToolsHooks.js.map +1 -1
  6. package/dist/index.d.ts +4 -3
  7. package/dist/index.js +2 -2
  8. package/dist/mcp-apps/McpAppRenderer.d.ts +6 -1
  9. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  10. package/dist/mcp-apps/McpAppRenderer.js +20 -13
  11. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  12. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  13. package/dist/mcp-apps/McpAppsRemoteHost.js +20 -17
  14. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  15. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  16. package/dist/mcp-apps/app-frame.js +189 -94
  17. package/dist/mcp-apps/app-frame.js.map +1 -1
  18. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  19. package/dist/mcp-apps/bridge.js +2 -8
  20. package/dist/mcp-apps/bridge.js.map +1 -1
  21. package/dist/mcp-apps/index.d.ts +2 -2
  22. package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -1
  23. package/dist/model-context/frame/useAssistantFrameHost.js +10 -11
  24. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  25. package/dist/model-context/makeAssistantVisible.js +1 -1
  26. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  27. package/dist/primitives/actionBar/ActionBarCopy.js +3 -3
  28. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  29. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  30. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +7 -4
  31. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  32. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +3 -3
  33. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  34. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +3 -3
  35. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  36. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  37. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +3 -3
  38. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  39. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  40. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  41. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  42. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  43. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  44. package/dist/primitives/actionBarMore/scope.d.ts +2 -2
  45. package/dist/primitives/actionBarMore/scope.d.ts.map +1 -1
  46. package/dist/primitives/actionBarMore/scope.js.map +1 -1
  47. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  48. package/dist/primitives/assistantModal/AssistantModalContent.js +1 -1
  49. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  50. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  51. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  52. package/dist/primitives/assistantModal/scope.d.ts +2 -2
  53. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  54. package/dist/primitives/assistantModal/scope.js.map +1 -1
  55. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  56. package/dist/primitives/branchPicker/BranchPickerRoot.js +20 -15
  57. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  58. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -1
  59. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  60. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +2 -2
  61. package/dist/primitives/composer/ComposerDictationTranscript.js +2 -2
  62. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  63. package/dist/primitives/composer/ComposerInput.js +1 -3
  64. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  65. package/dist/primitives/composer/ComposerQuote.js +5 -5
  66. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  67. package/dist/primitives/composer/ComposerRoot.js +3 -3
  68. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  69. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +5 -0
  70. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  71. package/dist/primitives/composer/trigger/TriggerPopover.js +157 -130
  72. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  73. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +3 -3
  74. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  75. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +4 -4
  76. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  77. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +4 -4
  78. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  79. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +2 -0
  80. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  81. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +63 -61
  82. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  83. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +2 -0
  84. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
  85. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  86. package/dist/primitives/composer/trigger/detectTrigger.d.ts +21 -1
  87. package/dist/primitives/composer/trigger/detectTrigger.d.ts.map +1 -0
  88. package/dist/primitives/composer/trigger/detectTrigger.js +17 -3
  89. package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
  90. package/dist/primitives/composer/trigger/index.d.ts +3 -1
  91. package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
  92. package/dist/primitives/composer/trigger/index.js.map +1 -1
  93. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +3 -4
  94. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  95. package/dist/primitives/composer/trigger/triggerDetectionResource.js +15 -14
  96. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  97. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  98. package/dist/primitives/composer/trigger/triggerSelectionResource.js +10 -7
  99. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  100. package/dist/primitives/composer.d.ts +3 -2
  101. package/dist/primitives/composer.js.map +1 -1
  102. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  103. package/dist/primitives/message/MessageIf.js.map +1 -1
  104. package/dist/primitives/message/MessageParts.js.map +1 -1
  105. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  106. package/dist/primitives/message/MessageRoot.js +4 -4
  107. package/dist/primitives/message/MessageRoot.js.map +1 -1
  108. package/dist/primitives/message.js +1 -1
  109. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  110. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +3 -3
  111. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  112. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +3 -3
  113. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  114. package/dist/primitives/thread/ThreadIf.js.map +1 -1
  115. package/dist/primitives/thread/ThreadRoot.d.ts +3 -0
  116. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  117. package/dist/primitives/thread/ThreadRoot.js +3 -0
  118. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  119. package/dist/primitives/thread/ThreadViewport.js +3 -3
  120. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  121. package/dist/primitives/thread/ThreadViewportFooter.js +3 -3
  122. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  123. package/dist/primitives/thread/useThreadViewportAutoScroll.js +1 -1
  124. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  125. package/dist/primitives/threadList/ThreadListNew.js +3 -3
  126. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  127. package/dist/primitives/threadListFocusGroup.d.ts +2 -1
  128. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  129. package/dist/primitives/threadListFocusGroup.js +2 -2
  130. package/dist/primitives/threadListFocusGroup.js.map +1 -1
  131. package/dist/primitives/threadListItem/ThreadListItemRoot.js +3 -3
  132. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  133. package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -1
  134. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  135. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -1
  136. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  137. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  138. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -1
  139. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  140. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  141. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
  142. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  143. package/dist/primitives/threadListItemMore/scope.d.ts +2 -2
  144. package/dist/primitives/threadListItemMore/scope.d.ts.map +1 -1
  145. package/dist/primitives/threadListItemMore/scope.js.map +1 -1
  146. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  147. package/dist/sandbox-host/SandboxHost.js +138 -68
  148. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  149. package/dist/unstable/useComposerInputHistory.js +1 -1
  150. package/dist/unstable/useLiveCompletionAdapter.js +3 -1
  151. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
  152. package/dist/unstable/useSlashCommandAdapter.js +41 -27
  153. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  154. package/dist/utils/Primitive.d.ts +2 -2
  155. package/dist/utils/Primitive.js +2 -2
  156. package/dist/utils/Primitive.js.map +1 -1
  157. package/dist/utils/createActionButton.js +3 -3
  158. package/dist/utils/createActionButton.js.map +1 -1
  159. package/dist/utils/hooks/useOnResizeContent.js +1 -1
  160. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  161. package/dist/utils/hooks/useOnScrollToBottom.js +1 -1
  162. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  163. package/dist/utils/invokeCallbackSafely.d.ts +5 -0
  164. package/dist/utils/invokeCallbackSafely.d.ts.map +1 -0
  165. package/dist/utils/invokeCallbackSafely.js +15 -0
  166. package/dist/utils/invokeCallbackSafely.js.map +1 -0
  167. package/dist/utils/smooth/SmoothContext.d.ts +30 -6
  168. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  169. package/dist/utils/smooth/useSmooth.d.ts +3 -0
  170. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  171. package/dist/utils/smooth/useSmooth.js +17 -2
  172. package/dist/utils/smooth/useSmooth.js.map +1 -1
  173. package/dist/utils/useToolArgsFieldStatus.d.ts +5 -1
  174. package/package.json +12 -20
  175. package/src/devtools/DevToolsHooks.test.ts +40 -0
  176. package/src/devtools/DevToolsHooks.ts +10 -15
  177. package/src/index.ts +9 -1
  178. package/src/mcp-apps/McpAppRenderer.test.tsx +133 -4
  179. package/src/mcp-apps/McpAppRenderer.tsx +28 -21
  180. package/src/mcp-apps/McpAppsRemoteHost.concurrent.test.tsx +215 -0
  181. package/src/mcp-apps/McpAppsRemoteHost.ts +28 -12
  182. package/src/mcp-apps/app-frame.test.tsx +102 -0
  183. package/src/mcp-apps/app-frame.tsx +17 -4
  184. package/src/mcp-apps/bridge.test.ts +21 -0
  185. package/src/mcp-apps/bridge.ts +2 -14
  186. package/src/mcp-apps/index.ts +1 -0
  187. package/src/model-context/frame/AssistantFrame.test.ts +3 -3
  188. package/src/model-context/frame/SPEC_AssistantFrame.md +1 -1
  189. package/src/model-context/frame/useAssistantFrameHost.ts +2 -2
  190. package/src/model-context/makeAssistantVisible.tsx +1 -1
  191. package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
  192. package/src/primitives/actionBar/ActionBarExportMarkdown.test.tsx +67 -0
  193. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +4 -2
  194. package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
  195. package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
  196. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +1 -1
  197. package/src/primitives/actionBarMore/scope.ts +2 -2
  198. package/src/primitives/assistantModal/AssistantModalContent.tsx +1 -1
  199. package/src/primitives/assistantModal/scope.ts +2 -2
  200. package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -3
  201. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +1 -1
  202. package/src/primitives/composer/ComposerDictationTranscript.tsx +2 -2
  203. package/src/primitives/composer/ComposerInput.test.tsx +2 -1
  204. package/src/primitives/composer/ComposerInput.tsx +3 -3
  205. package/src/primitives/composer/ComposerQuote.tsx +1 -1
  206. package/src/primitives/composer/ComposerRoot.tsx +1 -1
  207. package/src/primitives/composer/trigger/TriggerPopover.tsx +16 -1
  208. package/src/primitives/composer/trigger/TriggerPopoverBack.tsx +1 -1
  209. package/src/primitives/composer/trigger/TriggerPopoverCategories.tsx +1 -1
  210. package/src/primitives/composer/trigger/TriggerPopoverItems.tsx +1 -1
  211. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +4 -1
  212. package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +2 -0
  213. package/src/primitives/composer/trigger/detectTrigger.test.ts +88 -5
  214. package/src/primitives/composer/trigger/detectTrigger.ts +50 -9
  215. package/src/primitives/composer/trigger/index.ts +1 -0
  216. package/src/primitives/composer/trigger/triggerDetectionResource.ts +10 -7
  217. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +147 -0
  218. package/src/primitives/composer/trigger/triggerSelectionResource.ts +3 -4
  219. package/src/primitives/composer.ts +1 -0
  220. package/src/primitives/message/MessageRoot.tsx +1 -1
  221. package/src/primitives/selectionToolbar/SelectionToolbarQuote.tsx +1 -1
  222. package/src/primitives/selectionToolbar/SelectionToolbarRoot.tsx +1 -1
  223. package/src/primitives/thread/ThreadRoot.tsx +3 -0
  224. package/src/primitives/thread/ThreadViewport.tsx +1 -1
  225. package/src/primitives/thread/ThreadViewportFooter.tsx +1 -1
  226. package/src/primitives/thread/useThreadViewportAutoScroll.ts +1 -1
  227. package/src/primitives/threadList/ThreadListNew.tsx +1 -1
  228. package/src/primitives/threadListFocusGroup.ts +2 -2
  229. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +1 -1
  230. package/src/primitives/threadListItem/ThreadListItemTrigger.tsx +1 -1
  231. package/src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx +1 -1
  232. package/src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx +1 -1
  233. package/src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx +2 -2
  234. package/src/primitives/threadListItemMore/scope.ts +2 -2
  235. package/src/sandbox-host/SandboxHost.test.tsx +106 -1
  236. package/src/sandbox-host/SandboxHost.tsx +22 -5
  237. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +31 -1
  238. package/src/unstable/useLiveCompletionAdapter.test.tsx +117 -1
  239. package/src/unstable/useLiveCompletionAdapter.ts +4 -1
  240. package/src/unstable/useSlashCommandAdapter.test.tsx +141 -0
  241. package/src/unstable/useSlashCommandAdapter.ts +52 -17
  242. package/src/utils/Primitive.tsx +2 -2
  243. package/src/utils/createActionButton.tsx +1 -1
  244. package/src/utils/hooks/useOnResizeContent.ts +1 -1
  245. package/src/utils/hooks/useOnScrollToBottom.ts +1 -1
  246. package/src/utils/invokeCallbackSafely.ts +11 -0
  247. package/src/utils/smooth/useSmooth.test.tsx +110 -0
  248. package/src/utils/smooth/useSmooth.ts +21 -7
  249. package/dist/context/react/utils/ensureBinding.d.ts +0 -5
  250. package/dist/context/react/utils/ensureBinding.d.ts.map +0 -1
  251. package/dist/context/react/utils/ensureBinding.js +0 -24
  252. package/dist/context/react/utils/ensureBinding.js.map +0 -1
  253. package/dist/context/react/utils/useRuntimeState.d.ts +0 -13
  254. package/dist/context/react/utils/useRuntimeState.d.ts.map +0 -1
  255. package/dist/context/react/utils/useRuntimeState.js +0 -33
  256. package/dist/context/react/utils/useRuntimeState.js.map +0 -1
  257. package/dist/legacy-runtime/runtime/MessagePartRuntime.d.ts +0 -3
  258. package/dist/legacy-runtime/runtime/MessagePartRuntime.js +0 -2
  259. package/dist/legacy-runtime/runtime/MessageRuntime.d.ts +0 -3
  260. package/dist/legacy-runtime/runtime/MessageRuntime.js +0 -2
  261. package/dist/legacy-runtime/runtime/ThreadListRuntime.d.ts +0 -3
  262. package/dist/legacy-runtime/runtime/ThreadListRuntime.js +0 -2
  263. package/src/context/react/utils/ensureBinding.ts +0 -46
  264. package/src/context/react/utils/useRuntimeState.ts +0 -46
  265. package/src/legacy-runtime/runtime/MessagePartRuntime.ts +0 -2
  266. package/src/legacy-runtime/runtime/MessageRuntime.ts +0 -3
  267. package/src/legacy-runtime/runtime/ThreadListRuntime.ts +0 -4
@@ -2,7 +2,7 @@
2
2
  import { createMcpAppBridge } from "./bridge.js";
3
3
  import { SandboxHost } from "../sandbox-host/SandboxHost.js";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
- import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
5
+ import { useEffect, useLayoutEffect, useRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/mcp-apps/app-frame.tsx
8
8
  const DEFAULT_PRODUCT = "assistant-ui-mcp-app";
@@ -67,7 +67,10 @@ function buildLiveHandlers(initial, liveRef) {
67
67
  out.onError = (e) => live()?.onError?.(e);
68
68
  return out;
69
69
  }
70
- function McpAppFrame({ app, resource, input, output, sandbox, handlers, hostInfo, hostContext, maxHeight = DEFAULT_MAX_HEIGHT }) {
70
+ function McpAppFrame(t0) {
71
+ const $ = c(29);
72
+ const { app, resource, input, output, sandbox, handlers, hostInfo, hostContext, maxHeight: t1 } = t0;
73
+ const maxHeight = t1 === void 0 ? DEFAULT_MAX_HEIGHT : t1;
71
74
  const bridgeRef = useRef(null);
72
75
  const lastSentInputRef = useRef(void 0);
73
76
  const lastSentOutputRef = useRef(void 0);
@@ -76,105 +79,197 @@ function McpAppFrame({ app, resource, input, output, sandbox, handlers, hostInfo
76
79
  const pendingInputRef = useRef(void 0);
77
80
  const pendingOutputRef = useRef(void 0);
78
81
  const pendingHostContextRef = useRef(void 0);
79
- const liveRef = useRef(null);
80
- liveRef.current = {
81
- handlers,
82
- hostInfo,
83
- hostContext,
84
- input,
85
- output
86
- };
87
- const createBridge = (frame, host) => {
88
- const current = liveRef.current;
89
- let initTimeoutId = null;
90
- const flushPending = () => {
91
- if (widgetReadyRef.current) return;
92
- widgetReadyRef.current = true;
93
- const b = bridgeRef.current;
94
- if (!b) return;
95
- if (pendingInputRef.current !== void 0) {
96
- b.notifyToolInput(pendingInputRef.current);
97
- lastSentInputRef.current = pendingInputRef.current;
98
- pendingInputRef.current = void 0;
99
- }
100
- if (pendingOutputRef.current !== void 0) {
101
- b.notifyToolResult(pendingOutputRef.current);
102
- lastSentOutputRef.current = pendingOutputRef.current;
103
- pendingOutputRef.current = void 0;
104
- }
105
- if (pendingHostContextRef.current !== void 0) {
106
- b.notifyHostContextChanged(pendingHostContextRef.current);
107
- lastSentHostContextRef.current = pendingHostContextRef.current;
108
- pendingHostContextRef.current = void 0;
109
- }
82
+ let t2;
83
+ if ($[0] !== handlers || $[1] !== hostContext || $[2] !== hostInfo || $[3] !== input || $[4] !== output) {
84
+ t2 = {
85
+ handlers,
86
+ hostInfo,
87
+ hostContext,
88
+ input,
89
+ output
110
90
  };
111
- const liveHandlers = buildLiveHandlers(current.handlers, liveRef);
112
- const liveOnInitialized = liveHandlers.onInitialized;
113
- const wrappedHandlers = {
114
- ...liveHandlers,
115
- onInitialized: () => {
116
- if (initTimeoutId !== null) {
117
- clearTimeout(initTimeoutId);
118
- initTimeoutId = null;
91
+ $[0] = handlers;
92
+ $[1] = hostContext;
93
+ $[2] = hostInfo;
94
+ $[3] = input;
95
+ $[4] = output;
96
+ $[5] = t2;
97
+ } else t2 = $[5];
98
+ const liveRef = useRef(t2);
99
+ let t3;
100
+ let t4;
101
+ if ($[6] !== handlers || $[7] !== hostContext || $[8] !== hostInfo || $[9] !== input || $[10] !== output) {
102
+ t3 = () => {
103
+ liveRef.current = {
104
+ handlers,
105
+ hostInfo,
106
+ hostContext,
107
+ input,
108
+ output
109
+ };
110
+ };
111
+ t4 = [
112
+ handlers,
113
+ hostInfo,
114
+ hostContext,
115
+ input,
116
+ output
117
+ ];
118
+ $[6] = handlers;
119
+ $[7] = hostContext;
120
+ $[8] = hostInfo;
121
+ $[9] = input;
122
+ $[10] = output;
123
+ $[11] = t3;
124
+ $[12] = t4;
125
+ } else {
126
+ t3 = $[11];
127
+ t4 = $[12];
128
+ }
129
+ useLayoutEffect(t3, t4);
130
+ let t5;
131
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
132
+ t5 = (frame, host) => {
133
+ const current = liveRef.current;
134
+ let initTimeoutId = null;
135
+ const flushPending = () => {
136
+ if (widgetReadyRef.current) return;
137
+ widgetReadyRef.current = true;
138
+ const b = bridgeRef.current;
139
+ if (!b) return;
140
+ if (pendingInputRef.current !== void 0) {
141
+ b.notifyToolInput(pendingInputRef.current);
142
+ lastSentInputRef.current = pendingInputRef.current;
143
+ pendingInputRef.current = void 0;
144
+ }
145
+ if (pendingOutputRef.current !== void 0) {
146
+ b.notifyToolResult(pendingOutputRef.current);
147
+ lastSentOutputRef.current = pendingOutputRef.current;
148
+ pendingOutputRef.current = void 0;
119
149
  }
150
+ if (pendingHostContextRef.current !== void 0) {
151
+ b.notifyHostContextChanged(pendingHostContextRef.current);
152
+ lastSentHostContextRef.current = pendingHostContextRef.current;
153
+ pendingHostContextRef.current = void 0;
154
+ }
155
+ };
156
+ const liveHandlers = buildLiveHandlers(current.handlers, liveRef);
157
+ const liveOnInitialized = liveHandlers.onInitialized;
158
+ const wrappedHandlers = {
159
+ ...liveHandlers,
160
+ onInitialized: () => {
161
+ if (initTimeoutId !== null) {
162
+ clearTimeout(initTimeoutId);
163
+ initTimeoutId = null;
164
+ }
165
+ flushPending();
166
+ liveOnInitialized?.();
167
+ },
168
+ onSizeChange: (p) => {
169
+ if (p.height != null) host.setHeight(p.height);
170
+ liveHandlers.onSizeChange?.(p);
171
+ }
172
+ };
173
+ initTimeoutId = setTimeout(() => {
174
+ initTimeoutId = null;
120
175
  flushPending();
121
- liveOnInitialized?.();
122
- },
123
- onSizeChange: (p) => {
124
- if (p.height != null) host.setHeight(p.height);
125
- liveHandlers.onSizeChange?.(p);
126
- }
127
- };
128
- initTimeoutId = setTimeout(() => {
129
- initTimeoutId = null;
130
- flushPending();
131
- }, INIT_TIMEOUT_MS);
132
- const bridge = createMcpAppBridge({
133
- frame,
134
- handlers: wrappedHandlers,
135
- hostInfo: current.hostInfo,
136
- hostContext: current.hostContext
137
- });
138
- bridgeRef.current = bridge;
139
- if (current.input !== void 0) pendingInputRef.current = current.input;
140
- if (current.output !== void 0) pendingOutputRef.current = current.output;
141
- return {
142
- onMessage: bridge.onMessage,
143
- dispose: () => {
144
- if (initTimeoutId !== null) {
145
- clearTimeout(initTimeoutId);
146
- initTimeoutId = null;
176
+ }, INIT_TIMEOUT_MS);
177
+ const bridge = createMcpAppBridge({
178
+ frame,
179
+ handlers: wrappedHandlers,
180
+ hostInfo: current.hostInfo,
181
+ hostContext: current.hostContext
182
+ });
183
+ bridgeRef.current = bridge;
184
+ if (current.input !== void 0) pendingInputRef.current = current.input;
185
+ if (current.output !== void 0) pendingOutputRef.current = current.output;
186
+ return {
187
+ onMessage: bridge.onMessage,
188
+ dispose: () => {
189
+ if (initTimeoutId !== null) {
190
+ clearTimeout(initTimeoutId);
191
+ initTimeoutId = null;
192
+ }
193
+ bridge.dispose();
194
+ bridgeRef.current = null;
195
+ lastSentInputRef.current = void 0;
196
+ lastSentOutputRef.current = void 0;
197
+ lastSentHostContextRef.current = void 0;
198
+ widgetReadyRef.current = false;
199
+ pendingInputRef.current = void 0;
200
+ pendingOutputRef.current = void 0;
201
+ pendingHostContextRef.current = void 0;
147
202
  }
148
- bridge.dispose();
149
- bridgeRef.current = null;
150
- lastSentInputRef.current = void 0;
151
- lastSentOutputRef.current = void 0;
152
- lastSentHostContextRef.current = void 0;
153
- widgetReadyRef.current = false;
154
- pendingInputRef.current = void 0;
155
- pendingOutputRef.current = void 0;
156
- pendingHostContextRef.current = void 0;
157
- }
203
+ };
158
204
  };
159
- };
160
- useBridgeNotify(input, bridgeRef, widgetReadyRef, pendingInputRef, lastSentInputRef, (b_0, v) => b_0.notifyToolInput(v));
161
- useBridgeNotify(output, bridgeRef, widgetReadyRef, pendingOutputRef, lastSentOutputRef, (b_1, v_0) => b_1.notifyToolResult(v_0));
162
- useBridgeNotify(hostContext, bridgeRef, widgetReadyRef, pendingHostContextRef, lastSentHostContextRef, (b_2, v_1) => b_2.notifyHostContextChanged(v_1));
163
- return /* @__PURE__ */ jsx(SandboxHost, {
164
- content: { html: resource.html },
165
- contentKey: app.serverId ? `${app.serverId} ${resource.uri}` : resource.uri,
166
- sandbox: {
205
+ $[13] = t5;
206
+ } else t5 = $[13];
207
+ const createBridge = t5;
208
+ useBridgeNotify(input, bridgeRef, widgetReadyRef, pendingInputRef, lastSentInputRef, _temp);
209
+ useBridgeNotify(output, bridgeRef, widgetReadyRef, pendingOutputRef, lastSentOutputRef, _temp2);
210
+ useBridgeNotify(hostContext, bridgeRef, widgetReadyRef, pendingHostContextRef, lastSentHostContextRef, _temp3);
211
+ let t6;
212
+ if ($[14] !== resource.html) {
213
+ t6 = { html: resource.html };
214
+ $[14] = resource.html;
215
+ $[15] = t6;
216
+ } else t6 = $[15];
217
+ const t7 = app.serverId ? `${app.serverId} ${resource.uri}` : resource.uri;
218
+ const t8 = sandbox?.product ?? DEFAULT_PRODUCT;
219
+ let t9;
220
+ if ($[16] !== sandbox || $[17] !== t8) {
221
+ t9 = {
167
222
  ...sandbox,
168
- product: sandbox?.product ?? DEFAULT_PRODUCT
169
- },
170
- maxHeight,
171
- createBridge,
172
- onError: (err) => liveRef.current.handlers?.onError?.(err),
173
- containerProps: {
223
+ product: t8
224
+ };
225
+ $[16] = sandbox;
226
+ $[17] = t8;
227
+ $[18] = t9;
228
+ } else t9 = $[18];
229
+ let t10;
230
+ if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
231
+ t10 = (err) => liveRef.current.handlers?.onError?.(err);
232
+ $[19] = t10;
233
+ } else t10 = $[19];
234
+ const t11 = resource.meta?.prefersBorder ? "" : void 0;
235
+ let t12;
236
+ if ($[20] !== app.resourceUri || $[21] !== t11) {
237
+ t12 = {
174
238
  "data-mcp-app-resource": app.resourceUri,
175
- "data-mcp-app-prefers-border": resource.meta?.prefersBorder ? "" : void 0
176
- }
177
- });
239
+ "data-mcp-app-prefers-border": t11
240
+ };
241
+ $[20] = app.resourceUri;
242
+ $[21] = t11;
243
+ $[22] = t12;
244
+ } else t12 = $[22];
245
+ let t13;
246
+ if ($[23] !== maxHeight || $[24] !== t12 || $[25] !== t6 || $[26] !== t7 || $[27] !== t9) {
247
+ t13 = /* @__PURE__ */ jsx(SandboxHost, {
248
+ content: t6,
249
+ contentKey: t7,
250
+ sandbox: t9,
251
+ maxHeight,
252
+ createBridge,
253
+ onError: t10,
254
+ containerProps: t12
255
+ });
256
+ $[23] = maxHeight;
257
+ $[24] = t12;
258
+ $[25] = t6;
259
+ $[26] = t7;
260
+ $[27] = t9;
261
+ $[28] = t13;
262
+ } else t13 = $[28];
263
+ return t13;
264
+ }
265
+ function _temp3(b_2, v_1) {
266
+ return b_2.notifyHostContextChanged(v_1);
267
+ }
268
+ function _temp2(b_1, v_0) {
269
+ return b_1.notifyToolResult(v_0);
270
+ }
271
+ function _temp(b_0, v) {
272
+ return b_0.notifyToolInput(v);
178
273
  }
179
274
  //#endregion
180
275
  export { McpAppFrame };
@@ -1 +1 @@
1
- {"version":3,"file":"app-frame.js","names":["c","_c","MutableRefObject","useEffect","useRef","McpAppBridge","createMcpAppBridge","SandboxHost","SandboxBridge","SandboxHostApi","SandboxHostFrame","McpAppBridgeHandlers","McpAppFrameProps","McpAppHostContext","DEFAULT_PRODUCT","INIT_TIMEOUT_MS","DEFAULT_MAX_HEIGHT","useBridgeNotify","value","bridgeRef","widgetReadyRef","pendingRef","lastSentRef","notify","$","t0","current","undefined","t1","LiveSnapshot","handlers","hostInfo","hostContext","input","output","buildLiveHandlers","initial","liveRef","live","has","key","K","out","Object","defineProperty","get","allowedTools","enumerable","configurable","liveCall","NonNullable","p","fn","Error","callTool","readResource","listResources","openLink","sendMessage","updateModelContext","requestDisplayMode","onSizeChange","onInitialized","onRequestTeardown","onLog","onError","e","McpAppFrame","app","resource","sandbox","maxHeight","lastSentInputRef","lastSentOutputRef","lastSentHostContextRef","pendingInputRef","pendingOutputRef","pendingHostContextRef","createBridge","frame","host","initTimeoutId","ReturnType","setTimeout","flushPending","b","notifyToolInput","notifyToolResult","notifyHostContextChanged","liveHandlers","liveOnInitialized","wrappedHandlers","clearTimeout","height","setHeight","bridge","onMessage","dispose","v","html","serverId","uri","product","err","resourceUri","meta","prefersBorder"],"sources":["../../src/mcp-apps/app-frame.tsx"],"sourcesContent":["\"use client\";\n\nimport { type MutableRefObject, useEffect, useRef } from \"react\";\nimport { type McpAppBridge, createMcpAppBridge } from \"./bridge\";\nimport {\n SandboxHost,\n type SandboxBridge,\n type SandboxHostApi,\n type SandboxHostFrame,\n} from \"../sandbox-host/SandboxHost\";\nimport type {\n McpAppBridgeHandlers,\n McpAppFrameProps,\n McpAppHostContext,\n} from \"./types\";\n\nconst DEFAULT_PRODUCT = \"assistant-ui-mcp-app\";\nconst INIT_TIMEOUT_MS = 5000;\nconst DEFAULT_MAX_HEIGHT = 800;\n\nfunction useBridgeNotify<T>(\n value: T | undefined,\n bridgeRef: MutableRefObject<McpAppBridge | null>,\n widgetReadyRef: MutableRefObject<boolean>,\n pendingRef: MutableRefObject<T | undefined>,\n lastSentRef: MutableRefObject<T | undefined>,\n notify: (bridge: McpAppBridge, v: T) => void,\n) {\n useEffect(() => {\n if (!bridgeRef.current) return;\n if (value === undefined) return;\n if (lastSentRef.current === value) return;\n if (!widgetReadyRef.current) {\n pendingRef.current = value;\n return;\n }\n notify(bridgeRef.current, value);\n lastSentRef.current = value;\n // oxlint-disable-next-line react/exhaustive-deps -- refs are stable; notify is assumed stable; re-run only when value changes\n }, [value]);\n}\n\ntype LiveSnapshot = {\n handlers: McpAppBridgeHandlers | undefined;\n hostInfo: McpAppFrameProps[\"hostInfo\"];\n hostContext: McpAppFrameProps[\"hostContext\"];\n input: unknown;\n output: unknown;\n};\n\n// Proxy each per-call handler through liveRef so the bridge always dispatches\n// to the latest handler reference (e.g. inline callbacks closing over state).\n// Capability presence is snapshot at mount: a handler added later requires a\n// remount (keyed on resource URI) to expose the capability to the widget.\nfunction buildLiveHandlers(\n initial: McpAppBridgeHandlers | undefined,\n liveRef: { readonly current: LiveSnapshot },\n): McpAppBridgeHandlers {\n const live = () => liveRef.current.handlers;\n const has = <K extends keyof McpAppBridgeHandlers>(key: K) =>\n initial?.[key] !== undefined;\n const out: McpAppBridgeHandlers = {};\n if (has(\"allowedTools\")) {\n Object.defineProperty(out, \"allowedTools\", {\n get: () => live()?.allowedTools,\n enumerable: true,\n configurable: true,\n });\n }\n const liveCall = <K extends keyof McpAppBridgeHandlers>(\n key: K,\n ): NonNullable<McpAppBridgeHandlers[K]> =>\n ((p: unknown) => {\n const fn = live()?.[key] as ((p: unknown) => unknown) | undefined;\n if (!fn) {\n throw new Error(`${key} handler is no longer available`);\n }\n return fn(p);\n }) as NonNullable<McpAppBridgeHandlers[K]>;\n if (has(\"callTool\")) out.callTool = liveCall(\"callTool\");\n if (has(\"readResource\")) out.readResource = liveCall(\"readResource\");\n if (has(\"listResources\")) out.listResources = liveCall(\"listResources\");\n if (has(\"openLink\")) out.openLink = liveCall(\"openLink\");\n if (has(\"sendMessage\")) out.sendMessage = liveCall(\"sendMessage\");\n if (has(\"updateModelContext\"))\n out.updateModelContext = liveCall(\"updateModelContext\");\n if (has(\"requestDisplayMode\"))\n out.requestDisplayMode = liveCall(\"requestDisplayMode\");\n out.onSizeChange = (p) => live()?.onSizeChange?.(p);\n out.onInitialized = () => live()?.onInitialized?.();\n out.onRequestTeardown = (p) => live()?.onRequestTeardown?.(p);\n out.onLog = (p) => live()?.onLog?.(p);\n out.onError = (e) => live()?.onError?.(e);\n return out;\n}\n\nexport function McpAppFrame({\n app,\n resource,\n input,\n output,\n sandbox,\n handlers,\n hostInfo,\n hostContext,\n maxHeight = DEFAULT_MAX_HEIGHT,\n}: McpAppFrameProps) {\n const bridgeRef = useRef<McpAppBridge | null>(null);\n const lastSentInputRef = useRef<unknown>(undefined);\n const lastSentOutputRef = useRef<unknown>(undefined);\n const lastSentHostContextRef = useRef<McpAppHostContext | undefined>(\n undefined,\n );\n // Per MCP Apps spec, the host should defer notifications until the widget\n // signals readiness via `notifications/initialized`. Until then, we record\n // pending values and flush them on init.\n const widgetReadyRef = useRef(false);\n const pendingInputRef = useRef<unknown>(undefined);\n const pendingOutputRef = useRef<unknown>(undefined);\n const pendingHostContextRef = useRef<McpAppHostContext | undefined>(\n undefined,\n );\n\n const liveRef = useRef<LiveSnapshot>(null!);\n liveRef.current = {\n handlers,\n hostInfo,\n hostContext,\n input,\n output,\n };\n\n const createBridge = (\n frame: SandboxHostFrame,\n host: SandboxHostApi,\n ): SandboxBridge => {\n const current = liveRef.current;\n let initTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const flushPending = () => {\n if (widgetReadyRef.current) return;\n widgetReadyRef.current = true;\n const b = bridgeRef.current;\n if (!b) return;\n if (pendingInputRef.current !== undefined) {\n b.notifyToolInput(pendingInputRef.current);\n lastSentInputRef.current = pendingInputRef.current;\n pendingInputRef.current = undefined;\n }\n if (pendingOutputRef.current !== undefined) {\n b.notifyToolResult(pendingOutputRef.current);\n lastSentOutputRef.current = pendingOutputRef.current;\n pendingOutputRef.current = undefined;\n }\n if (pendingHostContextRef.current !== undefined) {\n b.notifyHostContextChanged(pendingHostContextRef.current);\n lastSentHostContextRef.current = pendingHostContextRef.current;\n pendingHostContextRef.current = undefined;\n }\n };\n\n const liveHandlers = buildLiveHandlers(current.handlers, liveRef);\n const liveOnInitialized = liveHandlers.onInitialized;\n const wrappedHandlers: McpAppBridgeHandlers = {\n ...liveHandlers,\n onInitialized: () => {\n if (initTimeoutId !== null) {\n clearTimeout(initTimeoutId);\n initTimeoutId = null;\n }\n flushPending();\n liveOnInitialized?.();\n },\n onSizeChange: (p) => {\n if (p.height != null) host.setHeight(p.height);\n liveHandlers.onSizeChange?.(p);\n },\n };\n\n // Safety net: if the widget never sends notifications/initialized (broken\n // or non-spec-compliant), flush the queue anyway so the host doesn't\n // appear hung.\n initTimeoutId = setTimeout(() => {\n initTimeoutId = null;\n flushPending();\n }, INIT_TIMEOUT_MS);\n\n const bridge = createMcpAppBridge({\n frame,\n handlers: wrappedHandlers,\n hostInfo: current.hostInfo,\n hostContext: current.hostContext,\n });\n bridgeRef.current = bridge;\n\n if (current.input !== undefined) pendingInputRef.current = current.input;\n if (current.output !== undefined) pendingOutputRef.current = current.output;\n // hostContext is delivered inside the ui/initialize response; subsequent\n // changes flow through useBridgeNotify's pending path.\n\n return {\n onMessage: bridge.onMessage,\n dispose: () => {\n if (initTimeoutId !== null) {\n clearTimeout(initTimeoutId);\n initTimeoutId = null;\n }\n bridge.dispose();\n bridgeRef.current = null;\n lastSentInputRef.current = undefined;\n lastSentOutputRef.current = undefined;\n lastSentHostContextRef.current = undefined;\n widgetReadyRef.current = false;\n pendingInputRef.current = undefined;\n pendingOutputRef.current = undefined;\n pendingHostContextRef.current = undefined;\n },\n };\n };\n\n useBridgeNotify(\n input,\n bridgeRef,\n widgetReadyRef,\n pendingInputRef,\n lastSentInputRef,\n (b, v) => b.notifyToolInput(v),\n );\n useBridgeNotify(\n output,\n bridgeRef,\n widgetReadyRef,\n pendingOutputRef,\n lastSentOutputRef,\n (b, v) => b.notifyToolResult(v),\n );\n useBridgeNotify(\n hostContext,\n bridgeRef,\n widgetReadyRef,\n pendingHostContextRef,\n lastSentHostContextRef,\n (b, v) => b.notifyHostContextChanged(v),\n );\n\n return (\n <SandboxHost\n content={{ html: resource.html }}\n contentKey={\n app.serverId ? `${app.serverId} ${resource.uri}` : resource.uri\n }\n sandbox={{ ...sandbox, product: sandbox?.product ?? DEFAULT_PRODUCT }}\n maxHeight={maxHeight}\n createBridge={createBridge}\n onError={(err) => liveRef.current.handlers?.onError?.(err)}\n containerProps={{\n \"data-mcp-app-resource\": app.resourceUri,\n \"data-mcp-app-prefers-border\": resource.meta?.prefersBorder\n ? \"\"\n : undefined,\n }}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-frame.js","names":["c","_c","MutableRefObject","useEffect","useLayoutEffect","useRef","McpAppBridge","createMcpAppBridge","SandboxHost","SandboxBridge","SandboxHostApi","SandboxHostFrame","McpAppBridgeHandlers","McpAppFrameProps","McpAppHostContext","DEFAULT_PRODUCT","INIT_TIMEOUT_MS","DEFAULT_MAX_HEIGHT","useBridgeNotify","value","bridgeRef","widgetReadyRef","pendingRef","lastSentRef","notify","$","t0","current","undefined","t1","LiveSnapshot","handlers","hostInfo","hostContext","input","output","buildLiveHandlers","initial","liveRef","live","has","key","K","out","Object","defineProperty","get","allowedTools","enumerable","configurable","liveCall","NonNullable","p","fn","Error","callTool","readResource","listResources","openLink","sendMessage","updateModelContext","requestDisplayMode","onSizeChange","onInitialized","onRequestTeardown","onLog","onError","e","McpAppFrame","app","resource","sandbox","maxHeight","lastSentInputRef","lastSentOutputRef","lastSentHostContextRef","pendingInputRef","pendingOutputRef","pendingHostContextRef","t2","t3","t4","t5","Symbol","for","frame","host","initTimeoutId","flushPending","b","notifyToolInput","notifyToolResult","notifyHostContextChanged","liveHandlers","liveOnInitialized","wrappedHandlers","clearTimeout","height","setHeight","setTimeout","bridge","onMessage","dispose","createBridge","_temp","_temp2","_temp3","t6","html","t7","serverId","uri","t8","product","t9","t10","err","t11","meta","prefersBorder","t12","resourceUri","t13","b_2","v_1","v","b_1","v_0","b_0"],"sources":["../../src/mcp-apps/app-frame.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type MutableRefObject,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { type McpAppBridge, createMcpAppBridge } from \"./bridge\";\nimport {\n SandboxHost,\n type SandboxBridge,\n type SandboxHostApi,\n type SandboxHostFrame,\n} from \"../sandbox-host/SandboxHost\";\nimport type {\n McpAppBridgeHandlers,\n McpAppFrameProps,\n McpAppHostContext,\n} from \"./types\";\n\nconst DEFAULT_PRODUCT = \"assistant-ui-mcp-app\";\nconst INIT_TIMEOUT_MS = 5000;\nconst DEFAULT_MAX_HEIGHT = 800;\n\nfunction useBridgeNotify<T>(\n value: T | undefined,\n bridgeRef: MutableRefObject<McpAppBridge | null>,\n widgetReadyRef: MutableRefObject<boolean>,\n pendingRef: MutableRefObject<T | undefined>,\n lastSentRef: MutableRefObject<T | undefined>,\n notify: (bridge: McpAppBridge, v: T) => void,\n) {\n useEffect(() => {\n if (!bridgeRef.current) return;\n if (value === undefined) return;\n if (lastSentRef.current === value) return;\n if (!widgetReadyRef.current) {\n pendingRef.current = value;\n return;\n }\n notify(bridgeRef.current, value);\n lastSentRef.current = value;\n // oxlint-disable-next-line react/exhaustive-deps -- refs are stable; notify is assumed stable; re-run only when value changes\n }, [value]);\n}\n\ntype LiveSnapshot = {\n handlers: McpAppBridgeHandlers | undefined;\n hostInfo: McpAppFrameProps[\"hostInfo\"];\n hostContext: McpAppFrameProps[\"hostContext\"];\n input: unknown;\n output: unknown;\n};\n\n// Proxy each per-call handler through liveRef so the bridge always dispatches\n// to the latest handler reference (e.g. inline callbacks closing over state).\n// Capability presence is snapshot at mount: a handler added later requires a\n// remount (keyed on resource URI) to expose the capability to the widget.\nfunction buildLiveHandlers(\n initial: McpAppBridgeHandlers | undefined,\n liveRef: { readonly current: LiveSnapshot },\n): McpAppBridgeHandlers {\n const live = () => liveRef.current.handlers;\n const has = <K extends keyof McpAppBridgeHandlers>(key: K) =>\n initial?.[key] !== undefined;\n const out: McpAppBridgeHandlers = {};\n if (has(\"allowedTools\")) {\n Object.defineProperty(out, \"allowedTools\", {\n get: () => live()?.allowedTools,\n enumerable: true,\n configurable: true,\n });\n }\n const liveCall = <K extends keyof McpAppBridgeHandlers>(\n key: K,\n ): NonNullable<McpAppBridgeHandlers[K]> =>\n ((p: unknown) => {\n const fn = live()?.[key] as ((p: unknown) => unknown) | undefined;\n if (!fn) {\n throw new Error(`${key} handler is no longer available`);\n }\n return fn(p);\n }) as NonNullable<McpAppBridgeHandlers[K]>;\n if (has(\"callTool\")) out.callTool = liveCall(\"callTool\");\n if (has(\"readResource\")) out.readResource = liveCall(\"readResource\");\n if (has(\"listResources\")) out.listResources = liveCall(\"listResources\");\n if (has(\"openLink\")) out.openLink = liveCall(\"openLink\");\n if (has(\"sendMessage\")) out.sendMessage = liveCall(\"sendMessage\");\n if (has(\"updateModelContext\"))\n out.updateModelContext = liveCall(\"updateModelContext\");\n if (has(\"requestDisplayMode\"))\n out.requestDisplayMode = liveCall(\"requestDisplayMode\");\n out.onSizeChange = (p) => live()?.onSizeChange?.(p);\n out.onInitialized = () => live()?.onInitialized?.();\n out.onRequestTeardown = (p) => live()?.onRequestTeardown?.(p);\n out.onLog = (p) => live()?.onLog?.(p);\n out.onError = (e) => live()?.onError?.(e);\n return out;\n}\n\nexport function McpAppFrame({\n app,\n resource,\n input,\n output,\n sandbox,\n handlers,\n hostInfo,\n hostContext,\n maxHeight = DEFAULT_MAX_HEIGHT,\n}: McpAppFrameProps) {\n const bridgeRef = useRef<McpAppBridge | null>(null);\n const lastSentInputRef = useRef<unknown>(undefined);\n const lastSentOutputRef = useRef<unknown>(undefined);\n const lastSentHostContextRef = useRef<McpAppHostContext | undefined>(\n undefined,\n );\n // Per MCP Apps spec, the host should defer notifications until the widget\n // signals readiness via `notifications/initialized`. Until then, we record\n // pending values and flush them on init.\n const widgetReadyRef = useRef(false);\n const pendingInputRef = useRef<unknown>(undefined);\n const pendingOutputRef = useRef<unknown>(undefined);\n const pendingHostContextRef = useRef<McpAppHostContext | undefined>(\n undefined,\n );\n\n const liveRef = useRef<LiveSnapshot>({\n handlers,\n hostInfo,\n hostContext,\n input,\n output,\n });\n useLayoutEffect(() => {\n liveRef.current = {\n handlers,\n hostInfo,\n hostContext,\n input,\n output,\n };\n }, [handlers, hostInfo, hostContext, input, output]);\n\n const createBridge = (\n frame: SandboxHostFrame,\n host: SandboxHostApi,\n ): SandboxBridge => {\n const current = liveRef.current;\n let initTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const flushPending = () => {\n if (widgetReadyRef.current) return;\n widgetReadyRef.current = true;\n const b = bridgeRef.current;\n if (!b) return;\n if (pendingInputRef.current !== undefined) {\n b.notifyToolInput(pendingInputRef.current);\n lastSentInputRef.current = pendingInputRef.current;\n pendingInputRef.current = undefined;\n }\n if (pendingOutputRef.current !== undefined) {\n b.notifyToolResult(pendingOutputRef.current);\n lastSentOutputRef.current = pendingOutputRef.current;\n pendingOutputRef.current = undefined;\n }\n if (pendingHostContextRef.current !== undefined) {\n b.notifyHostContextChanged(pendingHostContextRef.current);\n lastSentHostContextRef.current = pendingHostContextRef.current;\n pendingHostContextRef.current = undefined;\n }\n };\n\n const liveHandlers = buildLiveHandlers(current.handlers, liveRef);\n const liveOnInitialized = liveHandlers.onInitialized;\n const wrappedHandlers: McpAppBridgeHandlers = {\n ...liveHandlers,\n onInitialized: () => {\n if (initTimeoutId !== null) {\n clearTimeout(initTimeoutId);\n initTimeoutId = null;\n }\n flushPending();\n liveOnInitialized?.();\n },\n onSizeChange: (p) => {\n if (p.height != null) host.setHeight(p.height);\n liveHandlers.onSizeChange?.(p);\n },\n };\n\n // Safety net: if the widget never sends notifications/initialized (broken\n // or non-spec-compliant), flush the queue anyway so the host doesn't\n // appear hung.\n initTimeoutId = setTimeout(() => {\n initTimeoutId = null;\n flushPending();\n }, INIT_TIMEOUT_MS);\n\n const bridge = createMcpAppBridge({\n frame,\n handlers: wrappedHandlers,\n hostInfo: current.hostInfo,\n hostContext: current.hostContext,\n });\n bridgeRef.current = bridge;\n\n if (current.input !== undefined) pendingInputRef.current = current.input;\n if (current.output !== undefined) pendingOutputRef.current = current.output;\n // hostContext is delivered inside the ui/initialize response; subsequent\n // changes flow through useBridgeNotify's pending path.\n\n return {\n onMessage: bridge.onMessage,\n dispose: () => {\n if (initTimeoutId !== null) {\n clearTimeout(initTimeoutId);\n initTimeoutId = null;\n }\n bridge.dispose();\n bridgeRef.current = null;\n lastSentInputRef.current = undefined;\n lastSentOutputRef.current = undefined;\n lastSentHostContextRef.current = undefined;\n widgetReadyRef.current = false;\n pendingInputRef.current = undefined;\n pendingOutputRef.current = undefined;\n pendingHostContextRef.current = undefined;\n },\n };\n };\n\n useBridgeNotify(\n input,\n bridgeRef,\n widgetReadyRef,\n pendingInputRef,\n lastSentInputRef,\n (b, v) => b.notifyToolInput(v),\n );\n useBridgeNotify(\n output,\n bridgeRef,\n widgetReadyRef,\n pendingOutputRef,\n lastSentOutputRef,\n (b, v) => b.notifyToolResult(v),\n );\n useBridgeNotify(\n hostContext,\n bridgeRef,\n widgetReadyRef,\n pendingHostContextRef,\n lastSentHostContextRef,\n (b, v) => b.notifyHostContextChanged(v),\n );\n\n return (\n <SandboxHost\n content={{ html: resource.html }}\n contentKey={\n app.serverId ? `${app.serverId} ${resource.uri}` : resource.uri\n }\n sandbox={{ ...sandbox, product: sandbox?.product ?? DEFAULT_PRODUCT }}\n maxHeight={maxHeight}\n createBridge={createBridge}\n onError={(err) => liveRef.current.handlers?.onError?.(err)}\n containerProps={{\n \"data-mcp-app-resource\": app.resourceUri,\n \"data-mcp-app-prefers-border\": resource.meta?.prefersBorder\n ? \"\"\n : undefined,\n }}\n />\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","names":[],"sources":["../../src/mcp-apps/bridge.ts"],"mappings":";;;KAoBY,oBAAoB;KAEpB;EACV,OAAO;EACP,WAAW;EACX,WAAW;EACX,cAAc;;KAGJ;EACV,YAAY,OAAO;EACnB;EACA,kBAAkB;EAClB,mBAAmB;EACnB,2BAA2B,aAAa;;iBAgD1B,mBACd,MAAM,4BACL"}
1
+ {"version":3,"file":"bridge.d.ts","names":[],"sources":["../../src/mcp-apps/bridge.ts"],"mappings":";;;KAqBY,oBAAoB;KAEpB;EACV,OAAO;EACP,WAAW;EACX,WAAW;EACX,cAAc;;KAGJ;EACV,YAAY,OAAO;EACnB;EACA,kBAAkB;EAClB,mBAAmB;EACnB,2BAA2B,aAAa;;iBAgD1B,mBACd,MAAM,4BACL"}
@@ -1,3 +1,4 @@
1
+ import { invokeCallbackSafely } from "../utils/invokeCallbackSafely.js";
1
2
  import "./types.js";
2
3
  import { isRecord } from "@assistant-ui/core/internal";
3
4
  //#region src/mcp-apps/bridge.ts
@@ -58,15 +59,8 @@ function createMcpAppBridge(opts) {
58
59
  ...data !== void 0 ? { data } : {}
59
60
  } });
60
61
  };
61
- const reportErrorCallbackFailure = (error) => {
62
- console.error("[assistant-ui] MCP App onError callback threw an error", error);
63
- };
64
62
  const reportError = (error) => {
65
- try {
66
- Promise.resolve(handlers.onError?.(error)).catch(reportErrorCallbackFailure);
67
- } catch (callbackError) {
68
- reportErrorCallbackFailure(callbackError);
69
- }
63
+ invokeCallbackSafely(() => handlers.onError?.(error), "MCP App onError");
70
64
  };
71
65
  const handleRequest = async (req) => {
72
66
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","names":["SandboxHostFrame","MCP_APP_PROTOCOL_VERSION","McpAppBridgeHandlers","McpAppDisplayMode","McpAppHostContext","McpAppHostInfo","McpAppJsonRpcMessage","McpAppJsonRpcNotification","McpAppJsonRpcRequest","McpAppJsonRpcResponse","isRecord","VALID_DISPLAY_MODES","const","McpAppBridgeFrame","CreateMcpAppBridgeOptions","frame","handlers","hostInfo","hostContext","McpAppBridge","onMessage","event","MessageEvent","dispose","notifyToolInput","input","notifyToolResult","result","notifyHostContextChanged","DEFAULT_HOST_INFO","name","version","METHOD_ALIASES","Record","normalizeMethod","method","JSONRPC_ERROR","parseError","invalidRequest","methodNotFound","invalidParams","internalError","isJsonRpcMessage","value","v","jsonrpc","isRequest","msg","isNotification","createMcpAppBridge","opts","post","sendMessage","respond","id","payload","error","code","message","data","res","errorResponse","undefined","reportErrorCallbackFailure","console","reportError","Error","Promise","resolve","onError","catch","callbackError","handleRequest","req","params","requestedProtocolVersion","protocolVersion","host","capabilities","tools","callTool","resources","readResource","listResources","ui","openLink","requestDisplayMode","updateModelContext","hostCapabilities","openLinks","serverTools","serverResources","text","onLog","logging","callParams","arguments","allowedTools","includes","callArgs","Array","isArray","readParams","uri","linkParams","url","linkProtocol","URL","protocol","modeParams","mode","err","String","handleNotification","note","onInitialized","p","width","height","onSizeChange","onRequestTeardown","content","type","ctx"],"sources":["../../src/mcp-apps/bridge.ts"],"sourcesContent":["import type { SandboxHostFrame } from \"../sandbox-host/SandboxHost\";\nimport {\n MCP_APP_PROTOCOL_VERSION,\n type McpAppBridgeHandlers,\n type McpAppDisplayMode,\n type McpAppHostContext,\n type McpAppHostInfo,\n type McpAppJsonRpcMessage,\n type McpAppJsonRpcNotification,\n type McpAppJsonRpcRequest,\n type McpAppJsonRpcResponse,\n} from \"./types\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\n\nconst VALID_DISPLAY_MODES = [\n \"inline\",\n \"fullscreen\",\n \"pip\",\n] as const satisfies readonly McpAppDisplayMode[];\n\nexport type McpAppBridgeFrame = SandboxHostFrame;\n\nexport type CreateMcpAppBridgeOptions = {\n frame: McpAppBridgeFrame;\n handlers?: McpAppBridgeHandlers | undefined;\n hostInfo?: McpAppHostInfo | undefined;\n hostContext?: McpAppHostContext | undefined;\n};\n\nexport type McpAppBridge = {\n onMessage: (event: MessageEvent) => void;\n dispose: () => void;\n notifyToolInput: (input: unknown) => void;\n notifyToolResult: (result: unknown) => void;\n notifyHostContextChanged: (hostContext: McpAppHostContext) => void;\n};\n\nconst DEFAULT_HOST_INFO: McpAppHostInfo = {\n name: \"assistant-ui\",\n version: \"0.1\",\n};\n\n// Accept both the legacy method names and the MCP-UI 2026-01-26 names that\n// `ui/*` capable widgets (e.g. xmcp's host-bridge) emit. Normalize on input\n// so downstream switch statements only need to know the legacy names.\nconst METHOD_ALIASES: Record<string, string> = {\n \"ui/notifications/initialized\": \"notifications/initialized\",\n \"ui/notifications/size-changed\": \"notifications/size_changed\",\n \"ui/request-display-mode\": \"requestDisplayMode\",\n \"ui/open-link\": \"openLink\",\n \"ui/update-model-context\": \"updateModelContext\",\n \"ui/message\": \"sendMessage\",\n \"notifications/message\": \"notifications/log\",\n};\n\nconst normalizeMethod = (method: string): string =>\n METHOD_ALIASES[method] ?? method;\n\nconst JSONRPC_ERROR = {\n parseError: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n internalError: -32603,\n} as const;\n\nfunction isJsonRpcMessage(value: unknown): value is McpAppJsonRpcMessage {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return v.jsonrpc === \"2.0\" && typeof v.method === \"string\";\n}\n\nfunction isRequest(msg: McpAppJsonRpcMessage): msg is McpAppJsonRpcRequest {\n return \"id\" in msg;\n}\n\nfunction isNotification(\n msg: McpAppJsonRpcMessage,\n): msg is McpAppJsonRpcNotification {\n return !(\"id\" in msg);\n}\n\nexport function createMcpAppBridge(\n opts: CreateMcpAppBridgeOptions,\n): McpAppBridge {\n const {\n frame,\n handlers = {},\n hostInfo = DEFAULT_HOST_INFO,\n hostContext = {},\n } = opts;\n\n const post = (msg: McpAppJsonRpcMessage) => {\n frame.sendMessage(msg);\n };\n\n const respond = (\n id: McpAppJsonRpcRequest[\"id\"],\n payload:\n | { result: unknown }\n | { error: { code: number; message: string; data?: unknown } },\n ) => {\n const res: McpAppJsonRpcResponse = {\n jsonrpc: \"2.0\",\n id,\n ...payload,\n };\n post(res);\n };\n\n const errorResponse = (\n id: McpAppJsonRpcRequest[\"id\"],\n code: number,\n message: string,\n data?: unknown,\n ) => {\n respond(id, {\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n });\n };\n\n const reportErrorCallbackFailure = (error: unknown) => {\n console.error(\n \"[assistant-ui] MCP App onError callback threw an error\",\n error,\n );\n };\n\n const reportError = (error: Error) => {\n try {\n void Promise.resolve(handlers.onError?.(error)).catch(\n reportErrorCallbackFailure,\n );\n } catch (callbackError) {\n reportErrorCallbackFailure(callbackError);\n }\n };\n\n const handleRequest = async (req: McpAppJsonRpcRequest) => {\n try {\n const params = req.params;\n\n switch (normalizeMethod(req.method)) {\n case \"ui/initialize\": {\n const requestedProtocolVersion =\n isRecord(params) && typeof params.protocolVersion === \"string\"\n ? params.protocolVersion\n : MCP_APP_PROTOCOL_VERSION;\n respond(req.id, {\n result: {\n protocolVersion: requestedProtocolVersion,\n host: hostInfo,\n hostInfo,\n hostContext,\n capabilities: {\n tools: handlers.callTool ? {} : undefined,\n resources:\n handlers.readResource || handlers.listResources\n ? {}\n : undefined,\n ui: {\n sendMessage: !!handlers.sendMessage,\n openLink: !!handlers.openLink,\n requestDisplayMode: !!handlers.requestDisplayMode,\n updateModelContext: !!handlers.updateModelContext,\n },\n },\n hostCapabilities: {\n ...(handlers.openLink ? { openLinks: {} } : {}),\n ...(handlers.callTool ? { serverTools: {} } : {}),\n ...(handlers.readResource || handlers.listResources\n ? { serverResources: {} }\n : {}),\n ...(handlers.updateModelContext\n ? { updateModelContext: { text: {} } }\n : {}),\n ...(handlers.sendMessage ? { message: { text: {} } } : {}),\n ...(handlers.onLog ? { logging: {} } : {}),\n },\n },\n });\n return;\n }\n\n case \"tools/call\": {\n if (!handlers.callTool) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"tools/call is not supported by this host\",\n );\n return;\n }\n const callParams = (params ?? {}) as {\n name?: unknown;\n arguments?: unknown;\n };\n if (typeof callParams.name !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call requires a string 'name'\",\n );\n return;\n }\n if (\n handlers.allowedTools &&\n !handlers.allowedTools.includes(callParams.name)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n `tool '${callParams.name}' is not allowed for this app`,\n );\n return;\n }\n let callArgs: Record<string, unknown> | undefined;\n if (callParams.arguments !== undefined) {\n if (\n callParams.arguments === null ||\n typeof callParams.arguments !== \"object\" ||\n Array.isArray(callParams.arguments)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call 'arguments' must be an object\",\n );\n return;\n }\n callArgs = callParams.arguments as Record<string, unknown>;\n }\n const result = await handlers.callTool({\n name: callParams.name,\n ...(callArgs !== undefined ? { arguments: callArgs } : {}),\n });\n respond(req.id, { result });\n return;\n }\n\n case \"resources/read\": {\n if (!handlers.readResource) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/read is not supported by this host\",\n );\n return;\n }\n const readParams = (params ?? {}) as { uri?: unknown };\n if (typeof readParams.uri !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"resources/read requires a string 'uri'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.readResource({ uri: readParams.uri }),\n });\n return;\n }\n\n case \"resources/list\": {\n if (!handlers.listResources) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/list is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.listResources(params)) ?? null,\n });\n return;\n }\n\n case \"openLink\": {\n if (!handlers.openLink) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"openLink is not supported by this host\",\n );\n return;\n }\n const linkParams = (params ?? {}) as { url?: unknown };\n if (typeof linkParams.url !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a string 'url'\",\n );\n return;\n }\n let linkProtocol: string;\n try {\n linkProtocol = new URL(linkParams.url).protocol;\n } catch {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a valid URL\",\n );\n return;\n }\n if (linkProtocol !== \"https:\" && linkProtocol !== \"http:\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink only accepts http(s) URLs\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.openLink({ url: linkParams.url }),\n });\n return;\n }\n\n case \"sendMessage\": {\n if (!handlers.sendMessage) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"sendMessage is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.sendMessage(params)) ?? null,\n });\n return;\n }\n\n case \"updateModelContext\": {\n if (!handlers.updateModelContext) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"updateModelContext is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.updateModelContext(params)) ?? null,\n });\n return;\n }\n\n case \"requestDisplayMode\": {\n if (!handlers.requestDisplayMode) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"requestDisplayMode is not supported by this host\",\n );\n return;\n }\n const modeParams = (params ?? {}) as { mode?: unknown };\n if (\n typeof modeParams.mode !== \"string\" ||\n !VALID_DISPLAY_MODES.includes(modeParams.mode as McpAppDisplayMode)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"requestDisplayMode requires a valid 'mode'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.requestDisplayMode({\n mode: modeParams.mode as McpAppDisplayMode,\n }),\n });\n return;\n }\n\n default: {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n `Unknown method: ${req.method}`,\n );\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n errorResponse(req.id, JSONRPC_ERROR.internalError, error.message);\n }\n };\n\n const handleNotification = (note: McpAppJsonRpcNotification) => {\n try {\n switch (normalizeMethod(note.method)) {\n case \"notifications/initialized\": {\n handlers.onInitialized?.();\n return;\n }\n case \"notifications/size_changed\": {\n const p = (note.params ?? {}) as { width?: number; height?: number };\n handlers.onSizeChange?.({\n ...(typeof p.width === \"number\" ? { width: p.width } : {}),\n ...(typeof p.height === \"number\" ? { height: p.height } : {}),\n });\n return;\n }\n case \"notifications/log\": {\n handlers.onLog?.(note.params);\n return;\n }\n case \"notifications/request_teardown\": {\n handlers.onRequestTeardown?.(note.params);\n return;\n }\n case \"notifications/error\": {\n const p = (note.params ?? {}) as { message?: string };\n reportError(\n new Error(\n typeof p.message === \"string\" ? p.message : \"Widget error\",\n ),\n );\n return;\n }\n default:\n return;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n }\n };\n\n // The host applies the cross-origin guard before delegating; this only\n // validates the JSON-RPC envelope.\n const onMessage = (event: MessageEvent) => {\n if (!isJsonRpcMessage(event.data)) return;\n\n const msg = event.data;\n if (isRequest(msg)) {\n void handleRequest(msg);\n } else if (isNotification(msg)) {\n handleNotification(msg);\n }\n };\n\n return {\n onMessage,\n dispose: () => {},\n notifyToolInput: (input: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/input\",\n params: { input },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-input\",\n params: isRecord(input) ? { arguments: input } : {},\n });\n },\n notifyToolResult: (result: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/result\",\n params: { result },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-result\",\n params: isRecord(result)\n ? result\n : { content: [{ type: \"text\", text: String(result) }] },\n });\n },\n notifyHostContextChanged: (ctx: McpAppHostContext) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/host_context/changed\",\n params: ctx,\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/host-context-changed\",\n params: ctx,\n });\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","names":["SandboxHostFrame","invokeCallbackSafely","MCP_APP_PROTOCOL_VERSION","McpAppBridgeHandlers","McpAppDisplayMode","McpAppHostContext","McpAppHostInfo","McpAppJsonRpcMessage","McpAppJsonRpcNotification","McpAppJsonRpcRequest","McpAppJsonRpcResponse","isRecord","VALID_DISPLAY_MODES","const","McpAppBridgeFrame","CreateMcpAppBridgeOptions","frame","handlers","hostInfo","hostContext","McpAppBridge","onMessage","event","MessageEvent","dispose","notifyToolInput","input","notifyToolResult","result","notifyHostContextChanged","DEFAULT_HOST_INFO","name","version","METHOD_ALIASES","Record","normalizeMethod","method","JSONRPC_ERROR","parseError","invalidRequest","methodNotFound","invalidParams","internalError","isJsonRpcMessage","value","v","jsonrpc","isRequest","msg","isNotification","createMcpAppBridge","opts","post","sendMessage","respond","id","payload","error","code","message","data","res","errorResponse","undefined","reportError","Error","onError","handleRequest","req","params","requestedProtocolVersion","protocolVersion","host","capabilities","tools","callTool","resources","readResource","listResources","ui","openLink","requestDisplayMode","updateModelContext","hostCapabilities","openLinks","serverTools","serverResources","text","onLog","logging","callParams","arguments","allowedTools","includes","callArgs","Array","isArray","readParams","uri","linkParams","url","linkProtocol","URL","protocol","modeParams","mode","err","String","handleNotification","note","onInitialized","p","width","height","onSizeChange","onRequestTeardown","content","type","ctx"],"sources":["../../src/mcp-apps/bridge.ts"],"sourcesContent":["import type { SandboxHostFrame } from \"../sandbox-host/SandboxHost\";\nimport { invokeCallbackSafely } from \"../utils/invokeCallbackSafely\";\nimport {\n MCP_APP_PROTOCOL_VERSION,\n type McpAppBridgeHandlers,\n type McpAppDisplayMode,\n type McpAppHostContext,\n type McpAppHostInfo,\n type McpAppJsonRpcMessage,\n type McpAppJsonRpcNotification,\n type McpAppJsonRpcRequest,\n type McpAppJsonRpcResponse,\n} from \"./types\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\n\nconst VALID_DISPLAY_MODES = [\n \"inline\",\n \"fullscreen\",\n \"pip\",\n] as const satisfies readonly McpAppDisplayMode[];\n\nexport type McpAppBridgeFrame = SandboxHostFrame;\n\nexport type CreateMcpAppBridgeOptions = {\n frame: McpAppBridgeFrame;\n handlers?: McpAppBridgeHandlers | undefined;\n hostInfo?: McpAppHostInfo | undefined;\n hostContext?: McpAppHostContext | undefined;\n};\n\nexport type McpAppBridge = {\n onMessage: (event: MessageEvent) => void;\n dispose: () => void;\n notifyToolInput: (input: unknown) => void;\n notifyToolResult: (result: unknown) => void;\n notifyHostContextChanged: (hostContext: McpAppHostContext) => void;\n};\n\nconst DEFAULT_HOST_INFO: McpAppHostInfo = {\n name: \"assistant-ui\",\n version: \"0.1\",\n};\n\n// Accept both the legacy method names and the MCP-UI 2026-01-26 names that\n// `ui/*` capable widgets (e.g. xmcp's host-bridge) emit. Normalize on input\n// so downstream switch statements only need to know the legacy names.\nconst METHOD_ALIASES: Record<string, string> = {\n \"ui/notifications/initialized\": \"notifications/initialized\",\n \"ui/notifications/size-changed\": \"notifications/size_changed\",\n \"ui/request-display-mode\": \"requestDisplayMode\",\n \"ui/open-link\": \"openLink\",\n \"ui/update-model-context\": \"updateModelContext\",\n \"ui/message\": \"sendMessage\",\n \"notifications/message\": \"notifications/log\",\n};\n\nconst normalizeMethod = (method: string): string =>\n METHOD_ALIASES[method] ?? method;\n\nconst JSONRPC_ERROR = {\n parseError: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n internalError: -32603,\n} as const;\n\nfunction isJsonRpcMessage(value: unknown): value is McpAppJsonRpcMessage {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return v.jsonrpc === \"2.0\" && typeof v.method === \"string\";\n}\n\nfunction isRequest(msg: McpAppJsonRpcMessage): msg is McpAppJsonRpcRequest {\n return \"id\" in msg;\n}\n\nfunction isNotification(\n msg: McpAppJsonRpcMessage,\n): msg is McpAppJsonRpcNotification {\n return !(\"id\" in msg);\n}\n\nexport function createMcpAppBridge(\n opts: CreateMcpAppBridgeOptions,\n): McpAppBridge {\n const {\n frame,\n handlers = {},\n hostInfo = DEFAULT_HOST_INFO,\n hostContext = {},\n } = opts;\n\n const post = (msg: McpAppJsonRpcMessage) => {\n frame.sendMessage(msg);\n };\n\n const respond = (\n id: McpAppJsonRpcRequest[\"id\"],\n payload:\n | { result: unknown }\n | { error: { code: number; message: string; data?: unknown } },\n ) => {\n const res: McpAppJsonRpcResponse = {\n jsonrpc: \"2.0\",\n id,\n ...payload,\n };\n post(res);\n };\n\n const errorResponse = (\n id: McpAppJsonRpcRequest[\"id\"],\n code: number,\n message: string,\n data?: unknown,\n ) => {\n respond(id, {\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n });\n };\n\n const reportError = (error: Error) => {\n invokeCallbackSafely(() => handlers.onError?.(error), \"MCP App onError\");\n };\n\n const handleRequest = async (req: McpAppJsonRpcRequest) => {\n try {\n const params = req.params;\n\n switch (normalizeMethod(req.method)) {\n case \"ui/initialize\": {\n const requestedProtocolVersion =\n isRecord(params) && typeof params.protocolVersion === \"string\"\n ? params.protocolVersion\n : MCP_APP_PROTOCOL_VERSION;\n respond(req.id, {\n result: {\n protocolVersion: requestedProtocolVersion,\n host: hostInfo,\n hostInfo,\n hostContext,\n capabilities: {\n tools: handlers.callTool ? {} : undefined,\n resources:\n handlers.readResource || handlers.listResources\n ? {}\n : undefined,\n ui: {\n sendMessage: !!handlers.sendMessage,\n openLink: !!handlers.openLink,\n requestDisplayMode: !!handlers.requestDisplayMode,\n updateModelContext: !!handlers.updateModelContext,\n },\n },\n hostCapabilities: {\n ...(handlers.openLink ? { openLinks: {} } : {}),\n ...(handlers.callTool ? { serverTools: {} } : {}),\n ...(handlers.readResource || handlers.listResources\n ? { serverResources: {} }\n : {}),\n ...(handlers.updateModelContext\n ? { updateModelContext: { text: {} } }\n : {}),\n ...(handlers.sendMessage ? { message: { text: {} } } : {}),\n ...(handlers.onLog ? { logging: {} } : {}),\n },\n },\n });\n return;\n }\n\n case \"tools/call\": {\n if (!handlers.callTool) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"tools/call is not supported by this host\",\n );\n return;\n }\n const callParams = (params ?? {}) as {\n name?: unknown;\n arguments?: unknown;\n };\n if (typeof callParams.name !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call requires a string 'name'\",\n );\n return;\n }\n if (\n handlers.allowedTools &&\n !handlers.allowedTools.includes(callParams.name)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n `tool '${callParams.name}' is not allowed for this app`,\n );\n return;\n }\n let callArgs: Record<string, unknown> | undefined;\n if (callParams.arguments !== undefined) {\n if (\n callParams.arguments === null ||\n typeof callParams.arguments !== \"object\" ||\n Array.isArray(callParams.arguments)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call 'arguments' must be an object\",\n );\n return;\n }\n callArgs = callParams.arguments as Record<string, unknown>;\n }\n const result = await handlers.callTool({\n name: callParams.name,\n ...(callArgs !== undefined ? { arguments: callArgs } : {}),\n });\n respond(req.id, { result });\n return;\n }\n\n case \"resources/read\": {\n if (!handlers.readResource) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/read is not supported by this host\",\n );\n return;\n }\n const readParams = (params ?? {}) as { uri?: unknown };\n if (typeof readParams.uri !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"resources/read requires a string 'uri'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.readResource({ uri: readParams.uri }),\n });\n return;\n }\n\n case \"resources/list\": {\n if (!handlers.listResources) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/list is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.listResources(params)) ?? null,\n });\n return;\n }\n\n case \"openLink\": {\n if (!handlers.openLink) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"openLink is not supported by this host\",\n );\n return;\n }\n const linkParams = (params ?? {}) as { url?: unknown };\n if (typeof linkParams.url !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a string 'url'\",\n );\n return;\n }\n let linkProtocol: string;\n try {\n linkProtocol = new URL(linkParams.url).protocol;\n } catch {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a valid URL\",\n );\n return;\n }\n if (linkProtocol !== \"https:\" && linkProtocol !== \"http:\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink only accepts http(s) URLs\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.openLink({ url: linkParams.url }),\n });\n return;\n }\n\n case \"sendMessage\": {\n if (!handlers.sendMessage) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"sendMessage is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.sendMessage(params)) ?? null,\n });\n return;\n }\n\n case \"updateModelContext\": {\n if (!handlers.updateModelContext) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"updateModelContext is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.updateModelContext(params)) ?? null,\n });\n return;\n }\n\n case \"requestDisplayMode\": {\n if (!handlers.requestDisplayMode) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"requestDisplayMode is not supported by this host\",\n );\n return;\n }\n const modeParams = (params ?? {}) as { mode?: unknown };\n if (\n typeof modeParams.mode !== \"string\" ||\n !VALID_DISPLAY_MODES.includes(modeParams.mode as McpAppDisplayMode)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"requestDisplayMode requires a valid 'mode'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.requestDisplayMode({\n mode: modeParams.mode as McpAppDisplayMode,\n }),\n });\n return;\n }\n\n default: {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n `Unknown method: ${req.method}`,\n );\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n errorResponse(req.id, JSONRPC_ERROR.internalError, error.message);\n }\n };\n\n const handleNotification = (note: McpAppJsonRpcNotification) => {\n try {\n switch (normalizeMethod(note.method)) {\n case \"notifications/initialized\": {\n handlers.onInitialized?.();\n return;\n }\n case \"notifications/size_changed\": {\n const p = (note.params ?? {}) as { width?: number; height?: number };\n handlers.onSizeChange?.({\n ...(typeof p.width === \"number\" ? { width: p.width } : {}),\n ...(typeof p.height === \"number\" ? { height: p.height } : {}),\n });\n return;\n }\n case \"notifications/log\": {\n handlers.onLog?.(note.params);\n return;\n }\n case \"notifications/request_teardown\": {\n handlers.onRequestTeardown?.(note.params);\n return;\n }\n case \"notifications/error\": {\n const p = (note.params ?? {}) as { message?: string };\n reportError(\n new Error(\n typeof p.message === \"string\" ? p.message : \"Widget error\",\n ),\n );\n return;\n }\n default:\n return;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n }\n };\n\n // The host applies the cross-origin guard before delegating; this only\n // validates the JSON-RPC envelope.\n const onMessage = (event: MessageEvent) => {\n if (!isJsonRpcMessage(event.data)) return;\n\n const msg = event.data;\n if (isRequest(msg)) {\n void handleRequest(msg);\n } else if (isNotification(msg)) {\n handleNotification(msg);\n }\n };\n\n return {\n onMessage,\n dispose: () => {},\n notifyToolInput: (input: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/input\",\n params: { input },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-input\",\n params: isRecord(input) ? { arguments: input } : {},\n });\n },\n notifyToolResult: (result: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/result\",\n params: { result },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-result\",\n params: isRecord(result)\n ? result\n : { content: [{ type: \"text\", text: String(result) }] },\n });\n },\n notifyHostContextChanged: (ctx: McpAppHostContext) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/host_context/changed\",\n params: ctx,\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/host-context-changed\",\n params: ctx,\n });\n },\n };\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { McpAppDisplayMode, McpAppHostContext, McpAppHostInfo, McpAppMetadata, McpAppResource, McpAppResourceCSP, McpAppResourceMeta, McpAppSandboxConfig, McpAppToolCallParams, McpAppsHost, McpAppsRemoteHostOptions, ToolCallMessagePartMcpMetadata } from "./types.js";
1
+ import { McpAppBridgeHandlers, McpAppDisplayMode, McpAppHostContext, McpAppHostInfo, McpAppMetadata, McpAppResource, McpAppResourceCSP, McpAppResourceMeta, McpAppSandboxConfig, McpAppToolCallParams, McpAppsHost, McpAppsRemoteHostOptions, ToolCallMessagePartMcpMetadata } from "./types.js";
2
2
  import { McpAppRenderer, McpAppRendererOptions } from "./McpAppRenderer.js";
3
3
  import { McpAppsRemoteHost } from "./McpAppsRemoteHost.js";
4
4
  import { getMcpAppFromToolPart } from "./utils.js";
5
- export { type McpAppDisplayMode, type McpAppHostContext, type McpAppHostInfo, type McpAppMetadata, McpAppRenderer, type McpAppRendererOptions, type McpAppResource, type McpAppResourceCSP, type McpAppResourceMeta, type McpAppSandboxConfig, type McpAppToolCallParams, type McpAppsHost, McpAppsRemoteHost, type McpAppsRemoteHostOptions, type ToolCallMessagePartMcpMetadata, getMcpAppFromToolPart };
5
+ export { type McpAppBridgeHandlers, type McpAppDisplayMode, type McpAppHostContext, type McpAppHostInfo, type McpAppMetadata, McpAppRenderer, type McpAppRendererOptions, type McpAppResource, type McpAppResourceCSP, type McpAppResourceMeta, type McpAppSandboxConfig, type McpAppToolCallParams, type McpAppsHost, McpAppsRemoteHost, type McpAppsRemoteHostOptions, type ToolCallMessagePartMcpMetadata, getMcpAppFromToolPart };
@@ -16,7 +16,7 @@ type UseAssistantFrameHostOptions = {
16
16
  *
17
17
  * useAssistantFrameHost({
18
18
  * iframeRef,
19
- * targetOrigin: "https://trusted-domain.com", // optional
19
+ * targetOrigin: "https://trusted-domain.com",
20
20
  * });
21
21
  *
22
22
  * return <iframe ref={iframeRef} src="..." />;
@@ -13,7 +13,7 @@ import { useEffect } from "@assistant-ui/tap/react-shim";
13
13
  *
14
14
  * useAssistantFrameHost({
15
15
  * iframeRef,
16
- * targetOrigin: "https://trusted-domain.com", // optional
16
+ * targetOrigin: "https://trusted-domain.com",
17
17
  * });
18
18
  *
19
19
  * return <iframe ref={iframeRef} src="..." />;
@@ -22,12 +22,11 @@ import { useEffect } from "@assistant-ui/tap/react-shim";
22
22
  */
23
23
  const useAssistantFrameHost = (t0) => {
24
24
  const $ = c(5);
25
- const { iframeRef, targetOrigin: t1, register } = t0;
26
- const targetOrigin = t1 === void 0 ? "*" : t1;
25
+ const { iframeRef, targetOrigin, register } = t0;
26
+ let t1;
27
27
  let t2;
28
- let t3;
29
28
  if ($[0] !== iframeRef || $[1] !== register || $[2] !== targetOrigin) {
30
- t2 = () => {
29
+ t1 = () => {
31
30
  const iframeWindow = iframeRef.current?.contentWindow;
32
31
  if (!iframeWindow) return;
33
32
  const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);
@@ -37,7 +36,7 @@ const useAssistantFrameHost = (t0) => {
37
36
  unsubscribe();
38
37
  };
39
38
  };
40
- t3 = [
39
+ t2 = [
41
40
  iframeRef,
42
41
  targetOrigin,
43
42
  register
@@ -45,13 +44,13 @@ const useAssistantFrameHost = (t0) => {
45
44
  $[0] = iframeRef;
46
45
  $[1] = register;
47
46
  $[2] = targetOrigin;
48
- $[3] = t2;
49
- $[4] = t3;
47
+ $[3] = t1;
48
+ $[4] = t2;
50
49
  } else {
51
- t2 = $[3];
52
- t3 = $[4];
50
+ t1 = $[3];
51
+ t2 = $[4];
53
52
  }
54
- useEffect(t2, t3);
53
+ useEffect(t1, t2);
55
54
  };
56
55
  //#endregion
57
56
  export { useAssistantFrameHost };
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantFrameHost.js","names":["c","_c","Unsubscribe","useEffect","RefObject","AssistantFrameHost","UseAssistantFrameHostOptions","iframeRef","Readonly","HTMLIFrameElement","targetOrigin","register","frameHost","useAssistantFrameHost","t0","$","t1","undefined","t2","t3","iframeWindow","current","contentWindow","unsubscribe","dispose"],"sources":["../../../src/model-context/frame/useAssistantFrameHost.ts"],"sourcesContent":["\"use client\";\n\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { useEffect, type RefObject } from \"react\";\nimport { AssistantFrameHost } from \"@assistant-ui/core\";\n\ntype UseAssistantFrameHostOptions = {\n iframeRef: Readonly<RefObject<HTMLIFrameElement | null | undefined>>;\n targetOrigin?: string;\n register: (frameHost: AssistantFrameHost) => Unsubscribe;\n};\n\n/**\n * React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.\n *\n * Usage example:\n * ```typescript\n * function MyComponent() {\n * const iframeRef = useRef<HTMLIFrameElement>(null);\n *\n * useAssistantFrameHost({\n * iframeRef,\n * targetOrigin: \"https://trusted-domain.com\", // optional\n * });\n *\n * return <iframe ref={iframeRef} src=\"...\" />;\n * }\n * ```\n */\nexport const useAssistantFrameHost = ({\n iframeRef,\n targetOrigin = \"*\",\n register,\n}: UseAssistantFrameHostOptions): void => {\n useEffect(() => {\n const iframeWindow = iframeRef.current?.contentWindow;\n if (!iframeWindow) return;\n\n const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);\n\n const unsubscribe = register(frameHost);\n\n return () => {\n frameHost.dispose();\n unsubscribe();\n };\n }, [iframeRef, targetOrigin, register]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAaa,yBAAwBC,OAAA;CAAA,MAAAC,IAAAd,EAAA,CAAA;CAAC,MAAA,EAAAM,WAAAG,cAAAM,IAAAL,aAAAG;CAEpC,MAAAJ,eAAAM,OAAAC,KAAAA,IAAA,MAAAD;CAAkB,IAAAE;CAAA,IAAAC;CAAA,IAAAJ,EAAA,OAAAR,aAAAQ,EAAA,OAAAJ,YAAAI,EAAA,OAAAL,cAAA;EAGRQ,WAAA;GACR,MAAAE,eAAqBb,UAASc,SAAuBC;GACrD,IAAI,CAACF,cAAY;GAEjB,MAAAR,YAAkB,IAAIP,mBAAmBe,cAAcV,YAAY;GAEnE,MAAAa,cAAoBZ,SAASC,SAAS;GAAE,aAEjC;IACLA,UAASY,QAAS;IAClBD,YAAY;GAAC;EACd;EACAJ,KAAA;GAACZ;GAAWG;GAAcC;EAAQ;EAACI,EAAA,KAAAR;EAAAQ,EAAA,KAAAJ;EAAAI,EAAA,KAAAL;EAAAK,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAA;EAAAD,KAAAH,EAAA;EAAAI,KAAAJ,EAAA;CAAA;CAZtCZ,UAAUe,IAYPC,EAAmC;AAAC"}
1
+ {"version":3,"file":"useAssistantFrameHost.js","names":["c","_c","Unsubscribe","useEffect","RefObject","AssistantFrameHost","UseAssistantFrameHostOptions","iframeRef","Readonly","HTMLIFrameElement","targetOrigin","register","frameHost","useAssistantFrameHost","t0","$","t1","t2","iframeWindow","current","contentWindow","unsubscribe","dispose"],"sources":["../../../src/model-context/frame/useAssistantFrameHost.ts"],"sourcesContent":["\"use client\";\n\nimport type { Unsubscribe } from \"@assistant-ui/core\";\nimport { useEffect, type RefObject } from \"react\";\nimport { AssistantFrameHost } from \"@assistant-ui/core\";\n\ntype UseAssistantFrameHostOptions = {\n iframeRef: Readonly<RefObject<HTMLIFrameElement | null | undefined>>;\n targetOrigin?: string;\n register: (frameHost: AssistantFrameHost) => Unsubscribe;\n};\n\n/**\n * React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.\n *\n * Usage example:\n * ```typescript\n * function MyComponent() {\n * const iframeRef = useRef<HTMLIFrameElement>(null);\n *\n * useAssistantFrameHost({\n * iframeRef,\n * targetOrigin: \"https://trusted-domain.com\",\n * });\n *\n * return <iframe ref={iframeRef} src=\"...\" />;\n * }\n * ```\n */\nexport const useAssistantFrameHost = ({\n iframeRef,\n targetOrigin,\n register,\n}: UseAssistantFrameHostOptions): void => {\n useEffect(() => {\n const iframeWindow = iframeRef.current?.contentWindow;\n if (!iframeWindow) return;\n\n const frameHost = new AssistantFrameHost(iframeWindow, targetOrigin);\n\n const unsubscribe = register(frameHost);\n\n return () => {\n frameHost.dispose();\n unsubscribe();\n };\n }, [iframeRef, targetOrigin, register]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAaa,yBAAwBC,OAAA;CAAA,MAAAC,IAAAd,EAAA,CAAA;CAAC,MAAA,EAAAM,WAAAG,cAAAC,aAAAG;CAIP,IAAAE;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAR,aAAAQ,EAAA,OAAAJ,YAAAI,EAAA,OAAAL,cAAA;EACnBM,WAAA;GACR,MAAAE,eAAqBX,UAASY,SAAuBC;GACrD,IAAI,CAACF,cAAY;GAEjB,MAAAN,YAAkB,IAAIP,mBAAmBa,cAAcR,YAAY;GAEnE,MAAAW,cAAoBV,SAASC,SAAS;GAAE,aAEjC;IACLA,UAASU,QAAS;IAClBD,YAAY;GAAC;EACd;EACAJ,KAAA;GAACV;GAAWG;GAAcC;EAAQ;EAACI,EAAA,KAAAR;EAAAQ,EAAA,KAAAJ;EAAAI,EAAA,KAAAL;EAAAK,EAAA,KAAAC;EAAAD,EAAA,KAAAE;CAAA,OAAA;EAAAD,KAAAD,EAAA;EAAAE,KAAAF,EAAA;CAAA;CAZtCZ,UAAUa,IAYPC,EAAmC;AAAC"}