@assistant-ui/react 0.15.25 → 0.15.27

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 (159) hide show
  1. package/dist/hooks/useToolCallElapsed.d.ts.map +1 -1
  2. package/dist/hooks/useToolCallElapsed.js +3 -2
  3. package/dist/hooks/useToolCallElapsed.js.map +1 -1
  4. package/dist/index.d.ts +31 -5
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  7. package/dist/mcp-apps/McpAppRenderer.js +3 -2
  8. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  9. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  10. package/dist/mcp-apps/app-frame.js +58 -48
  11. package/dist/mcp-apps/app-frame.js.map +1 -1
  12. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  13. package/dist/mcp-apps/bridge.js +28 -3
  14. package/dist/mcp-apps/bridge.js.map +1 -1
  15. package/dist/mcp-apps/csp.d.ts +4 -0
  16. package/dist/mcp-apps/csp.d.ts.map +1 -0
  17. package/dist/mcp-apps/csp.js +93 -0
  18. package/dist/mcp-apps/csp.js.map +1 -0
  19. package/dist/mcp-apps/index.d.ts +1 -1
  20. package/dist/mcp-apps/index.d.ts.map +1 -1
  21. package/dist/mcp-apps/types.d.ts +19 -1
  22. package/dist/mcp-apps/types.d.ts.map +1 -1
  23. package/dist/mcp-apps/types.js.map +1 -1
  24. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts +1 -0
  25. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts.map +1 -1
  26. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  27. package/dist/primitives/attachment.d.ts +3 -1
  28. package/dist/primitives/attachment.d.ts.map +1 -1
  29. package/dist/primitives/attachment.js.map +1 -1
  30. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  31. package/dist/primitives/composer/ComposerAttachmentDropzone.js +14 -12
  32. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  33. package/dist/primitives/composer/ComposerCancel.d.ts +5 -1
  34. package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
  35. package/dist/primitives/composer/ComposerCancel.js +14 -1
  36. package/dist/primitives/composer/ComposerCancel.js.map +1 -1
  37. package/dist/primitives/composer/ComposerInput.d.ts +14 -0
  38. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  39. package/dist/primitives/composer/ComposerInput.js +4 -3
  40. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  41. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  42. package/dist/primitives/composer/ComposerRoot.js +24 -19
  43. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  44. package/dist/primitives/composer/composerInputSelector.d.ts +3 -0
  45. package/dist/primitives/composer/composerInputSelector.d.ts.map +1 -0
  46. package/dist/primitives/composer/composerInputSelector.js +7 -0
  47. package/dist/primitives/composer/composerInputSelector.js.map +1 -0
  48. package/dist/primitives/composer/useComposerCancelWithFocus.d.ts +2 -0
  49. package/dist/primitives/composer/useComposerCancelWithFocus.d.ts.map +1 -0
  50. package/dist/primitives/composer/useComposerCancelWithFocus.js +42 -0
  51. package/dist/primitives/composer/useComposerCancelWithFocus.js.map +1 -0
  52. package/dist/primitives/composer.d.ts +35 -14
  53. package/dist/primitives/composer.d.ts.map +1 -1
  54. package/dist/primitives/composer.js.map +1 -1
  55. package/dist/primitives/message/MessagePartsGrouped.d.ts +8 -1
  56. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  57. package/dist/primitives/message/MessagePartsGrouped.js +58 -278
  58. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  59. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts.map +1 -1
  60. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +5 -2
  61. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  62. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  63. package/dist/primitives/thread/ThreadViewport.js +4 -3
  64. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  65. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +2 -2
  66. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -1
  67. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  68. package/dist/primitives/thread/useThreadViewportAutoScroll.js +90 -21
  69. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  70. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  71. package/dist/sandbox-host/SandboxHost.js +3 -2
  72. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  73. package/dist/unstable/useComposerInput.d.ts +9 -4
  74. package/dist/unstable/useComposerInput.d.ts.map +1 -1
  75. package/dist/unstable/useComposerInput.js +6 -4
  76. package/dist/unstable/useComposerInput.js.map +1 -1
  77. package/dist/unstable/useComposerInputHistory.d.ts +3 -2
  78. package/dist/unstable/useComposerInputHistory.d.ts.map +1 -1
  79. package/dist/unstable/useComposerInputHistory.js +2 -2
  80. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  81. package/dist/unstable/useLiveCompletionAdapter.d.ts +3 -2
  82. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  83. package/dist/unstable/useLiveCompletionAdapter.js +8 -7
  84. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
  85. package/dist/unstable/useMentionAdapter.d.ts +12 -3
  86. package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
  87. package/dist/unstable/useMentionAdapter.js +2 -2
  88. package/dist/unstable/useMentionAdapter.js.map +1 -1
  89. package/dist/unstable/useMessageStallDetection.d.ts +4 -2
  90. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -1
  91. package/dist/unstable/useMessageStallDetection.js +2 -2
  92. package/dist/unstable/useMessageStallDetection.js.map +1 -1
  93. package/dist/unstable/useSlashCommandAdapter.d.ts +5 -2
  94. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  95. package/dist/unstable/useSlashCommandAdapter.js +5 -4
  96. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  97. package/dist/unstable/webmcp/useWebMcpProvider.d.ts +4 -0
  98. package/dist/unstable/webmcp/useWebMcpProvider.d.ts.map +1 -1
  99. package/dist/unstable/webmcp/useWebMcpProvider.js +2 -0
  100. package/dist/unstable/webmcp/useWebMcpProvider.js.map +1 -1
  101. package/dist/utils/getSelectionMessageId.d.ts.map +1 -1
  102. package/dist/utils/getSelectionMessageId.js +31 -8
  103. package/dist/utils/getSelectionMessageId.js.map +1 -1
  104. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  105. package/dist/utils/hooks/useOnResizeContent.js +2 -22
  106. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  107. package/dist/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  108. package/dist/utils/useIsomorphicLayoutEffect.d.ts.map +1 -0
  109. package/dist/utils/useIsomorphicLayoutEffect.js +6 -0
  110. package/dist/utils/useIsomorphicLayoutEffect.js.map +1 -0
  111. package/package.json +10 -10
  112. package/src/hooks/useToolCallElapsed.test.tsx +4 -2
  113. package/src/hooks/useToolCallElapsed.ts +3 -2
  114. package/src/index.ts +20 -2
  115. package/src/mcp-apps/McpAppRenderer.test.tsx +7 -2
  116. package/src/mcp-apps/McpAppRenderer.tsx +3 -9
  117. package/src/mcp-apps/app-frame.test.tsx +102 -6
  118. package/src/mcp-apps/app-frame.tsx +7 -10
  119. package/src/mcp-apps/bridge.test.ts +154 -0
  120. package/src/mcp-apps/bridge.ts +51 -9
  121. package/src/mcp-apps/csp.test.ts +112 -0
  122. package/src/mcp-apps/csp.ts +124 -0
  123. package/src/mcp-apps/index.ts +1 -0
  124. package/src/mcp-apps/types.ts +16 -1
  125. package/src/model-context/frame/AssistantFrame.test.ts +45 -0
  126. package/src/model-context/frame/SPEC_AssistantFrame.md +1 -0
  127. package/src/primitives/assistantModal/AssistantModalRoot.tsx +1 -0
  128. package/src/primitives/attachment.ts +4 -1
  129. package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +32 -1
  130. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +14 -12
  131. package/src/primitives/composer/ComposerCancel.focus.test.tsx +307 -0
  132. package/src/primitives/composer/ComposerCancel.ts +8 -1
  133. package/src/primitives/composer/ComposerDisabledThread.test.tsx +121 -0
  134. package/src/primitives/composer/ComposerInput.tsx +19 -1
  135. package/src/primitives/composer/ComposerRoot.tsx +6 -5
  136. package/src/primitives/composer/composerInputSelector.ts +4 -0
  137. package/src/primitives/composer/useComposerCancelWithFocus.ts +57 -0
  138. package/src/primitives/composer.ts +56 -21
  139. package/src/primitives/message/MessagePartsGrouped.test.tsx +106 -2
  140. package/src/primitives/message/MessagePartsGrouped.tsx +36 -134
  141. package/src/primitives/selectionToolbar/SelectionToolbarRoot.test.tsx +20 -12
  142. package/src/primitives/selectionToolbar/SelectionToolbarRoot.tsx +6 -2
  143. package/src/primitives/thread/ThreadViewport.tsx +3 -3
  144. package/src/primitives/thread/topAnchor/useTopAnchorReserve.ts +2 -2
  145. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +666 -63
  146. package/src/primitives/thread/useThreadViewportAutoScroll.ts +201 -73
  147. package/src/sandbox-host/SandboxHost.tsx +3 -8
  148. package/src/unstable/useComposerInput.ts +9 -4
  149. package/src/unstable/useComposerInputHistory.ts +3 -2
  150. package/src/unstable/useLiveCompletionAdapter.ts +9 -14
  151. package/src/unstable/useMentionAdapter.ts +12 -3
  152. package/src/unstable/useMessageStallDetection.ts +4 -2
  153. package/src/unstable/useSlashCommandAdapter.ts +8 -4
  154. package/src/unstable/webmcp/useWebMcpProvider.ts +4 -0
  155. package/src/utils/getSelectionMessageId.test.ts +231 -0
  156. package/src/utils/getSelectionMessageId.ts +45 -7
  157. package/src/utils/hooks/useOnResizeContent.ts +2 -29
  158. package/src/utils/useIsomorphicLayoutEffect.test.tsx +21 -0
  159. package/src/utils/useIsomorphicLayoutEffect.ts +9 -0
@@ -6,6 +6,29 @@ const VALID_DISPLAY_MODES = [
6
6
  "fullscreen",
7
7
  "pip"
8
8
  ];
9
+ function isMcpAppDisplayMode(value) {
10
+ return VALID_DISPLAY_MODES.some((mode) => mode === value);
11
+ }
12
+ function isAppInfo(value) {
13
+ return isRecord(value) && typeof value.name === "string" && typeof value.version === "string";
14
+ }
15
+ function getAppCapabilities(value) {
16
+ if (!isRecord(value)) return void 0;
17
+ const { availableDisplayModes, ...rest } = value;
18
+ return {
19
+ ...rest,
20
+ ...Array.isArray(availableDisplayModes) ? { availableDisplayModes: Object.values(availableDisplayModes).filter(isMcpAppDisplayMode) } : {}
21
+ };
22
+ }
23
+ function getInitializeParams(params) {
24
+ if (!isRecord(params)) return {};
25
+ const appCapabilities = getAppCapabilities(params.appCapabilities);
26
+ return {
27
+ ...isAppInfo(params.appInfo) ? { appInfo: params.appInfo } : {},
28
+ ...appCapabilities ? { appCapabilities } : {},
29
+ ...typeof params.protocolVersion === "string" ? { protocolVersion: params.protocolVersion } : {}
30
+ };
31
+ }
9
32
  const DEFAULT_HOST_INFO = {
10
33
  name: "assistant-ui",
11
34
  version: "0.1"
@@ -41,6 +64,7 @@ function isNotification(msg) {
41
64
  function createMcpAppBridge(opts) {
42
65
  const { frame, handlers = {}, hostInfo = DEFAULT_HOST_INFO, hostContext = {} } = opts;
43
66
  let disposed = false;
67
+ let initializeParams = {};
44
68
  const post = (msg) => {
45
69
  if (disposed) return;
46
70
  frame.sendMessage(msg);
@@ -69,7 +93,8 @@ function createMcpAppBridge(opts) {
69
93
  const params = req.params;
70
94
  switch (normalizeMethod(req.method)) {
71
95
  case "ui/initialize": {
72
- const requestedProtocolVersion = isRecord(params) && typeof params.protocolVersion === "string" ? params.protocolVersion : "0.1";
96
+ initializeParams = getInitializeParams(params);
97
+ const requestedProtocolVersion = initializeParams.protocolVersion ?? "0.1";
73
98
  respond(req.id, { result: {
74
99
  protocolVersion: requestedProtocolVersion,
75
100
  host: hostInfo,
@@ -189,7 +214,7 @@ function createMcpAppBridge(opts) {
189
214
  return;
190
215
  }
191
216
  const modeParams = params ?? {};
192
- if (typeof modeParams.mode !== "string" || !VALID_DISPLAY_MODES.includes(modeParams.mode)) {
217
+ if (!isMcpAppDisplayMode(modeParams.mode)) {
193
218
  errorResponse(req.id, JSONRPC_ERROR.invalidParams, "requestDisplayMode requires a valid 'mode'");
194
219
  return;
195
220
  }
@@ -208,7 +233,7 @@ function createMcpAppBridge(opts) {
208
233
  try {
209
234
  switch (normalizeMethod(note.method)) {
210
235
  case "notifications/initialized":
211
- handlers.onInitialized?.();
236
+ handlers.onInitialized?.(initializeParams);
212
237
  return;
213
238
  case "notifications/size_changed": {
214
239
  const p = note.params ?? {};
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","names":["SandboxHostFrame","invokeUserCallback","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","disposed","post","sendMessage","respond","id","payload","error","code","message","data","res","errorResponse","undefined","reportError","Error","onError","bind","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 { invokeUserCallback } from \"@assistant-ui/core/internal\";\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 let disposed = false;\n\n const post = (msg: McpAppJsonRpcMessage) => {\n if (disposed) return;\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 if (disposed) return;\n invokeUserCallback(\n \"assistant-ui\",\n \"MCP App onError\",\n handlers.onError?.bind(handlers),\n error,\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 (disposed) return;\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 disposed = true;\n },\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":";;;AAeA,MAAMY,sBAAsB;CAC1B;CACA;CACA;AAAK;AAoBP,MAAMkB,oBAAoC;CACxCC,MAAM;CACNC,SAAS;AACX;AAKA,MAAMC,iBAAyC;CAC7C,gCAAgC;CAChC,iCAAiC;CACjC,2BAA2B;CAC3B,gBAAgB;CAChB,2BAA2B;CAC3B,cAAc;CACd,yBAAyB;AAC3B;AAEA,MAAME,mBAAmBC,WACvBH,eAAeG,WAAWA;AAE5B,MAAMC,gBAAgB;CACpBC,YAAY;CACZC,gBAAgB;CAChBC,gBAAgB;CAChBC,eAAe;CACfC,eAAe;AACjB;AAEA,SAASC,iBAAiBC,OAA+C;CACvE,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU,OAAO;CAChD,MAAMC,IAAID;CACV,OAAOC,EAAEC,YAAY,SAAS,OAAOD,EAAET,WAAW;AACpD;AAEA,SAASW,UAAUC,KAAwD;CACzE,OAAO,QAAQA;AACjB;AAEA,SAASC,eACPD,KACkC;CAClC,OAAO,EAAE,QAAQA;AACnB;AAEA,SAAgBE,mBACdC,MACc;CACd,MAAM,EACJnC,OACAC,WAAW,CAAC,GACZC,WAAWY,mBACXX,cAAc,CAAC,MACbgC;CACJ,IAAIC,WAAW;CAEf,MAAMC,QAAQL,QAA8B;EAC1C,IAAII,UAAU;EACdpC,MAAMsC,YAAYN,GAAG;CACvB;CAEA,MAAMO,WACJC,IACAC,YAGG;EACH,MAAMK,MAA6B;GACjChB,SAAS;GACTU;GACA,GAAGC;EACL;EACAJ,KAAKS,GAAG;CACV;CAEA,MAAMC,iBACJP,IACAG,MACAC,SACAC,SACG;EACHN,QAAQC,IAAI,EACVE,OAAO;GACLC;GACAC;GACA,GAAIC,SAASG,KAAAA,IAAY,EAAEH,KAAK,IAAI,CAAC;EACvC,EACF,CAAC;CACH;CAEA,MAAMI,eAAeP,UAAiB;EACpC,IAAIN,UAAU;EACdnD,mBACE,gBACA,mBACAgB,SAASkD,SAASC,KAAKnD,QAAQ,GAC/ByC,KACF;CACF;CAEA,MAAMW,gBAAgB,OAAOC,QAA8B;EACzD,IAAI;GACF,MAAMC,SAASD,IAAIC;GAEnB,QAAQpC,gBAAgBmC,IAAIlC,MAAM,GAAlC;IACE,KAAK,iBAAiB;KACpB,MAAMoC,2BACJ7D,SAAS4D,MAAM,KAAK,OAAOA,OAAOE,oBAAoB,WAClDF,OAAOE,kBAAAA;KAEblB,QAAQe,IAAId,IAAI,EACd5B,QAAQ;MACN6C,iBAAiBD;MACjBE,MAAMxD;MACNA;MACAC;MACAwD,cAAc;OACZC,OAAO3D,SAAS4D,WAAW,CAAC,IAAIb,KAAAA;OAChCc,WACE7D,SAAS8D,gBAAgB9D,SAAS+D,gBAC9B,CAAC,IACDhB,KAAAA;OACNiB,IAAI;QACF3B,aAAa,CAAC,CAACrC,SAASqC;QACxB4B,UAAU,CAAC,CAACjE,SAASiE;QACrBC,oBAAoB,CAAC,CAAClE,SAASkE;QAC/BC,oBAAoB,CAAC,CAACnE,SAASmE;OACjC;MACF;MACAC,kBAAkB;OAChB,GAAIpE,SAASiE,WAAW,EAAEI,WAAW,CAAC,EAAE,IAAI,CAAC;OAC7C,GAAIrE,SAAS4D,WAAW,EAAEU,aAAa,CAAC,EAAE,IAAI,CAAC;OAC/C,GAAItE,SAAS8D,gBAAgB9D,SAAS+D,gBAClC,EAAEQ,iBAAiB,CAAC,EAAE,IACtB,CAAC;OACL,GAAIvE,SAASmE,qBACT,EAAEA,oBAAoB,EAAEK,MAAM,CAAC,EAAE,EAAE,IACnC,CAAC;OACL,GAAIxE,SAASqC,cAAc,EAAEM,SAAS,EAAE6B,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC;OACxD,GAAIxE,SAASyE,QAAQ,EAAEC,SAAS,CAAC,EAAE,IAAI,CAAC;MAC1C;KACF,EACF,CAAC;KACD;IACF;IAEA,KAAK,cAAc;KACjB,IAAI,CAAC1E,SAAS4D,UAAU;MACtBd,cACEO,IAAId,IACJnB,cAAcG,gBACd,0CACF;MACA;KACF;KACA,MAAMoD,aAAcrB,UAAU,CAAC;KAI/B,IAAI,OAAOqB,WAAW7D,SAAS,UAAU;MACvCgC,cACEO,IAAId,IACJnB,cAAcI,eACd,qCACF;MACA;KACF;KACA,IACExB,SAAS6E,gBACT,CAAC7E,SAAS6E,aAAaC,SAASH,WAAW7D,IAAI,GAC/C;MACAgC,cACEO,IAAId,IACJnB,cAAcI,eACd,SAASmD,WAAW7D,KAAI,8BAC1B;MACA;KACF;KACA,IAAIiE;KACJ,IAAIJ,WAAWC,cAAc7B,KAAAA,GAAW;MACtC,IACE4B,WAAWC,cAAc,QACzB,OAAOD,WAAWC,cAAc,YAChCI,MAAMC,QAAQN,WAAWC,SAAS,GAClC;OACA9B,cACEO,IAAId,IACJnB,cAAcI,eACd,0CACF;OACA;MACF;MACAuD,WAAWJ,WAAWC;KACxB;KACA,MAAMjE,SAAS,MAAMX,SAAS4D,SAAS;MACrC9C,MAAM6D,WAAW7D;MACjB,GAAIiE,aAAahC,KAAAA,IAAY,EAAE6B,WAAWG,SAAS,IAAI,CAAC;KAC1D,CAAC;KACDzC,QAAQe,IAAId,IAAI,EAAE5B,OAAO,CAAC;KAC1B;IACF;IAEA,KAAK,kBAAkB;KACrB,IAAI,CAACX,SAAS8D,cAAc;MAC1BhB,cACEO,IAAId,IACJnB,cAAcG,gBACd,8CACF;MACA;KACF;KACA,MAAM2D,aAAc5B,UAAU,CAAC;KAC/B,IAAI,OAAO4B,WAAWC,QAAQ,UAAU;MACtCrC,cACEO,IAAId,IACJnB,cAAcI,eACd,wCACF;MACA;KACF;KACAc,QAAQe,IAAId,IAAI,EACd5B,QAAQ,MAAMX,SAAS8D,aAAa,EAAEqB,KAAKD,WAAWC,IAAI,CAAC,EAC7D,CAAC;KACD;IACF;IAEA,KAAK;KACH,IAAI,CAACnF,SAAS+D,eAAe;MAC3BjB,cACEO,IAAId,IACJnB,cAAcG,gBACd,8CACF;MACA;KACF;KACAe,QAAQe,IAAId,IAAI,EACd5B,QAAS,MAAMX,SAAS+D,cAAcT,MAAM,KAAM,KACpD,CAAC;KACD;IAGF,KAAK,YAAY;KACf,IAAI,CAACtD,SAASiE,UAAU;MACtBnB,cACEO,IAAId,IACJnB,cAAcG,gBACd,wCACF;MACA;KACF;KACA,MAAM6D,aAAc9B,UAAU,CAAC;KAC/B,IAAI,OAAO8B,WAAWC,QAAQ,UAAU;MACtCvC,cACEO,IAAId,IACJnB,cAAcI,eACd,kCACF;MACA;KACF;KACA,IAAI8D;KACJ,IAAI;MACFA,eAAe,IAAIC,IAAIH,WAAWC,GAAG,CAAC,CAACG;KACzC,QAAQ;MACN1C,cACEO,IAAId,IACJnB,cAAcI,eACd,+BACF;MACA;KACF;KACA,IAAI8D,iBAAiB,YAAYA,iBAAiB,SAAS;MACzDxC,cACEO,IAAId,IACJnB,cAAcI,eACd,oCACF;MACA;KACF;KACAc,QAAQe,IAAId,IAAI,EACd5B,QAAQ,MAAMX,SAASiE,SAAS,EAAEoB,KAAKD,WAAWC,IAAI,CAAC,EACzD,CAAC;KACD;IACF;IAEA,KAAK;KACH,IAAI,CAACrF,SAASqC,aAAa;MACzBS,cACEO,IAAId,IACJnB,cAAcG,gBACd,2CACF;MACA;KACF;KACAe,QAAQe,IAAId,IAAI,EACd5B,QAAS,MAAMX,SAASqC,YAAYiB,MAAM,KAAM,KAClD,CAAC;KACD;IAGF,KAAK;KACH,IAAI,CAACtD,SAASmE,oBAAoB;MAChCrB,cACEO,IAAId,IACJnB,cAAcG,gBACd,kDACF;MACA;KACF;KACAe,QAAQe,IAAId,IAAI,EACd5B,QAAS,MAAMX,SAASmE,mBAAmBb,MAAM,KAAM,KACzD,CAAC;KACD;IAGF,KAAK,sBAAsB;KACzB,IAAI,CAACtD,SAASkE,oBAAoB;MAChCpB,cACEO,IAAId,IACJnB,cAAcG,gBACd,kDACF;MACA;KACF;KACA,MAAMkE,aAAcnC,UAAU,CAAC;KAC/B,IACE,OAAOmC,WAAWC,SAAS,YAC3B,CAAC/F,oBAAoBmF,SAASW,WAAWC,IAAyB,GAClE;MACA5C,cACEO,IAAId,IACJnB,cAAcI,eACd,4CACF;MACA;KACF;KACAc,QAAQe,IAAId,IAAI,EACd5B,QAAQ,MAAMX,SAASkE,mBAAmB,EACxCwB,MAAMD,WAAWC,KACnB,CAAC,EACH,CAAC;KACD;IACF;IAEA,SACE5C,cACEO,IAAId,IACJnB,cAAcG,gBACd,mBAAmB8B,IAAIlC,QACzB;GAEJ;EACF,SAASwE,KAAK;GACZ,MAAMlD,QAAQkD,eAAe1C,QAAQ0C,MAAM,IAAI1C,MAAM2C,OAAOD,GAAG,CAAC;GAChE3C,YAAYP,KAAK;GACjBK,cAAcO,IAAId,IAAInB,cAAcK,eAAegB,MAAME,OAAO;EAClE;CACF;CAEA,MAAMkD,sBAAsBC,SAAoC;EAC9D,IAAI;GACF,QAAQ5E,gBAAgB4E,KAAK3E,MAAM,GAAnC;IACE,KAAK;KACHnB,SAAS+F,gBAAgB;KACzB;IAEF,KAAK,8BAA8B;KACjC,MAAMC,IAAKF,KAAKxC,UAAU,CAAC;KAC3BtD,SAASmG,eAAe;MACtB,GAAI,OAAOH,EAAEC,UAAU,WAAW,EAAEA,OAAOD,EAAEC,MAAM,IAAI,CAAC;MACxD,GAAI,OAAOD,EAAEE,WAAW,WAAW,EAAEA,QAAQF,EAAEE,OAAO,IAAI,CAAC;KAC7D,CAAC;KACD;IACF;IACA,KAAK;KACHlG,SAASyE,QAAQqB,KAAKxC,MAAM;KAC5B;IAEF,KAAK;KACHtD,SAASoG,oBAAoBN,KAAKxC,MAAM;KACxC;IAEF,KAAK,uBAAuB;KAC1B,MAAM0C,IAAKF,KAAKxC,UAAU,CAAC;KAC3BN,YACE,IAAIC,MACF,OAAO+C,EAAErD,YAAY,WAAWqD,EAAErD,UAAU,cAC9C,CACF;KACA;IACF;IACA,SACE;GACJ;EACF,SAASgD,KAAK;GACZ,MAAMlD,QAAQkD,eAAe1C,QAAQ0C,MAAM,IAAI1C,MAAM2C,OAAOD,GAAG,CAAC;GAChE3C,YAAYP,KAAK;EACnB;CACF;CAIA,MAAMrC,aAAaC,UAAwB;EACzC,IAAI8B,UAAU;EACd,IAAI,CAACT,iBAAiBrB,MAAMuC,IAAI,GAAG;EAEnC,MAAMb,MAAM1B,MAAMuC;EAClB,IAAId,UAAUC,GAAG,GACf,cAAmBA,GAAG;OACjB,IAAIC,eAAeD,GAAG,GAC3B8D,mBAAmB9D,GAAG;CAE1B;CAEA,OAAO;EACL3B;EACAG,eAAe;GACb4B,WAAW;EACb;EACA3B,kBAAkBC,UAAmB;GACnC2B,KAAK;IACHP,SAAS;IACTV,QAAQ;IACRmC,QAAQ,EAAE7C,MAAM;GAClB,CAAC;GACD2B,KAAK;IACHP,SAAS;IACTV,QAAQ;IACRmC,QAAQ5D,SAASe,KAAK,IAAI,EAAEmE,WAAWnE,MAAM,IAAI,CAAC;GACpD,CAAC;EACH;EACAC,mBAAmBC,WAAoB;GACrCyB,KAAK;IACHP,SAAS;IACTV,QAAQ;IACRmC,QAAQ,EAAE3C,OAAO;GACnB,CAAC;GACDyB,KAAK;IACHP,SAAS;IACTV,QAAQ;IACRmC,QAAQ5D,SAASiB,MAAM,IACnBA,SACA,EAAE0F,SAAS,CAAC;KAAEC,MAAM;KAAQ9B,MAAMoB,OAAOjF,MAAM;IAAE,CAAC,EAAE;GAC1D,CAAC;EACH;EACAC,2BAA2B2F,QAA2B;GACpDnE,KAAK;IACHP,SAAS;IACTV,QAAQ;IACRmC,QAAQiD;GACV,CAAC;GACDnE,KAAK;IACHP,SAAS;IACTV,QAAQ;IACRmC,QAAQiD;GACV,CAAC;EACH;CACF;AACF"}
1
+ {"version":3,"file":"bridge.js","names":["SandboxHostFrame","invokeUserCallback","MCP_APP_PROTOCOL_VERSION","McpAppBridgeHandlers","McpAppDisplayMode","McpAppHostContext","McpAppHostInfo","McpAppInitializeParams","McpAppJsonRpcMessage","McpAppJsonRpcNotification","McpAppJsonRpcRequest","McpAppJsonRpcResponse","isRecord","VALID_DISPLAY_MODES","const","isMcpAppDisplayMode","value","some","mode","isAppInfo","NonNullable","name","version","getAppCapabilities","undefined","availableDisplayModes","rest","Array","isArray","Object","values","filter","getInitializeParams","params","appCapabilities","appInfo","protocolVersion","McpAppBridgeFrame","CreateMcpAppBridgeOptions","frame","handlers","hostInfo","hostContext","McpAppBridge","onMessage","event","MessageEvent","dispose","notifyToolInput","input","notifyToolResult","result","notifyHostContextChanged","DEFAULT_HOST_INFO","METHOD_ALIASES","Record","normalizeMethod","method","JSONRPC_ERROR","parseError","invalidRequest","methodNotFound","invalidParams","internalError","isJsonRpcMessage","v","jsonrpc","isRequest","msg","isNotification","createMcpAppBridge","opts","disposed","initializeParams","post","sendMessage","respond","id","payload","error","code","message","data","res","errorResponse","reportError","Error","onError","bind","handleRequest","req","requestedProtocolVersion","host","capabilities","tools","callTool","resources","readResource","listResources","ui","openLink","requestDisplayMode","updateModelContext","hostCapabilities","openLinks","serverTools","serverResources","text","onLog","logging","callParams","arguments","allowedTools","includes","callArgs","readParams","uri","linkParams","url","linkProtocol","URL","protocol","modeParams","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 { invokeUserCallback } from \"@assistant-ui/core/internal\";\nimport {\n MCP_APP_PROTOCOL_VERSION,\n type McpAppBridgeHandlers,\n type McpAppDisplayMode,\n type McpAppHostContext,\n type McpAppHostInfo,\n type McpAppInitializeParams,\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\nfunction isMcpAppDisplayMode(value: unknown): value is McpAppDisplayMode {\n return VALID_DISPLAY_MODES.some((mode) => mode === value);\n}\n\nfunction isAppInfo(\n value: unknown,\n): value is NonNullable<McpAppInitializeParams[\"appInfo\"]> {\n return (\n isRecord(value) &&\n typeof value.name === \"string\" &&\n typeof value.version === \"string\"\n );\n}\n\nfunction getAppCapabilities(\n value: unknown,\n): McpAppInitializeParams[\"appCapabilities\"] {\n if (!isRecord(value)) return undefined;\n const { availableDisplayModes, ...rest } = value;\n return {\n ...rest,\n // Object.values reads only the entries present, so a sparse list claiming a huge length stays cheap, and the list's own methods are never called.\n ...(Array.isArray(availableDisplayModes)\n ? {\n availableDisplayModes: Object.values(availableDisplayModes).filter(\n isMcpAppDisplayMode,\n ),\n }\n : {}),\n };\n}\n\nfunction getInitializeParams(params: unknown): McpAppInitializeParams {\n if (!isRecord(params)) return {};\n const appCapabilities = getAppCapabilities(params.appCapabilities);\n return {\n ...(isAppInfo(params.appInfo) ? { appInfo: params.appInfo } : {}),\n ...(appCapabilities ? { appCapabilities } : {}),\n ...(typeof params.protocolVersion === \"string\"\n ? { protocolVersion: params.protocolVersion }\n : {}),\n };\n}\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 let disposed = false;\n let initializeParams: McpAppInitializeParams = {};\n\n const post = (msg: McpAppJsonRpcMessage) => {\n if (disposed) return;\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 if (disposed) return;\n invokeUserCallback(\n \"assistant-ui\",\n \"MCP App onError\",\n handlers.onError?.bind(handlers),\n error,\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 initializeParams = getInitializeParams(params);\n const requestedProtocolVersion =\n initializeParams.protocolVersion ?? 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 (!isMcpAppDisplayMode(modeParams.mode)) {\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,\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?.(initializeParams);\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 (disposed) return;\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 disposed = true;\n },\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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"}
@@ -0,0 +1,4 @@
1
+ import type { McpAppResourceCSP } from "./types.js";
2
+ export declare const buildMcpAppCsp: (csp?: McpAppResourceCSP) => string;
3
+ export declare const applyMcpAppCsp: (html: string, csp?: McpAppResourceCSP) => string;
4
+ //# sourceMappingURL=csp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csp.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/csp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAgB;AAyCjD,eAAO,MAAM,cAAc,GAAI,MAAM,iBAAiB,KAAG,MAyBxD,CAAC;AAiDF,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,MAAM,iBAAiB,KACtB,MAKF,CAAC"}
@@ -0,0 +1,93 @@
1
+ //#region src/mcp-apps/csp.ts
2
+ const isAllowedOrigin = (value, allowWebSocket) => {
3
+ if (!(allowWebSocket ? /^(?:https?|wss?):\/\//i : /^https?:\/\//i).test(value) || /[\s;'"`,]/.test(value)) return false;
4
+ try {
5
+ const url = new URL(value.replace("://*.", "://wildcard."));
6
+ return url.username === "" && url.password === "" && url.pathname === "/" && url.search === "" && url.hash === "";
7
+ } catch {
8
+ return false;
9
+ }
10
+ };
11
+ const getAllowedOrigins = (values, allowWebSocket = false) => Array.isArray(values) ? [...new Set(values.filter((value) => typeof value === "string" && isAllowedOrigin(value, allowWebSocket)))] : [];
12
+ const directive = (name, values) => `${name} ${values.join(" ")}`;
13
+ const buildMcpAppCsp = (csp) => {
14
+ const connectDomains = getAllowedOrigins(csp?.connectDomains, true);
15
+ const resourceDomains = getAllowedOrigins(csp?.resourceDomains);
16
+ const frameDomains = getAllowedOrigins(csp?.frameDomains);
17
+ const baseUriDomains = getAllowedOrigins(csp?.baseUriDomains);
18
+ return [
19
+ "default-src 'none'",
20
+ directive("script-src", [
21
+ "'self'",
22
+ "'unsafe-inline'",
23
+ ...resourceDomains
24
+ ]),
25
+ directive("style-src", [
26
+ "'self'",
27
+ "'unsafe-inline'",
28
+ ...resourceDomains
29
+ ]),
30
+ directive("connect-src", connectDomains.length > 0 ? ["'self'", ...connectDomains] : ["'none'"]),
31
+ directive("img-src", [
32
+ "'self'",
33
+ "data:",
34
+ ...resourceDomains
35
+ ]),
36
+ directive("font-src", ["'self'", ...resourceDomains]),
37
+ directive("media-src", [
38
+ "'self'",
39
+ "data:",
40
+ ...resourceDomains
41
+ ]),
42
+ directive("frame-src", frameDomains.length > 0 ? frameDomains : ["'none'"]),
43
+ directive("base-uri", baseUriDomains.length > 0 ? baseUriDomains : ["'self'"]),
44
+ "object-src 'none'",
45
+ "form-action 'none'"
46
+ ].join("; ");
47
+ };
48
+ const findDoctypeEnd = (html) => {
49
+ let offset = 0;
50
+ while (offset < html.length) {
51
+ const whitespace = html.slice(offset).match(/^[\t\n\f\r ]+/)?.[0];
52
+ if (whitespace) {
53
+ offset += whitespace.length;
54
+ continue;
55
+ }
56
+ if (html.startsWith("<!--", offset)) {
57
+ if (html.startsWith("<!-->", offset)) {
58
+ offset += 5;
59
+ continue;
60
+ }
61
+ if (html.startsWith("<!--->", offset)) {
62
+ offset += 6;
63
+ continue;
64
+ }
65
+ const commentEnd = html.indexOf("-->", offset + 4);
66
+ const bangCommentEnd = html.indexOf("--!>", offset + 4);
67
+ if (commentEnd === -1 && bangCommentEnd === -1) return 0;
68
+ offset = bangCommentEnd !== -1 && (commentEnd === -1 || bangCommentEnd < commentEnd) ? bangCommentEnd + 4 : commentEnd + 3;
69
+ continue;
70
+ }
71
+ if (html.slice(offset, offset + 9).toLowerCase() === "<!doctype") break;
72
+ if (html.startsWith("<?", offset) || html.startsWith("<!", offset)) {
73
+ const bogusCommentEnd = html.indexOf(">", offset + 2);
74
+ if (bogusCommentEnd === -1) return 0;
75
+ offset = bogusCommentEnd + 1;
76
+ continue;
77
+ }
78
+ break;
79
+ }
80
+ if (html.slice(offset, offset + 9).toLowerCase() !== "<!doctype") return offset;
81
+ const end = html.indexOf(">", offset + 9);
82
+ return end === -1 ? 0 : end + 1;
83
+ };
84
+ const applyMcpAppCsp = (html, csp) => {
85
+ const normalizedHtml = html.charCodeAt(0) === 65279 ? html.slice(1) : html;
86
+ const meta = `<meta http-equiv="Content-Security-Policy" content="${buildMcpAppCsp(csp)}">`;
87
+ const insertionPoint = findDoctypeEnd(normalizedHtml);
88
+ return `${normalizedHtml.slice(0, insertionPoint)}${meta}${normalizedHtml.slice(insertionPoint)}`;
89
+ };
90
+ //#endregion
91
+ export { applyMcpAppCsp, buildMcpAppCsp };
92
+
93
+ //# sourceMappingURL=csp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csp.js","names":["McpAppResourceCSP","isAllowedOrigin","value","allowWebSocket","scheme","test","url","URL","replace","username","password","pathname","search","hash","getAllowedOrigins","values","Array","isArray","Set","filter","directive","name","join","buildMcpAppCsp","csp","connectDomains","resourceDomains","frameDomains","baseUriDomains","length","findDoctypeEnd","html","offset","whitespace","slice","match","startsWith","commentEnd","indexOf","bangCommentEnd","toLowerCase","bogusCommentEnd","end","applyMcpAppCsp","normalizedHtml","charCodeAt","meta","insertionPoint"],"sources":["../../src/mcp-apps/csp.ts"],"sourcesContent":["import type { McpAppResourceCSP } from \"./types\";\n\nconst isAllowedOrigin = (value: string, allowWebSocket: boolean): boolean => {\n const scheme = allowWebSocket ? /^(?:https?|wss?):\\/\\//i : /^https?:\\/\\//i;\n if (!scheme.test(value) || /[\\s;'\"`,]/.test(value)) {\n return false;\n }\n\n try {\n const url = new URL(value.replace(\"://*.\", \"://wildcard.\"));\n return (\n url.username === \"\" &&\n url.password === \"\" &&\n url.pathname === \"/\" &&\n url.search === \"\" &&\n url.hash === \"\"\n );\n } catch {\n return false;\n }\n};\n\nconst getAllowedOrigins = (\n values: unknown,\n allowWebSocket = false,\n): string[] =>\n Array.isArray(values)\n ? [\n ...new Set(\n values.filter(\n (value): value is string =>\n typeof value === \"string\" &&\n isAllowedOrigin(value, allowWebSocket),\n ),\n ),\n ]\n : [];\n\nconst directive = (name: string, values: readonly string[]) =>\n `${name} ${values.join(\" \")}`;\n\nexport const buildMcpAppCsp = (csp?: McpAppResourceCSP): string => {\n const connectDomains = getAllowedOrigins(csp?.connectDomains, true);\n const resourceDomains = getAllowedOrigins(csp?.resourceDomains);\n const frameDomains = getAllowedOrigins(csp?.frameDomains);\n const baseUriDomains = getAllowedOrigins(csp?.baseUriDomains);\n\n return [\n \"default-src 'none'\",\n directive(\"script-src\", [\"'self'\", \"'unsafe-inline'\", ...resourceDomains]),\n directive(\"style-src\", [\"'self'\", \"'unsafe-inline'\", ...resourceDomains]),\n directive(\n \"connect-src\",\n connectDomains.length > 0 ? [\"'self'\", ...connectDomains] : [\"'none'\"],\n ),\n directive(\"img-src\", [\"'self'\", \"data:\", ...resourceDomains]),\n directive(\"font-src\", [\"'self'\", ...resourceDomains]),\n directive(\"media-src\", [\"'self'\", \"data:\", ...resourceDomains]),\n directive(\"frame-src\", frameDomains.length > 0 ? frameDomains : [\"'none'\"]),\n directive(\n \"base-uri\",\n baseUriDomains.length > 0 ? baseUriDomains : [\"'self'\"],\n ),\n \"object-src 'none'\",\n \"form-action 'none'\",\n ].join(\"; \");\n};\n\nconst findDoctypeEnd = (html: string): number => {\n let offset = 0;\n\n while (offset < html.length) {\n const whitespace = html.slice(offset).match(/^[\\t\\n\\f\\r ]+/)?.[0];\n if (whitespace) {\n offset += whitespace.length;\n continue;\n }\n if (html.startsWith(\"<!--\", offset)) {\n if (html.startsWith(\"<!-->\", offset)) {\n offset += 5;\n continue;\n }\n if (html.startsWith(\"<!--->\", offset)) {\n offset += 6;\n continue;\n }\n const commentEnd = html.indexOf(\"-->\", offset + 4);\n const bangCommentEnd = html.indexOf(\"--!>\", offset + 4);\n if (commentEnd === -1 && bangCommentEnd === -1) return 0;\n offset =\n bangCommentEnd !== -1 &&\n (commentEnd === -1 || bangCommentEnd < commentEnd)\n ? bangCommentEnd + 4\n : commentEnd + 3;\n continue;\n }\n if (html.slice(offset, offset + 9).toLowerCase() === \"<!doctype\") {\n break;\n }\n if (html.startsWith(\"<?\", offset) || html.startsWith(\"<!\", offset)) {\n const bogusCommentEnd = html.indexOf(\">\", offset + 2);\n if (bogusCommentEnd === -1) return 0;\n offset = bogusCommentEnd + 1;\n continue;\n }\n break;\n }\n\n if (html.slice(offset, offset + 9).toLowerCase() !== \"<!doctype\") {\n return offset;\n }\n const end = html.indexOf(\">\", offset + 9);\n return end === -1 ? 0 : end + 1;\n};\n\nexport const applyMcpAppCsp = (\n html: string,\n csp?: McpAppResourceCSP,\n): string => {\n const normalizedHtml = html.charCodeAt(0) === 0xfeff ? html.slice(1) : html;\n const meta = `<meta http-equiv=\"Content-Security-Policy\" content=\"${buildMcpAppCsp(csp)}\">`;\n const insertionPoint = findDoctypeEnd(normalizedHtml);\n return `${normalizedHtml.slice(0, insertionPoint)}${meta}${normalizedHtml.slice(insertionPoint)}`;\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export { McpAppRenderer, type McpAppPartOptions, type McpAppRendererOptions, } from "./McpAppRenderer.js";
2
2
  export { McpAppsRemoteHost } from "./McpAppsRemoteHost.js";
3
3
  export { getMcpAppFromToolPart } from "./utils.js";
4
- export type { McpAppMetadata, McpAppResource, McpAppResourceMeta, McpAppResourceCSP, McpAppSandboxConfig, McpAppHostInfo, McpAppHostContext, McpAppDisplayMode, McpAppsHost, McpAppsRemoteHostOptions, McpAppToolCallParams, McpAppBridgeHandlers, ToolCallMessagePartMcpMetadata, } from "./types.js";
4
+ export type { McpAppMetadata, McpAppResource, McpAppResourceMeta, McpAppResourceCSP, McpAppSandboxConfig, McpAppHostInfo, McpAppHostContext, McpAppDisplayMode, McpAppsHost, McpAppsRemoteHostOptions, McpAppToolCallParams, McpAppInitializeParams, McpAppBridgeHandlers, ToolCallMessagePartMcpMetadata, } from "./types.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,4BAAyB;AAC1B,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,qBAAqB,EAAE,mBAAgB;AAChD,YAAY,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,8BAA8B,GAC/B,mBAAgB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,4BAAyB;AAC1B,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,qBAAqB,EAAE,mBAAgB;AAChD,YAAY,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,8BAA8B,GAC/B,mBAAgB"}
@@ -7,6 +7,7 @@ export type McpAppResourceCSP = {
7
7
  connectDomains?: string[];
8
8
  resourceDomains?: string[];
9
9
  frameDomains?: string[];
10
+ baseUriDomains?: string[];
10
11
  [k: string]: unknown;
11
12
  };
12
13
  export type McpAppResourceMeta = {
@@ -68,6 +69,23 @@ export type McpAppToolCallParams = {
68
69
  name: string;
69
70
  arguments?: Record<string, unknown>;
70
71
  };
72
+ /**
73
+ * The params of the app's `ui/initialize` request, as `onInitialized`
74
+ * receives them. A field that fails validation is omitted, and
75
+ * `availableDisplayModes` keeps only the modes the bridge recognizes.
76
+ */
77
+ export type McpAppInitializeParams = {
78
+ appInfo?: {
79
+ name: string;
80
+ version: string;
81
+ [k: string]: unknown;
82
+ };
83
+ appCapabilities?: {
84
+ availableDisplayModes?: McpAppDisplayMode[];
85
+ [k: string]: unknown;
86
+ };
87
+ protocolVersion?: string;
88
+ };
71
89
  export type McpAppBridgeHandlers = {
72
90
  allowedTools?: readonly string[];
73
91
  callTool?: (params: McpAppToolCallParams) => Promise<unknown> | unknown;
@@ -91,7 +109,7 @@ export type McpAppBridgeHandlers = {
91
109
  width?: number;
92
110
  height?: number;
93
111
  }) => void;
94
- onInitialized?: () => void;
112
+ onInitialized?: (params: McpAppInitializeParams) => void;
95
113
  onRequestTeardown?: (params: unknown) => void;
96
114
  onLog?: (params: unknown) => void;
97
115
  onError?: (error: Error) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["McpAppMetadata","ToolCallMessagePartMcpMetadata","SandboxHostConfig","MCP_APP_MIME_TYPE","const","MCP_APP_PROTOCOL_VERSION","McpAppResourceCSP","connectDomains","resourceDomains","frameDomains","k","McpAppResourceMeta","prefersBorder","csp","permissions","Record","McpAppResource","uri","mimeType","html","meta","McpAppDisplayMode","McpAppHostContext","theme","displayMode","availableDisplayModes","McpAppHostInfo","name","version","McpAppsHost","loadResource","params","serverId","Promise","callTool","McpAppToolCallParams","readResource","listResources","McpAppsRemoteHostOptions","url","fetch","headers","arguments","McpAppBridgeHandlers","allowedTools","openLink","sendMessage","updateModelContext","requestDisplayMode","mode","onSizeChange","width","height","onInitialized","onRequestTeardown","onLog","onError","error","Error","McpAppSandboxConfig","McpAppFrameProps","app","resource","input","output","sandbox","handlers","hostInfo","hostContext","maxHeight","McpAppJsonRpcRequest","jsonrpc","id","method","McpAppJsonRpcNotification","McpAppJsonRpcError","code","message","data","McpAppJsonRpcResponse","result","McpAppJsonRpcMessage"],"sources":["../../src/mcp-apps/types.ts"],"sourcesContent":["import type {\n McpAppMetadata,\n ToolCallMessagePartMcpMetadata,\n} from \"@assistant-ui/core\";\nimport type { SandboxHostConfig } from \"../sandbox-host/SandboxHost\";\n\nexport type { McpAppMetadata, ToolCallMessagePartMcpMetadata };\n\nexport const MCP_APP_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\nexport const MCP_APP_PROTOCOL_VERSION = \"0.1\" as const;\n\nexport type McpAppResourceCSP = {\n connectDomains?: string[];\n resourceDomains?: string[];\n frameDomains?: string[];\n [k: string]: unknown;\n};\n\nexport type McpAppResourceMeta = {\n prefersBorder?: boolean;\n csp?: McpAppResourceCSP;\n permissions?: Record<string, unknown>;\n [k: string]: unknown;\n};\n\nexport type McpAppResource = {\n uri: string;\n mimeType: typeof MCP_APP_MIME_TYPE;\n html: string;\n meta?: McpAppResourceMeta;\n};\n\nexport type McpAppDisplayMode = \"inline\" | \"fullscreen\" | \"pip\";\n\nexport type McpAppHostContext = {\n theme?: \"light\" | \"dark\";\n displayMode?: McpAppDisplayMode;\n availableDisplayModes?: McpAppDisplayMode[];\n [k: string]: unknown;\n};\n\nexport type McpAppHostInfo = {\n name: string;\n version: string;\n};\n\n/**\n * What `McpAppRenderer` needs from its host — the data-plane operations\n * the widget can request. Provided by a host resource like\n * `McpAppsRemoteHost`.\n */\nexport type McpAppsHost = {\n loadResource: (params: {\n uri: string;\n serverId?: string;\n }) => Promise<McpAppResource>;\n callTool: (\n params: McpAppToolCallParams & { serverId?: string },\n ) => Promise<unknown>;\n readResource: (params: {\n uri: string;\n serverId?: string;\n }) => Promise<unknown>;\n listResources: (params?: unknown) => Promise<unknown>;\n};\n\n/**\n * Options for `McpAppsRemoteHost`. The host POSTs `{ method, params }` to\n * `url` and expects JSON responses. Params may carry `serverId` for host-side routing. Method names sent:\n * - `mcp-apps/read-resource` (`{ uri, serverId? }`) → `McpAppResource`\n * - `tools/call` (`{ name, arguments?, serverId? }`) → tool result\n * - `resources/read` (`{ uri, serverId? }`) → resource read result\n * - `resources/list` (`{ serverId?, ...params }?`) → list result\n */\nexport type McpAppsRemoteHostOptions = {\n url: string;\n fetch?: typeof fetch;\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n};\n\nexport type McpAppToolCallParams = {\n name: string;\n arguments?: Record<string, unknown>;\n};\n\nexport type McpAppBridgeHandlers = {\n allowedTools?: readonly string[];\n callTool?: (params: McpAppToolCallParams) => Promise<unknown> | unknown;\n readResource?: (params: { uri: string }) => Promise<unknown> | unknown;\n listResources?: (params?: unknown) => Promise<unknown> | unknown;\n openLink?: (params: { url: string }) => Promise<unknown> | unknown;\n sendMessage?: (params: unknown) => Promise<unknown> | unknown;\n updateModelContext?: (params: unknown) => Promise<unknown> | unknown;\n requestDisplayMode?: (params: {\n mode: McpAppDisplayMode;\n }) => Promise<{ mode: McpAppDisplayMode }> | { mode: McpAppDisplayMode };\n onSizeChange?: (params: { width?: number; height?: number }) => void;\n onInitialized?: () => void;\n onRequestTeardown?: (params: unknown) => void;\n onLog?: (params: unknown) => void;\n onError?: (error: Error) => void;\n};\n\nexport type McpAppSandboxConfig = SandboxHostConfig;\n\nexport type McpAppFrameProps = {\n app: McpAppMetadata;\n resource: McpAppResource;\n input?: unknown;\n output?: unknown;\n sandbox?: McpAppSandboxConfig | undefined;\n handlers?: McpAppBridgeHandlers | undefined;\n hostInfo?: McpAppHostInfo | undefined;\n hostContext?: McpAppHostContext | undefined;\n /**\n * Upper bound (in pixels) for the auto-resize height driven by the widget's\n * `notifications/size_changed`. Defaults to 800.\n */\n maxHeight?: number | undefined;\n};\n\nexport type McpAppJsonRpcRequest = {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: unknown;\n};\n\nexport type McpAppJsonRpcNotification = {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n};\n\nexport type McpAppJsonRpcError = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type McpAppJsonRpcResponse =\n | {\n jsonrpc: \"2.0\";\n id: string | number;\n result: unknown;\n error?: never;\n }\n | {\n jsonrpc: \"2.0\";\n id: string | number;\n result?: never;\n error: McpAppJsonRpcError;\n };\n\nexport type McpAppJsonRpcMessage =\n | McpAppJsonRpcRequest\n | McpAppJsonRpcNotification\n | McpAppJsonRpcResponse;\n"],"mappings":";AAQA,MAAaG,oBAAoB;AAEjC,MAAaE,2BAA2B"}
1
+ {"version":3,"file":"types.js","names":["McpAppMetadata","ToolCallMessagePartMcpMetadata","SandboxHostConfig","MCP_APP_MIME_TYPE","const","MCP_APP_PROTOCOL_VERSION","McpAppResourceCSP","connectDomains","resourceDomains","frameDomains","baseUriDomains","k","McpAppResourceMeta","prefersBorder","csp","permissions","Record","McpAppResource","uri","mimeType","html","meta","McpAppDisplayMode","McpAppHostContext","theme","displayMode","availableDisplayModes","McpAppHostInfo","name","version","McpAppsHost","loadResource","params","serverId","Promise","callTool","McpAppToolCallParams","readResource","listResources","McpAppsRemoteHostOptions","url","fetch","headers","arguments","McpAppInitializeParams","appInfo","appCapabilities","protocolVersion","McpAppBridgeHandlers","allowedTools","openLink","sendMessage","updateModelContext","requestDisplayMode","mode","onSizeChange","width","height","onInitialized","onRequestTeardown","onLog","onError","error","Error","McpAppSandboxConfig","McpAppFrameProps","app","resource","input","output","sandbox","handlers","hostInfo","hostContext","maxHeight","McpAppJsonRpcRequest","jsonrpc","id","method","McpAppJsonRpcNotification","McpAppJsonRpcError","code","message","data","McpAppJsonRpcResponse","result","McpAppJsonRpcMessage"],"sources":["../../src/mcp-apps/types.ts"],"sourcesContent":["import type {\n McpAppMetadata,\n ToolCallMessagePartMcpMetadata,\n} from \"@assistant-ui/core\";\nimport type { SandboxHostConfig } from \"../sandbox-host/SandboxHost\";\n\nexport type { McpAppMetadata, ToolCallMessagePartMcpMetadata };\n\nexport const MCP_APP_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\nexport const MCP_APP_PROTOCOL_VERSION = \"0.1\" as const;\n\nexport type McpAppResourceCSP = {\n connectDomains?: string[];\n resourceDomains?: string[];\n frameDomains?: string[];\n baseUriDomains?: string[];\n [k: string]: unknown;\n};\n\nexport type McpAppResourceMeta = {\n prefersBorder?: boolean;\n csp?: McpAppResourceCSP;\n permissions?: Record<string, unknown>;\n [k: string]: unknown;\n};\n\nexport type McpAppResource = {\n uri: string;\n mimeType: typeof MCP_APP_MIME_TYPE;\n html: string;\n meta?: McpAppResourceMeta;\n};\n\nexport type McpAppDisplayMode = \"inline\" | \"fullscreen\" | \"pip\";\n\nexport type McpAppHostContext = {\n theme?: \"light\" | \"dark\";\n displayMode?: McpAppDisplayMode;\n availableDisplayModes?: McpAppDisplayMode[];\n [k: string]: unknown;\n};\n\nexport type McpAppHostInfo = {\n name: string;\n version: string;\n};\n\n/**\n * What `McpAppRenderer` needs from its host — the data-plane operations\n * the widget can request. Provided by a host resource like\n * `McpAppsRemoteHost`.\n */\nexport type McpAppsHost = {\n loadResource: (params: {\n uri: string;\n serverId?: string;\n }) => Promise<McpAppResource>;\n callTool: (\n params: McpAppToolCallParams & { serverId?: string },\n ) => Promise<unknown>;\n readResource: (params: {\n uri: string;\n serverId?: string;\n }) => Promise<unknown>;\n listResources: (params?: unknown) => Promise<unknown>;\n};\n\n/**\n * Options for `McpAppsRemoteHost`. The host POSTs `{ method, params }` to\n * `url` and expects JSON responses. Params may carry `serverId` for host-side routing. Method names sent:\n * - `mcp-apps/read-resource` (`{ uri, serverId? }`) → `McpAppResource`\n * - `tools/call` (`{ name, arguments?, serverId? }`) → tool result\n * - `resources/read` (`{ uri, serverId? }`) → resource read result\n * - `resources/list` (`{ serverId?, ...params }?`) → list result\n */\nexport type McpAppsRemoteHostOptions = {\n url: string;\n fetch?: typeof fetch;\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n};\n\nexport type McpAppToolCallParams = {\n name: string;\n arguments?: Record<string, unknown>;\n};\n\n/**\n * The params of the app's `ui/initialize` request, as `onInitialized`\n * receives them. A field that fails validation is omitted, and\n * `availableDisplayModes` keeps only the modes the bridge recognizes.\n */\nexport type McpAppInitializeParams = {\n appInfo?: { name: string; version: string; [k: string]: unknown };\n appCapabilities?: {\n availableDisplayModes?: McpAppDisplayMode[];\n [k: string]: unknown;\n };\n protocolVersion?: string;\n};\n\nexport type McpAppBridgeHandlers = {\n allowedTools?: readonly string[];\n callTool?: (params: McpAppToolCallParams) => Promise<unknown> | unknown;\n readResource?: (params: { uri: string }) => Promise<unknown> | unknown;\n listResources?: (params?: unknown) => Promise<unknown> | unknown;\n openLink?: (params: { url: string }) => Promise<unknown> | unknown;\n sendMessage?: (params: unknown) => Promise<unknown> | unknown;\n updateModelContext?: (params: unknown) => Promise<unknown> | unknown;\n requestDisplayMode?: (params: {\n mode: McpAppDisplayMode;\n }) => Promise<{ mode: McpAppDisplayMode }> | { mode: McpAppDisplayMode };\n onSizeChange?: (params: { width?: number; height?: number }) => void;\n onInitialized?: (params: McpAppInitializeParams) => void;\n onRequestTeardown?: (params: unknown) => void;\n onLog?: (params: unknown) => void;\n onError?: (error: Error) => void;\n};\n\nexport type McpAppSandboxConfig = SandboxHostConfig;\n\nexport type McpAppFrameProps = {\n app: McpAppMetadata;\n resource: McpAppResource;\n input?: unknown;\n output?: unknown;\n sandbox?: McpAppSandboxConfig | undefined;\n handlers?: McpAppBridgeHandlers | undefined;\n hostInfo?: McpAppHostInfo | undefined;\n hostContext?: McpAppHostContext | undefined;\n /**\n * Upper bound (in pixels) for the auto-resize height driven by the widget's\n * `notifications/size_changed`. Defaults to 800.\n */\n maxHeight?: number | undefined;\n};\n\nexport type McpAppJsonRpcRequest = {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: unknown;\n};\n\nexport type McpAppJsonRpcNotification = {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n};\n\nexport type McpAppJsonRpcError = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type McpAppJsonRpcResponse =\n | {\n jsonrpc: \"2.0\";\n id: string | number;\n result: unknown;\n error?: never;\n }\n | {\n jsonrpc: \"2.0\";\n id: string | number;\n result?: never;\n error: McpAppJsonRpcError;\n };\n\nexport type McpAppJsonRpcMessage =\n | McpAppJsonRpcRequest\n | McpAppJsonRpcNotification\n | McpAppJsonRpcResponse;\n"],"mappings":";AAQA,MAAaG,oBAAoB;AAEjC,MAAaE,2BAA2B"}
@@ -2,6 +2,7 @@ import { type FC } from "react";
2
2
  import { Popover as PopoverPrimitive } from "radix-ui";
3
3
  export declare namespace AssistantModalPrimitiveRoot {
4
4
  type Props = PopoverPrimitive.PopoverProps & {
5
+ /** @deprecated Experimental since 2024-10-12. Not scheduled for removal; the API may change in any release. */
5
6
  unstable_openOnRunStart?: boolean | undefined;
6
7
  };
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantModalRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/assistantModal/AssistantModalRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,EAAY,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,KAAK,GAAG,gBAAgB,CAAC,YAAY,GAAG;QAClD,uBAAuB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAC/C,CAAC;CACH;AAED,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAC1C,2BAA2B,CAAC,KAAK,CA+BlC,CAAC"}
1
+ {"version":3,"file":"AssistantModalRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/assistantModal/AssistantModalRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,EAAY,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,KAAK,GAAG,gBAAgB,CAAC,YAAY,GAAG;QAClD,+GAA+G;QAC/G,uBAAuB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAC/C,CAAC;CACH;AAED,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAC1C,2BAA2B,CAAC,KAAK,CA+BlC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantModalRoot.js","names":["c","_c","FC","useState","Popover","PopoverPrimitive","ScopedProps","usePopoverScope","useAuiEvent","AssistantModalPrimitiveRoot","Props","PopoverProps","unstable_openOnRunStart","t0","$","__scopeAssistantModal","onOpenChange","open","rest","t1","t2","defaultOpen","undefined","scope","modalOpen","setOpen","isOpen","t3","open_0","openChangeHandler","t4","t5","displayName","_c","PopoverPrimitive"],"sources":["../../../src/primitives/assistantModal/AssistantModalRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { type FC, useState } from \"react\";\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport { type ScopedProps, usePopoverScope } from \"./scope\";\nimport { useAuiEvent } from \"@assistant-ui/store\";\n\nexport namespace AssistantModalPrimitiveRoot {\n export type Props = PopoverPrimitive.PopoverProps & {\n unstable_openOnRunStart?: boolean | undefined;\n };\n}\n\nexport const AssistantModalPrimitiveRoot: FC<\n AssistantModalPrimitiveRoot.Props\n> = ({\n __scopeAssistantModal,\n defaultOpen = false,\n unstable_openOnRunStart = true,\n open,\n onOpenChange,\n ...rest\n}: ScopedProps<AssistantModalPrimitiveRoot.Props>) => {\n const scope = usePopoverScope(__scopeAssistantModal);\n\n const [modalOpen, setOpen] = useState(defaultOpen);\n const isOpen = open ?? modalOpen;\n\n const openChangeHandler = (open: boolean) => {\n onOpenChange?.(open);\n setOpen(open);\n };\n\n useAuiEvent(\"thread.runStart\", () => {\n if (unstable_openOnRunStart && !isOpen) openChangeHandler(true);\n });\n\n return (\n <PopoverPrimitive.Root\n {...scope}\n open={isOpen}\n onOpenChange={openChangeHandler}\n {...rest}\n />\n );\n};\n\nAssistantModalPrimitiveRoot.displayName = \"AssistantModalPrimitive.Root\";\n"],"mappings":";;;;;;;;AAaA,MAAaS,+BAETI,OAAA;CAAA,MAAAC,IAAAb,EAAA,EAAA;CAAA,IAAAc;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAN,EAAA,OAAAD,IAAA;EAAC,CAAA,CAAAE,uBAAAM,aAAAF,IAAAP,yBAAAQ,IAAAH,MAAAD,cAAA,GAAAE,QAAAL;EAO4CC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAA;EAAAL,wBAAAD,EAAA;EAAAE,eAAAF,EAAA;EAAAG,OAAAH,EAAA;EAAAI,OAAAJ,EAAA;EAAAK,KAAAL,EAAA;EAAAM,KAAAN,EAAA;CAAA;CAL/C,MAAAO,cAAAF,OAAAG,KAAAA,IAAA,QAAAH;CACA,MAAAP,0BAAAQ,OAAAE,KAAAA,IAAA,OAAAF;CAKA,MAAAG,QAAchB,gBAAgBQ,qBAAqB;CAEnD,MAAA,CAAAS,WAAAC,WAA6BtB,SAASkB,WAAW;CACjD,MAAAK,SAAeT,QAAAO;CAAkB,IAAAG;CAAA,IAAAb,EAAA,OAAAE,cAAA;EAEPW,MAAAC,WAAA;GACxBZ,eAAeC,MAAI;GACnBQ,QAAQR,MAAI;EAAC;EACdH,EAAA,KAAAE;EAAAF,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAHD,MAAAe,oBAA0BF;CAGxB,IAAAG;CAAA,IAAAhB,EAAA,OAAAY,UAAAZ,EAAA,QAAAe,qBAAAf,EAAA,QAAAF,yBAAA;EAE6BkB,WAAA;GAC7B,IAAIlB,2BAAA,CAA4Bc,QAAQG,kBAAkB,IAAI;EAAE;EACjEf,EAAA,KAAAY;EAAAZ,EAAA,MAAAe;EAAAf,EAAA,MAAAF;EAAAE,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAFDN,YAAY,mBAAmBsB,EAE9B;CAAC,IAAAC;CAAA,IAAAjB,EAAA,QAAAY,UAAAZ,EAAA,QAAAe,qBAAAf,EAAA,QAAAI,QAAAJ,EAAA,QAAAS,OAAA;EAGAQ,KAAA,oBAAAG,QAAA,MAAA;GAAA,GACMX;GACEG,MAAAA;GACQG,cAAAA;GAAiB,GAC3BX;EAAI,CAAA;EACRJ,EAAA,MAAAY;EAAAZ,EAAA,MAAAe;EAAAf,EAAA,MAAAI;EAAAJ,EAAA,MAAAS;EAAAT,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,OALFiB;AAKE;AAINtB,4BAA4BuB,cAAc"}
1
+ {"version":3,"file":"AssistantModalRoot.js","names":["c","_c","FC","useState","Popover","PopoverPrimitive","ScopedProps","usePopoverScope","useAuiEvent","AssistantModalPrimitiveRoot","Props","PopoverProps","unstable_openOnRunStart","t0","$","__scopeAssistantModal","onOpenChange","open","rest","t1","t2","defaultOpen","undefined","scope","modalOpen","setOpen","isOpen","t3","open_0","openChangeHandler","t4","t5","displayName","_c","PopoverPrimitive"],"sources":["../../../src/primitives/assistantModal/AssistantModalRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { type FC, useState } from \"react\";\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport { type ScopedProps, usePopoverScope } from \"./scope\";\nimport { useAuiEvent } from \"@assistant-ui/store\";\n\nexport namespace AssistantModalPrimitiveRoot {\n export type Props = PopoverPrimitive.PopoverProps & {\n /** @deprecated Experimental since 2024-10-12. Not scheduled for removal; the API may change in any release. */\n unstable_openOnRunStart?: boolean | undefined;\n };\n}\n\nexport const AssistantModalPrimitiveRoot: FC<\n AssistantModalPrimitiveRoot.Props\n> = ({\n __scopeAssistantModal,\n defaultOpen = false,\n unstable_openOnRunStart = true,\n open,\n onOpenChange,\n ...rest\n}: ScopedProps<AssistantModalPrimitiveRoot.Props>) => {\n const scope = usePopoverScope(__scopeAssistantModal);\n\n const [modalOpen, setOpen] = useState(defaultOpen);\n const isOpen = open ?? modalOpen;\n\n const openChangeHandler = (open: boolean) => {\n onOpenChange?.(open);\n setOpen(open);\n };\n\n useAuiEvent(\"thread.runStart\", () => {\n if (unstable_openOnRunStart && !isOpen) openChangeHandler(true);\n });\n\n return (\n <PopoverPrimitive.Root\n {...scope}\n open={isOpen}\n onOpenChange={openChangeHandler}\n {...rest}\n />\n );\n};\n\nAssistantModalPrimitiveRoot.displayName = \"AssistantModalPrimitive.Root\";\n"],"mappings":";;;;;;;;AAcA,MAAaS,+BAETI,OAAA;CAAA,MAAAC,IAAAb,EAAA,EAAA;CAAA,IAAAc;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAN,EAAA,OAAAD,IAAA;EAAC,CAAA,CAAAE,uBAAAM,aAAAF,IAAAP,yBAAAQ,IAAAH,MAAAD,cAAA,GAAAE,QAAAL;EAO4CC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAA;EAAAL,wBAAAD,EAAA;EAAAE,eAAAF,EAAA;EAAAG,OAAAH,EAAA;EAAAI,OAAAJ,EAAA;EAAAK,KAAAL,EAAA;EAAAM,KAAAN,EAAA;CAAA;CAL/C,MAAAO,cAAAF,OAAAG,KAAAA,IAAA,QAAAH;CACA,MAAAP,0BAAAQ,OAAAE,KAAAA,IAAA,OAAAF;CAKA,MAAAG,QAAchB,gBAAgBQ,qBAAqB;CAEnD,MAAA,CAAAS,WAAAC,WAA6BtB,SAASkB,WAAW;CACjD,MAAAK,SAAeT,QAAAO;CAAkB,IAAAG;CAAA,IAAAb,EAAA,OAAAE,cAAA;EAEPW,MAAAC,WAAA;GACxBZ,eAAeC,MAAI;GACnBQ,QAAQR,MAAI;EAAC;EACdH,EAAA,KAAAE;EAAAF,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAHD,MAAAe,oBAA0BF;CAGxB,IAAAG;CAAA,IAAAhB,EAAA,OAAAY,UAAAZ,EAAA,QAAAe,qBAAAf,EAAA,QAAAF,yBAAA;EAE6BkB,WAAA;GAC7B,IAAIlB,2BAAA,CAA4Bc,QAAQG,kBAAkB,IAAI;EAAE;EACjEf,EAAA,KAAAY;EAAAZ,EAAA,MAAAe;EAAAf,EAAA,MAAAF;EAAAE,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAFDN,YAAY,mBAAmBsB,EAE9B;CAAC,IAAAC;CAAA,IAAAjB,EAAA,QAAAY,UAAAZ,EAAA,QAAAe,qBAAAf,EAAA,QAAAI,QAAAJ,EAAA,QAAAS,OAAA;EAGAQ,KAAA,oBAAAG,QAAA,MAAA;GAAA,GACMX;GACEG,MAAAA;GACQG,cAAAA;GAAiB,GAC3BX;EAAI,CAAA;EACRJ,EAAA,MAAAY;EAAAZ,EAAA,MAAAe;EAAAf,EAAA,MAAAI;EAAAJ,EAAA,MAAAS;EAAAT,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,OALFiB;AAKE;AAINtB,4BAA4BuB,cAAc"}
@@ -1,5 +1,7 @@
1
1
  export { AttachmentPrimitiveRoot as Root } from "./attachment/AttachmentRoot.js";
2
- export { AttachmentPrimitiveThumb as unstable_Thumb } from "./attachment/AttachmentThumb.js";
2
+ export {
3
+ /** @deprecated Experimental since 2024-10-10. Not scheduled for removal; the API may change in any release. */
4
+ AttachmentPrimitiveThumb as unstable_Thumb, } from "./attachment/AttachmentThumb.js";
3
5
  export { AttachmentPrimitiveName as Name } from "./attachment/AttachmentName.js";
4
6
  export { AttachmentPrimitiveRemove as Remove } from "./attachment/AttachmentRemove.js";
5
7
  //# sourceMappingURL=attachment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/primitives/attachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC;AAC9E,OAAO,EAAE,wBAAwB,IAAI,cAAc,EAAE,wCAAqC;AAC1F,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC;AAC9E,OAAO,EAAE,yBAAyB,IAAI,MAAM,EAAE,yCAAsC"}
1
+ {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/primitives/attachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC;AAC9E,OAAO;AACL,+GAA+G;AAC/G,wBAAwB,IAAI,cAAc,GAC3C,wCAAqC;AACtC,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC;AAC9E,OAAO,EAAE,yBAAyB,IAAI,MAAM,EAAE,yCAAsC"}
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.js","names":["AttachmentPrimitiveRoot","Root","AttachmentPrimitiveThumb","unstable_Thumb","AttachmentPrimitiveName","Name","AttachmentPrimitiveRemove","Remove"],"sources":["../../src/primitives/attachment.ts"],"sourcesContent":["export { AttachmentPrimitiveRoot as Root } from \"./attachment/AttachmentRoot\";\nexport { AttachmentPrimitiveThumb as unstable_Thumb } from \"./attachment/AttachmentThumb\";\nexport { AttachmentPrimitiveName as Name } from \"./attachment/AttachmentName\";\nexport { AttachmentPrimitiveRemove as Remove } from \"./attachment/AttachmentRemove\";\n"],"mappings":""}
1
+ {"version":3,"file":"attachment.js","names":["AttachmentPrimitiveRoot","Root","AttachmentPrimitiveThumb","unstable_Thumb","AttachmentPrimitiveName","Name","AttachmentPrimitiveRemove","Remove"],"sources":["../../src/primitives/attachment.ts"],"sourcesContent":["export { AttachmentPrimitiveRoot as Root } from \"./attachment/AttachmentRoot\";\nexport {\n /** @deprecated Experimental since 2024-10-10. Not scheduled for removal; the API may change in any release. */\n AttachmentPrimitiveThumb as unstable_Thumb,\n} from \"./attachment/AttachmentThumb\";\nexport { AttachmentPrimitiveName as Name } from \"./attachment/AttachmentName\";\nexport { AttachmentPrimitiveRemove as Remove } from \"./attachment/AttachmentRemove\";\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerAttachmentDropzone.d.ts","sourceRoot":"","sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,yBAAiB,mCAAmC,CAAC;IACnD,KAAY,OAAO,GAAG,cAAc,CAAC;IACrC,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;QACzD,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;QAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,mCAAmC;cANlC,OAAO,GAAG,SAAS;aACpB,YAAY,GAAG,SAAS;eACtB,OAAO,GAAG,SAAS;wCA2GhC,CAAC"}
1
+ {"version":3,"file":"ComposerAttachmentDropzone.d.ts","sourceRoot":"","sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,yBAAiB,mCAAmC,CAAC;IACnD,KAAY,OAAO,GAAG,cAAc,CAAC;IACrC,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;QACzD,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;QAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,mCAAmC;cANlC,OAAO,GAAG,SAAS;aACpB,YAAY,GAAG,SAAS;eACtB,OAAO,GAAG,SAAS;wCA6GhC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { renderSlot } from "../../utils/Primitive.js";
3
3
  import { forwardRef, isValidElement, useCallback, useEffect, useState } from "@assistant-ui/tap/react-shim";
4
- import { useAui } from "@assistant-ui/store";
4
+ import { useAui, useAuiState } from "@assistant-ui/store";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { composeEventHandlers } from "radix-ui/internal";
7
7
  import { Slot } from "radix-ui";
@@ -9,44 +9,46 @@ import { Slot } from "radix-ui";
9
9
  const ComposerPrimitiveAttachmentDropzone = forwardRef(({ disabled, asChild = false, render, children, ...rest }, ref) => {
10
10
  const [isDragging, setIsDragging] = useState(false);
11
11
  const aui = useAui();
12
+ const disabledByThread = useAuiState((s) => s.thread.isDisabled);
13
+ const isDisabled = disabled || disabledByThread;
12
14
  useEffect(() => {
13
- if (!disabled) return;
15
+ if (!isDisabled) return;
14
16
  setIsDragging(false);
15
- }, [disabled]);
17
+ }, [isDisabled]);
16
18
  const handleDragEnterCapture = useCallback((e) => {
17
19
  if (!e.dataTransfer.types.includes("Files")) return;
18
20
  e.preventDefault();
19
- if (disabled || !aui.thread.getState().capabilities.attachments) {
21
+ if (isDisabled || !aui.thread.getState().capabilities.attachments) {
20
22
  e.dataTransfer.dropEffect = "none";
21
23
  return;
22
24
  }
23
25
  setIsDragging(true);
24
- }, [disabled, aui]);
26
+ }, [isDisabled, aui]);
25
27
  const handleDragOverCapture = useCallback((e_0) => {
26
28
  if (!e_0.dataTransfer.types.includes("Files")) return;
27
29
  e_0.preventDefault();
28
- if (disabled || !aui.thread.getState().capabilities.attachments) {
30
+ if (isDisabled || !aui.thread.getState().capabilities.attachments) {
29
31
  e_0.dataTransfer.dropEffect = "none";
30
32
  return;
31
33
  }
32
34
  if (!isDragging) setIsDragging(true);
33
35
  }, [
34
- disabled,
36
+ isDisabled,
35
37
  isDragging,
36
38
  aui
37
39
  ]);
38
40
  const handleDragLeaveCapture = useCallback((e_1) => {
39
- if (disabled) return;
41
+ if (isDisabled) return;
40
42
  e_1.preventDefault();
41
43
  const next = e_1.relatedTarget;
42
44
  if (next && e_1.currentTarget.contains(next)) return;
43
45
  setIsDragging(false);
44
- }, [disabled]);
46
+ }, [isDisabled]);
45
47
  const handleDrop = useCallback(async (e_2) => {
46
48
  setIsDragging(false);
47
49
  if (!e_2.dataTransfer.types.includes("Files")) return;
48
50
  e_2.preventDefault();
49
- if (disabled) return;
51
+ if (isDisabled) return;
50
52
  const files = Array.from(e_2.dataTransfer.files);
51
53
  if (!aui.thread.getState().capabilities.attachments || files.length === 0) return;
52
54
  await Promise.all(files.map(async (file) => {
@@ -54,9 +56,9 @@ const ComposerPrimitiveAttachmentDropzone = forwardRef(({ disabled, asChild = fa
54
56
  await aui.composer.addAttachment(file);
55
57
  } catch {}
56
58
  }));
57
- }, [disabled, aui]);
59
+ }, [isDisabled, aui]);
58
60
  const mergedProps = {
59
- ...isDragging && !disabled ? { "data-dragging": "true" } : null,
61
+ ...isDragging && !isDisabled ? { "data-dragging": "true" } : null,
60
62
  ...rest,
61
63
  onDragEnterCapture: composeEventHandlers(rest.onDragEnterCapture, handleDragEnterCapture),
62
64
  onDragOverCapture: composeEventHandlers(rest.onDragOverCapture, handleDragOverCapture),