@ai-sdk/react 4.0.116 → 4.0.119
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/index.js +110 -178
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @ai-sdk/react
|
|
2
2
|
|
|
3
|
+
## 4.0.119
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [af9597b]
|
|
8
|
+
- Updated dependencies [bc49f78]
|
|
9
|
+
- ai@7.0.116
|
|
10
|
+
- @ai-sdk/provider-utils@5.0.49
|
|
11
|
+
- @ai-sdk/mcp@2.0.60
|
|
12
|
+
|
|
13
|
+
## 4.0.118
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [be877ff]
|
|
18
|
+
- Updated dependencies [be877ff]
|
|
19
|
+
- Updated dependencies [be877ff]
|
|
20
|
+
- @ai-sdk/provider-utils@5.0.48
|
|
21
|
+
- @ai-sdk/mcp@2.0.59
|
|
22
|
+
- ai@7.0.115
|
|
23
|
+
|
|
24
|
+
## 4.0.117
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [b5679a7]
|
|
29
|
+
- Updated dependencies [1ffd453]
|
|
30
|
+
- Updated dependencies [ca31b89]
|
|
31
|
+
- ai@7.0.114
|
|
32
|
+
- @ai-sdk/mcp@2.0.58
|
|
33
|
+
|
|
3
34
|
## 4.0.116
|
|
4
35
|
|
|
5
36
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
var __accessCheck = (obj, member, msg) => {
|
|
2
|
-
if (!member.has(obj))
|
|
3
|
-
throw TypeError("Cannot " + msg);
|
|
4
|
-
};
|
|
5
|
-
var __privateGet = (obj, member, getter) => {
|
|
6
|
-
__accessCheck(obj, member, "read from private field");
|
|
7
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
-
};
|
|
9
|
-
var __privateAdd = (obj, member, value) => {
|
|
10
|
-
if (member.has(obj))
|
|
11
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
-
};
|
|
14
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
-
__accessCheck(obj, member, "write to private field");
|
|
16
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
-
return value;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
1
|
// src/use-object.ts
|
|
21
2
|
import {
|
|
22
3
|
isAbortError,
|
|
@@ -45,7 +26,7 @@ function useObject({
|
|
|
45
26
|
credentials
|
|
46
27
|
}) {
|
|
47
28
|
const hookId = useId();
|
|
48
|
-
const completionId = id
|
|
29
|
+
const completionId = id ?? hookId;
|
|
49
30
|
const { data, mutate } = useSWR(
|
|
50
31
|
[completionId, "object"],
|
|
51
32
|
null,
|
|
@@ -55,10 +36,9 @@ function useObject({
|
|
|
55
36
|
const [isLoading, setIsLoading] = useState(false);
|
|
56
37
|
const abortControllerRef = useRef(null);
|
|
57
38
|
const stop = useCallback(() => {
|
|
58
|
-
var _a;
|
|
59
39
|
try {
|
|
60
|
-
|
|
61
|
-
} catch
|
|
40
|
+
abortControllerRef.current?.abort();
|
|
41
|
+
} catch {
|
|
62
42
|
} finally {
|
|
63
43
|
setIsLoading(false);
|
|
64
44
|
abortControllerRef.current = null;
|
|
@@ -71,7 +51,7 @@ function useObject({
|
|
|
71
51
|
setIsLoading(true);
|
|
72
52
|
abortControllerRef.current = abortController;
|
|
73
53
|
const resolvedHeaders = await resolve(headers);
|
|
74
|
-
const actualFetch = fetch2
|
|
54
|
+
const actualFetch = fetch2 ?? getOriginalFetch();
|
|
75
55
|
const response = await actualFetch(api, {
|
|
76
56
|
method: "POST",
|
|
77
57
|
headers: {
|
|
@@ -147,7 +127,7 @@ function useObject({
|
|
|
147
127
|
};
|
|
148
128
|
return {
|
|
149
129
|
submit,
|
|
150
|
-
object: data
|
|
130
|
+
object: data?.object,
|
|
151
131
|
error,
|
|
152
132
|
isLoading,
|
|
153
133
|
stop,
|
|
@@ -188,30 +168,28 @@ function cloneMetadata(metadata) {
|
|
|
188
168
|
}
|
|
189
169
|
return metadata;
|
|
190
170
|
}
|
|
191
|
-
var _messages, _status, _error, _messagesCallbacks, _statusCallbacks, _errorCallbacks, _callMessagesCallbacks, _callStatusCallbacks, _callErrorCallbacks;
|
|
192
171
|
var ReactChatState = class {
|
|
193
172
|
constructor(initialMessages = []) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
__privateAdd(this, _errorCallbacks, /* @__PURE__ */ new Set());
|
|
173
|
+
this.#status = "ready";
|
|
174
|
+
this.#error = void 0;
|
|
175
|
+
this.#messagesCallbacks = /* @__PURE__ */ new Set();
|
|
176
|
+
this.#statusCallbacks = /* @__PURE__ */ new Set();
|
|
177
|
+
this.#errorCallbacks = /* @__PURE__ */ new Set();
|
|
200
178
|
this.pushMessage = (message) => {
|
|
201
|
-
|
|
202
|
-
|
|
179
|
+
this.#messages = this.#messages.concat(message);
|
|
180
|
+
this.#callMessagesCallbacks();
|
|
203
181
|
};
|
|
204
182
|
this.popMessage = () => {
|
|
205
|
-
|
|
206
|
-
|
|
183
|
+
this.#messages = this.#messages.slice(0, -1);
|
|
184
|
+
this.#callMessagesCallbacks();
|
|
207
185
|
};
|
|
208
186
|
this.replaceMessage = (index, message) => {
|
|
209
|
-
|
|
210
|
-
...
|
|
187
|
+
this.#messages = [
|
|
188
|
+
...this.#messages.slice(0, index),
|
|
211
189
|
this.snapshot(message),
|
|
212
|
-
...
|
|
213
|
-
]
|
|
214
|
-
|
|
190
|
+
...this.#messages.slice(index + 1)
|
|
191
|
+
];
|
|
192
|
+
this.#callMessagesCallbacks();
|
|
215
193
|
};
|
|
216
194
|
this.snapshot = (value) => {
|
|
217
195
|
if (value == null || typeof value !== "object" || !("parts" in value) || !Array.isArray(value.parts)) {
|
|
@@ -229,78 +207,76 @@ var ReactChatState = class {
|
|
|
229
207
|
};
|
|
230
208
|
this["~registerMessagesCallback"] = (onChange, throttleWaitMs) => {
|
|
231
209
|
const callback = throttleWaitMs ? throttle(onChange, throttleWaitMs) : onChange;
|
|
232
|
-
|
|
210
|
+
this.#messagesCallbacks.add(callback);
|
|
233
211
|
return () => {
|
|
234
|
-
|
|
212
|
+
this.#messagesCallbacks.delete(callback);
|
|
235
213
|
};
|
|
236
214
|
};
|
|
237
215
|
this["~registerStatusCallback"] = (onChange) => {
|
|
238
|
-
|
|
216
|
+
this.#statusCallbacks.add(onChange);
|
|
239
217
|
return () => {
|
|
240
|
-
|
|
218
|
+
this.#statusCallbacks.delete(onChange);
|
|
241
219
|
};
|
|
242
220
|
};
|
|
243
221
|
this["~registerErrorCallback"] = (onChange) => {
|
|
244
|
-
|
|
222
|
+
this.#errorCallbacks.add(onChange);
|
|
245
223
|
return () => {
|
|
246
|
-
|
|
224
|
+
this.#errorCallbacks.delete(onChange);
|
|
247
225
|
};
|
|
248
226
|
};
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
|
|
227
|
+
this.#callMessagesCallbacks = () => {
|
|
228
|
+
this.#messagesCallbacks.forEach((callback) => callback());
|
|
229
|
+
};
|
|
230
|
+
this.#callStatusCallbacks = () => {
|
|
231
|
+
this.#statusCallbacks.forEach((callback) => callback());
|
|
232
|
+
};
|
|
233
|
+
this.#callErrorCallbacks = () => {
|
|
234
|
+
this.#errorCallbacks.forEach((callback) => callback());
|
|
235
|
+
};
|
|
236
|
+
this.#messages = initialMessages;
|
|
259
237
|
}
|
|
238
|
+
#messages;
|
|
239
|
+
#status;
|
|
240
|
+
#error;
|
|
241
|
+
#messagesCallbacks;
|
|
242
|
+
#statusCallbacks;
|
|
243
|
+
#errorCallbacks;
|
|
260
244
|
get status() {
|
|
261
|
-
return
|
|
245
|
+
return this.#status;
|
|
262
246
|
}
|
|
263
247
|
set status(newStatus) {
|
|
264
|
-
|
|
265
|
-
|
|
248
|
+
this.#status = newStatus;
|
|
249
|
+
this.#callStatusCallbacks();
|
|
266
250
|
}
|
|
267
251
|
get error() {
|
|
268
|
-
return
|
|
252
|
+
return this.#error;
|
|
269
253
|
}
|
|
270
254
|
set error(newError) {
|
|
271
|
-
|
|
272
|
-
|
|
255
|
+
this.#error = newError;
|
|
256
|
+
this.#callErrorCallbacks();
|
|
273
257
|
}
|
|
274
258
|
get messages() {
|
|
275
|
-
return
|
|
259
|
+
return this.#messages;
|
|
276
260
|
}
|
|
277
261
|
set messages(newMessages) {
|
|
278
|
-
|
|
279
|
-
|
|
262
|
+
this.#messages = [...newMessages];
|
|
263
|
+
this.#callMessagesCallbacks();
|
|
280
264
|
}
|
|
265
|
+
#callMessagesCallbacks;
|
|
266
|
+
#callStatusCallbacks;
|
|
267
|
+
#callErrorCallbacks;
|
|
281
268
|
};
|
|
282
|
-
_messages = new WeakMap();
|
|
283
|
-
_status = new WeakMap();
|
|
284
|
-
_error = new WeakMap();
|
|
285
|
-
_messagesCallbacks = new WeakMap();
|
|
286
|
-
_statusCallbacks = new WeakMap();
|
|
287
|
-
_errorCallbacks = new WeakMap();
|
|
288
|
-
_callMessagesCallbacks = new WeakMap();
|
|
289
|
-
_callStatusCallbacks = new WeakMap();
|
|
290
|
-
_callErrorCallbacks = new WeakMap();
|
|
291
|
-
var _state;
|
|
292
269
|
var Chat = class extends AbstractChat {
|
|
293
270
|
constructor({ messages, ...init }) {
|
|
294
271
|
const state = new ReactChatState(messages);
|
|
295
272
|
super({ ...init, state });
|
|
296
|
-
|
|
297
|
-
this["~
|
|
298
|
-
this["~
|
|
299
|
-
this
|
|
300
|
-
__privateSet(this, _state, state);
|
|
273
|
+
this["~registerMessagesCallback"] = (onChange, throttleWaitMs) => this.#state["~registerMessagesCallback"](onChange, throttleWaitMs);
|
|
274
|
+
this["~registerStatusCallback"] = (onChange) => this.#state["~registerStatusCallback"](onChange);
|
|
275
|
+
this["~registerErrorCallback"] = (onChange) => this.#state["~registerErrorCallback"](onChange);
|
|
276
|
+
this.#state = state;
|
|
301
277
|
}
|
|
278
|
+
#state;
|
|
302
279
|
};
|
|
303
|
-
_state = new WeakMap();
|
|
304
280
|
|
|
305
281
|
// src/use-chat.ts
|
|
306
282
|
function useChat({
|
|
@@ -309,7 +285,7 @@ function useChat({
|
|
|
309
285
|
resume = false,
|
|
310
286
|
...options
|
|
311
287
|
} = {}) {
|
|
312
|
-
const throttleWaitMs = throttle2
|
|
288
|
+
const throttleWaitMs = throttle2 ?? experimental_throttle;
|
|
313
289
|
const latestRef = useRef2({});
|
|
314
290
|
if (!("chat" in options)) {
|
|
315
291
|
latestRef.current = {
|
|
@@ -322,36 +298,18 @@ function useChat({
|
|
|
322
298
|
};
|
|
323
299
|
}
|
|
324
300
|
let defaultTransport;
|
|
325
|
-
const getTransport = () =>
|
|
326
|
-
var _a;
|
|
327
|
-
return (_a = latestRef.current.transport) != null ? _a : defaultTransport != null ? defaultTransport : defaultTransport = new DefaultChatTransport();
|
|
328
|
-
};
|
|
301
|
+
const getTransport = () => latestRef.current.transport ?? (defaultTransport ??= new DefaultChatTransport());
|
|
329
302
|
const chatOptions = {
|
|
330
303
|
...options,
|
|
331
304
|
transport: {
|
|
332
305
|
sendMessages: (sendOptions) => getTransport().sendMessages(sendOptions),
|
|
333
306
|
reconnectToStream: (reconnectOptions) => getTransport().reconnectToStream(reconnectOptions)
|
|
334
307
|
},
|
|
335
|
-
onToolCall: (arg) =>
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
var _a, _b;
|
|
341
|
-
return (_b = (_a = latestRef.current).onData) == null ? void 0 : _b.call(_a, arg);
|
|
342
|
-
},
|
|
343
|
-
onFinish: (arg) => {
|
|
344
|
-
var _a, _b;
|
|
345
|
-
return (_b = (_a = latestRef.current).onFinish) == null ? void 0 : _b.call(_a, arg);
|
|
346
|
-
},
|
|
347
|
-
onError: (arg) => {
|
|
348
|
-
var _a, _b;
|
|
349
|
-
return (_b = (_a = latestRef.current).onError) == null ? void 0 : _b.call(_a, arg);
|
|
350
|
-
},
|
|
351
|
-
sendAutomaticallyWhen: (arg) => {
|
|
352
|
-
var _a, _b, _c;
|
|
353
|
-
return (_c = (_b = (_a = latestRef.current).sendAutomaticallyWhen) == null ? void 0 : _b.call(_a, arg)) != null ? _c : false;
|
|
354
|
-
}
|
|
308
|
+
onToolCall: (arg) => latestRef.current.onToolCall?.(arg),
|
|
309
|
+
onData: (arg) => latestRef.current.onData?.(arg),
|
|
310
|
+
onFinish: (arg) => latestRef.current.onFinish?.(arg),
|
|
311
|
+
onError: (arg) => latestRef.current.onError?.(arg),
|
|
312
|
+
sendAutomaticallyWhen: (arg) => latestRef.current.sendAutomaticallyWhen?.(arg) ?? false
|
|
355
313
|
};
|
|
356
314
|
const chatKey = "chat" in options ? options.chat : options.id;
|
|
357
315
|
const { chat, isExternallyManaged } = useMemo(
|
|
@@ -477,7 +435,7 @@ function useCompletion({
|
|
|
477
435
|
throttle: throttleWait,
|
|
478
436
|
experimental_throttle
|
|
479
437
|
} = {}) {
|
|
480
|
-
const throttleWaitMs = throttleWait
|
|
438
|
+
const throttleWaitMs = throttleWait ?? experimental_throttle;
|
|
481
439
|
const hookId = useId2();
|
|
482
440
|
const completionId = id || hookId;
|
|
483
441
|
const { data, mutate } = useSWR2([api, completionId], null, {
|
|
@@ -512,11 +470,11 @@ function useCompletion({
|
|
|
512
470
|
credentials: extraMetadataRef.current.credentials,
|
|
513
471
|
headers: {
|
|
514
472
|
...normalizeHeaders2(extraMetadataRef.current.headers),
|
|
515
|
-
...normalizeHeaders2(options
|
|
473
|
+
...normalizeHeaders2(options?.headers)
|
|
516
474
|
},
|
|
517
475
|
body: {
|
|
518
476
|
...extraMetadataRef.current.body,
|
|
519
|
-
...options
|
|
477
|
+
...options?.body
|
|
520
478
|
},
|
|
521
479
|
streamProtocol,
|
|
522
480
|
fetch: fetch2,
|
|
@@ -550,8 +508,7 @@ function useCompletion({
|
|
|
550
508
|
]
|
|
551
509
|
);
|
|
552
510
|
const stop = useCallback3(() => {
|
|
553
|
-
|
|
554
|
-
(_a = abortControllerRef.current) == null ? void 0 : _a.abort();
|
|
511
|
+
abortControllerRef.current?.abort();
|
|
555
512
|
}, []);
|
|
556
513
|
const setCompletion = useCallback3(
|
|
557
514
|
(completion2) => {
|
|
@@ -568,8 +525,7 @@ function useCompletion({
|
|
|
568
525
|
const [input, setInput] = useState2(initialInput);
|
|
569
526
|
const handleSubmit = useCallback3(
|
|
570
527
|
(event) => {
|
|
571
|
-
|
|
572
|
-
(_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);
|
|
528
|
+
event?.preventDefault?.();
|
|
573
529
|
if (!input) {
|
|
574
530
|
return;
|
|
575
531
|
}
|
|
@@ -663,7 +619,6 @@ var RealtimeStore = /* @__PURE__ */ (() => class RealtimeStore extends AbstractR
|
|
|
663
619
|
}
|
|
664
620
|
})();
|
|
665
621
|
function useRealtime(options) {
|
|
666
|
-
var _a;
|
|
667
622
|
const ownerRef = useRef4(null);
|
|
668
623
|
const {
|
|
669
624
|
model,
|
|
@@ -680,7 +635,7 @@ function useRealtime(options) {
|
|
|
680
635
|
onError
|
|
681
636
|
} = options;
|
|
682
637
|
const { token, websocket, session: sessionEndpoint } = api;
|
|
683
|
-
const protocols = JSON.stringify(
|
|
638
|
+
const protocols = JSON.stringify(api.protocols ?? []);
|
|
684
639
|
const rt = useMemo2(() => {
|
|
685
640
|
const store = new RealtimeStore({
|
|
686
641
|
model,
|
|
@@ -695,14 +650,8 @@ function useRealtime(options) {
|
|
|
695
650
|
sampleRate,
|
|
696
651
|
maxEvents,
|
|
697
652
|
maxPlaybackBufferSeconds,
|
|
698
|
-
onEvent: (...args) =>
|
|
699
|
-
|
|
700
|
-
return ((_a2 = ownerRef.current) == null ? void 0 : _a2.store) === store ? (_c = (_b = ownerRef.current).onEvent) == null ? void 0 : _c.call(_b, ...args) : void 0;
|
|
701
|
-
},
|
|
702
|
-
onError: (...args) => {
|
|
703
|
-
var _a2, _b, _c;
|
|
704
|
-
return ((_a2 = ownerRef.current) == null ? void 0 : _a2.store) === store ? (_c = (_b = ownerRef.current).onError) == null ? void 0 : _c.call(_b, ...args) : void 0;
|
|
705
|
-
}
|
|
653
|
+
onEvent: (...args) => ownerRef.current?.store === store ? ownerRef.current.onEvent?.(...args) : void 0,
|
|
654
|
+
onError: (...args) => ownerRef.current?.store === store ? ownerRef.current.onError?.(...args) : void 0
|
|
706
655
|
});
|
|
707
656
|
return store;
|
|
708
657
|
}, [
|
|
@@ -721,10 +670,7 @@ function useRealtime(options) {
|
|
|
721
670
|
]);
|
|
722
671
|
useInsertionEffect(() => {
|
|
723
672
|
ownerRef.current = { store: rt, onToolCall, onEvent, onError };
|
|
724
|
-
rt.onToolCall = onToolCall == null ? void 0 : (...args) =>
|
|
725
|
-
var _a2, _b, _c;
|
|
726
|
-
return ((_a2 = ownerRef.current) == null ? void 0 : _a2.store) === rt ? (_c = (_b = ownerRef.current).onToolCall) == null ? void 0 : _c.call(_b, ...args) : void 0;
|
|
727
|
-
};
|
|
673
|
+
rt.onToolCall = onToolCall == null ? void 0 : (...args) => ownerRef.current?.store === rt ? ownerRef.current.onToolCall?.(...args) : void 0;
|
|
728
674
|
return () => {
|
|
729
675
|
ownerRef.current = null;
|
|
730
676
|
};
|
|
@@ -850,7 +796,7 @@ function assertOpenLinkParams(params) {
|
|
|
850
796
|
let scheme;
|
|
851
797
|
try {
|
|
852
798
|
scheme = new URL(params.url).protocol;
|
|
853
|
-
} catch
|
|
799
|
+
} catch {
|
|
854
800
|
throw new Error(`Invalid ui/open-link url: ${params.url}`);
|
|
855
801
|
}
|
|
856
802
|
if (scheme !== "https:" && scheme !== "http:" && scheme !== "mailto:") {
|
|
@@ -1003,13 +949,12 @@ var MCPAppBridge = class {
|
|
|
1003
949
|
* Runs a handler for an iframe request and posts the JSON-RPC response.
|
|
1004
950
|
*/
|
|
1005
951
|
async handleRequest(request) {
|
|
1006
|
-
var _a, _b;
|
|
1007
952
|
try {
|
|
1008
953
|
const result = await this.getRequestResult(request);
|
|
1009
954
|
this.post({ jsonrpc: "2.0", id: request.id, result });
|
|
1010
955
|
} catch (error) {
|
|
1011
956
|
const normalizedError = toError(error);
|
|
1012
|
-
|
|
957
|
+
this.handlers.onError?.(normalizedError);
|
|
1013
958
|
this.post({
|
|
1014
959
|
jsonrpc: "2.0",
|
|
1015
960
|
id: request.id,
|
|
@@ -1021,7 +966,6 @@ var MCPAppBridge = class {
|
|
|
1021
966
|
* Maps supported iframe request methods to host callbacks.
|
|
1022
967
|
*/
|
|
1023
968
|
async getRequestResult(request) {
|
|
1024
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1025
969
|
switch (request.method) {
|
|
1026
970
|
case "ui/initialize":
|
|
1027
971
|
return {
|
|
@@ -1062,14 +1006,13 @@ var MCPAppBridge = class {
|
|
|
1062
1006
|
}
|
|
1063
1007
|
return this.handlers.openLink(assertOpenLinkParams(request.params));
|
|
1064
1008
|
case "ui/message":
|
|
1065
|
-
return
|
|
1009
|
+
return this.handlers.sendMessage?.(request.params) ?? {};
|
|
1066
1010
|
case "ui/update-model-context":
|
|
1067
|
-
return
|
|
1011
|
+
return this.handlers.updateModelContext?.(request.params) ?? {};
|
|
1068
1012
|
case "ui/request-display-mode":
|
|
1069
|
-
return
|
|
1070
|
-
_g,
|
|
1013
|
+
return this.handlers.requestDisplayMode?.(
|
|
1071
1014
|
assertDisplayModeParams(request.params)
|
|
1072
|
-
)
|
|
1015
|
+
) ?? { mode: this.hostContext.displayMode ?? "inline" };
|
|
1073
1016
|
default:
|
|
1074
1017
|
throw new Error(`Unsupported MCP App method: ${request.method}`);
|
|
1075
1018
|
}
|
|
@@ -1078,24 +1021,22 @@ var MCPAppBridge = class {
|
|
|
1078
1021
|
* Handles iframe lifecycle and telemetry notifications.
|
|
1079
1022
|
*/
|
|
1080
1023
|
handleNotification(notification) {
|
|
1081
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1082
1024
|
switch (notification.method) {
|
|
1083
1025
|
case "ui/notifications/initialized":
|
|
1084
1026
|
this.initialized = true;
|
|
1085
1027
|
this.flushNotifications();
|
|
1086
|
-
|
|
1028
|
+
this.handlers.onInitialized?.();
|
|
1087
1029
|
break;
|
|
1088
1030
|
case "ui/notifications/size-changed":
|
|
1089
|
-
|
|
1090
|
-
_c,
|
|
1031
|
+
this.handlers.onSizeChange?.(
|
|
1091
1032
|
notification.params
|
|
1092
1033
|
);
|
|
1093
1034
|
break;
|
|
1094
1035
|
case "ui/notifications/request-teardown":
|
|
1095
|
-
|
|
1036
|
+
this.handlers.onRequestTeardown?.(notification.params);
|
|
1096
1037
|
break;
|
|
1097
1038
|
case "notifications/message":
|
|
1098
|
-
|
|
1039
|
+
this.handlers.onLog?.(notification.params);
|
|
1099
1040
|
break;
|
|
1100
1041
|
}
|
|
1101
1042
|
}
|
|
@@ -1142,7 +1083,7 @@ var MCPAppBridge = class {
|
|
|
1142
1083
|
var ALLOWED_CSP_SCHEMES = /* @__PURE__ */ new Set(["https:", "wss:"]);
|
|
1143
1084
|
function sanitizeCSPSources(sources) {
|
|
1144
1085
|
const result = [];
|
|
1145
|
-
for (const source of sources
|
|
1086
|
+
for (const source of sources ?? []) {
|
|
1146
1087
|
if (typeof source !== "string") {
|
|
1147
1088
|
continue;
|
|
1148
1089
|
}
|
|
@@ -1153,7 +1094,7 @@ function sanitizeCSPSources(sources) {
|
|
|
1153
1094
|
continue;
|
|
1154
1095
|
}
|
|
1155
1096
|
origin = url.origin;
|
|
1156
|
-
} catch
|
|
1097
|
+
} catch {
|
|
1157
1098
|
continue;
|
|
1158
1099
|
}
|
|
1159
1100
|
if (/["'`\s;,]/.test(origin)) {
|
|
@@ -1205,8 +1146,7 @@ function getMCPAppAllowAttribute(permissions, allowedPermissions) {
|
|
|
1205
1146
|
// src/mcp-apps/utils.ts
|
|
1206
1147
|
import { isJSONObject as isJSONObject2 } from "@ai-sdk/provider";
|
|
1207
1148
|
function getMCPAppFromToolPart(part) {
|
|
1208
|
-
|
|
1209
|
-
const rawAppMetadata = (_a = part.toolMetadata) == null ? void 0 : _a.app;
|
|
1149
|
+
const rawAppMetadata = part.toolMetadata?.app;
|
|
1210
1150
|
const appMetadata = isJSONObject2(rawAppMetadata) ? rawAppMetadata : void 0;
|
|
1211
1151
|
if (appMetadata == null || appMetadata.mimeType !== "text/html;profile=mcp-app" || typeof appMetadata.resourceUri !== "string" || !appMetadata.resourceUri.startsWith("ui://") || appMetadata.visibility != null && (!Array.isArray(appMetadata.visibility) || appMetadata.visibility.some(
|
|
1212
1152
|
(value) => value !== "model" && value !== "app"
|
|
@@ -1228,12 +1168,11 @@ function normalizeMCPAppToolResult(output) {
|
|
|
1228
1168
|
// src/mcp-apps/app-frame.tsx
|
|
1229
1169
|
import { jsx } from "react/jsx-runtime";
|
|
1230
1170
|
function deriveTargetOrigin(url) {
|
|
1231
|
-
var _a;
|
|
1232
1171
|
const location = typeof window !== "undefined" ? window.location : void 0;
|
|
1233
1172
|
try {
|
|
1234
|
-
return new URL(url, location
|
|
1235
|
-
} catch
|
|
1236
|
-
return
|
|
1173
|
+
return new URL(url, location?.href).origin;
|
|
1174
|
+
} catch {
|
|
1175
|
+
return location?.origin ?? "null";
|
|
1237
1176
|
}
|
|
1238
1177
|
}
|
|
1239
1178
|
function sendToolState({
|
|
@@ -1261,7 +1200,6 @@ function MCPAppFrame({
|
|
|
1261
1200
|
hostInfo,
|
|
1262
1201
|
hostContext
|
|
1263
1202
|
}) {
|
|
1264
|
-
var _a, _b, _c, _d, _e, _f;
|
|
1265
1203
|
const iframeRef = useRef5(null);
|
|
1266
1204
|
const bridgeRef = useRef5(void 0);
|
|
1267
1205
|
const inputRef = useRef5(input);
|
|
@@ -1272,20 +1210,19 @@ function MCPAppFrame({
|
|
|
1272
1210
|
outputRef.current = output;
|
|
1273
1211
|
hostContextRef.current = hostContext;
|
|
1274
1212
|
const sandboxUrl = String(sandbox.url);
|
|
1275
|
-
const targetOrigin =
|
|
1276
|
-
const resourceCSP = getMCPAppCSP(
|
|
1213
|
+
const targetOrigin = sandbox.targetOrigin ?? deriveTargetOrigin(sandboxUrl);
|
|
1214
|
+
const resourceCSP = getMCPAppCSP(resource.meta?.csp);
|
|
1277
1215
|
const resourceAllow = getMCPAppAllowAttribute(
|
|
1278
|
-
|
|
1216
|
+
resource.meta?.permissions,
|
|
1279
1217
|
sandbox.allowedPermissions
|
|
1280
1218
|
);
|
|
1281
|
-
const innerSandbox =
|
|
1219
|
+
const innerSandbox = sandbox.innerSandbox ?? MCP_APP_DEFAULT_INNER_SANDBOX;
|
|
1282
1220
|
const bridgeHandlers = useMemo3(
|
|
1283
1221
|
() => ({
|
|
1284
1222
|
...handlers,
|
|
1285
1223
|
onInitialized: () => {
|
|
1286
|
-
var _a2;
|
|
1287
1224
|
initializedRef.current = true;
|
|
1288
|
-
|
|
1225
|
+
handlers?.onInitialized?.();
|
|
1289
1226
|
sendToolState({
|
|
1290
1227
|
bridge: bridgeRef.current,
|
|
1291
1228
|
input: inputRef.current,
|
|
@@ -1299,7 +1236,7 @@ function MCPAppFrame({
|
|
|
1299
1236
|
bridgeHandlersRef.current = bridgeHandlers;
|
|
1300
1237
|
useEffect4(() => {
|
|
1301
1238
|
const iframe = iframeRef.current;
|
|
1302
|
-
const targetWindow = iframe
|
|
1239
|
+
const targetWindow = iframe?.contentWindow;
|
|
1303
1240
|
if (targetWindow == null) {
|
|
1304
1241
|
return;
|
|
1305
1242
|
}
|
|
@@ -1313,11 +1250,10 @@ function MCPAppFrame({
|
|
|
1313
1250
|
});
|
|
1314
1251
|
bridgeRef.current = bridge;
|
|
1315
1252
|
const onMessage = (event) => {
|
|
1316
|
-
var _a2;
|
|
1317
1253
|
if (!bridge.acceptsEvent(event)) {
|
|
1318
1254
|
return;
|
|
1319
1255
|
}
|
|
1320
|
-
if (
|
|
1256
|
+
if (event.data?.jsonrpc === "2.0" && event.data.method === "ui/notifications/sandbox-proxy-ready") {
|
|
1321
1257
|
bridge.sendSandboxResourceReady({
|
|
1322
1258
|
html: resource.html,
|
|
1323
1259
|
csp: resourceCSP,
|
|
@@ -1347,25 +1283,21 @@ function MCPAppFrame({
|
|
|
1347
1283
|
targetOrigin
|
|
1348
1284
|
]);
|
|
1349
1285
|
useEffect4(() => {
|
|
1350
|
-
|
|
1351
|
-
(_a2 = bridgeRef.current) == null ? void 0 : _a2.setHandlers(bridgeHandlers);
|
|
1286
|
+
bridgeRef.current?.setHandlers(bridgeHandlers);
|
|
1352
1287
|
}, [bridgeHandlers]);
|
|
1353
1288
|
useEffect4(() => {
|
|
1354
|
-
var _a2;
|
|
1355
1289
|
if (hostContext != null) {
|
|
1356
|
-
|
|
1290
|
+
bridgeRef.current?.setHostContext(hostContext);
|
|
1357
1291
|
}
|
|
1358
1292
|
}, [hostContext]);
|
|
1359
1293
|
useEffect4(() => {
|
|
1360
|
-
var _a2;
|
|
1361
1294
|
if (initializedRef.current && input !== void 0) {
|
|
1362
|
-
|
|
1295
|
+
bridgeRef.current?.sendToolInput(input);
|
|
1363
1296
|
}
|
|
1364
1297
|
}, [input]);
|
|
1365
1298
|
useEffect4(() => {
|
|
1366
|
-
var _a2;
|
|
1367
1299
|
if (initializedRef.current && output !== void 0) {
|
|
1368
|
-
|
|
1300
|
+
bridgeRef.current?.sendToolResult(normalizeMCPAppToolResult(output));
|
|
1369
1301
|
}
|
|
1370
1302
|
}, [output]);
|
|
1371
1303
|
return /* @__PURE__ */ jsx(
|
|
@@ -1373,12 +1305,12 @@ function MCPAppFrame({
|
|
|
1373
1305
|
{
|
|
1374
1306
|
ref: iframeRef,
|
|
1375
1307
|
title: "MCP App",
|
|
1376
|
-
"aria-label":
|
|
1308
|
+
"aria-label": sandbox.title ?? app.resourceUri,
|
|
1377
1309
|
src: sandboxUrl,
|
|
1378
1310
|
className: sandbox.className,
|
|
1379
1311
|
style: sandbox.style,
|
|
1380
1312
|
allow: resourceAllow,
|
|
1381
|
-
sandbox:
|
|
1313
|
+
sandbox: sandbox.outerSandbox ?? MCP_APP_DEFAULT_OUTER_SANDBOX
|
|
1382
1314
|
}
|
|
1383
1315
|
);
|
|
1384
1316
|
}
|
|
@@ -1407,11 +1339,11 @@ function MCPAppRenderer({
|
|
|
1407
1339
|
useEffect5(() => {
|
|
1408
1340
|
if (app != null) {
|
|
1409
1341
|
setCachedApp(
|
|
1410
|
-
(previous) =>
|
|
1342
|
+
(previous) => previous?.resourceUri === app.resourceUri ? previous : app
|
|
1411
1343
|
);
|
|
1412
1344
|
}
|
|
1413
|
-
}, [app
|
|
1414
|
-
const appForRender = app
|
|
1345
|
+
}, [app?.resourceUri]);
|
|
1346
|
+
const appForRender = app ?? cachedApp;
|
|
1415
1347
|
useEffect5(() => {
|
|
1416
1348
|
if (appForRender == null || resourceProp != null || loadResource == null) {
|
|
1417
1349
|
return;
|
|
@@ -1433,10 +1365,10 @@ function MCPAppRenderer({
|
|
|
1433
1365
|
return () => {
|
|
1434
1366
|
cancelled = true;
|
|
1435
1367
|
};
|
|
1436
|
-
}, [appForRender
|
|
1437
|
-
const loadedResourceForApp =
|
|
1438
|
-
const resource = resourceProp
|
|
1439
|
-
const error = resourceProp == null ? loadedResourceForApp
|
|
1368
|
+
}, [appForRender?.resourceUri, loadResource, resourceProp]);
|
|
1369
|
+
const loadedResourceForApp = loadedResource?.resourceUri === appForRender?.resourceUri ? loadedResource : void 0;
|
|
1370
|
+
const resource = resourceProp ?? loadedResourceForApp?.resource;
|
|
1371
|
+
const error = resourceProp == null ? loadedResourceForApp?.error : void 0;
|
|
1440
1372
|
if (appForRender == null || error != null || resource == null) {
|
|
1441
1373
|
return fallback;
|
|
1442
1374
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/use-object.ts","../src/use-chat.ts","../src/chat.react.ts","../src/throttle.ts","../src/use-completion.ts","../src/use-realtime.ts","../src/mcp-apps/app-renderer.tsx","../src/mcp-apps/app-frame.tsx","../src/mcp-apps/bridge.ts","../src/mcp-apps/sandbox.ts","../src/mcp-apps/utils.ts","../src/index.ts"],"sourcesContent":["import {\n isAbortError,\n resolve,\n normalizeHeaders,\n safeValidateTypes,\n type FetchFunction,\n type FlexibleSchema,\n type InferSchema,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n} from 'ai';\nimport { useCallback, useId, useRef, useState } from 'react';\nimport useSWR from 'swr';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => fetch;\n\nexport type UseObjectOptions<SCHEMA extends FlexibleSchema, RESULT> = {\n /**\n * The API endpoint. It should stream JSON that matches the schema as chunked text.\n */\n api: string;\n\n /**\n * A schema that defines the shape of the complete object.\n */\n schema: SCHEMA;\n\n /**\n * An unique identifier. If not provided, a random one will be\n * generated. When provided, the `useObject` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * An optional value for the initial object.\n */\n initialValue?: DeepPartial<RESULT>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Callback that is called when the stream has finished.\n */\n onFinish?: (event: {\n /**\n * The generated object (typed according to the schema).\n * Can be undefined if the final object does not match the schema.\n */\n object: RESULT | undefined;\n\n /**\n * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n */\n error: Error | undefined;\n }) => Promise<void> | void;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: (error: Error) => void;\n\n /**\n * Additional HTTP headers to be included in the request.\n * Can be a static object, a function that returns headers, or an async function\n * for dynamic auth tokens.\n */\n headers?: Resolvable<Record<string, string> | Headers>;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n};\n\nexport type UseObjectHelpers<RESULT, INPUT> = {\n /**\n * Calls the API with the provided input as JSON body.\n */\n submit: (input: INPUT) => void;\n\n /**\n * The current value for the generated object. Updated as the API streams JSON chunks.\n */\n object: DeepPartial<RESULT> | undefined;\n\n /**\n * The error object of the API request if any.\n */\n error: Error | undefined;\n\n /**\n * Flag that indicates whether an API request is in progress.\n */\n isLoading: boolean;\n\n /**\n * Abort the current request immediately, keep the current partial object if any.\n */\n stop: () => void;\n\n /**\n * Clear the object state.\n */\n clear: () => void;\n};\n\ntype ObjectState<RESULT> = {\n object: DeepPartial<RESULT> | undefined;\n};\n\nexport function useObject<\n SCHEMA extends FlexibleSchema,\n RESULT = InferSchema<SCHEMA>,\n INPUT = any,\n>({\n api,\n id,\n schema, // required, in the future we will use it for validation\n initialValue,\n fetch,\n onError,\n onFinish,\n headers,\n credentials,\n}: UseObjectOptions<SCHEMA, RESULT>): UseObjectHelpers<RESULT, INPUT> {\n // Generate an unique id if not provided.\n const hookId = useId();\n const completionId = id ?? hookId;\n\n // Store the completion state in SWR, using the completionId as the key to share states.\n const { data, mutate } = useSWR<ObjectState<RESULT>>(\n [completionId, 'object'],\n null,\n { fallbackData: { object: initialValue } },\n );\n\n const [error, setError] = useState<undefined | Error>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n\n // Abort controller to cancel the current API call.\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const stop = useCallback(() => {\n try {\n abortControllerRef.current?.abort();\n } catch {\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n }, []);\n\n const submit = async (input: INPUT) => {\n const abortController = new AbortController();\n\n try {\n clearObject();\n\n setIsLoading(true);\n\n abortControllerRef.current = abortController;\n\n // Resolve headers at request time (supports async functions for dynamic auth tokens)\n const resolvedHeaders = await resolve(headers);\n\n const actualFetch = fetch ?? getOriginalFetch();\n const response = await actualFetch(api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...normalizeHeaders(resolvedHeaders),\n },\n credentials,\n signal: abortController.signal,\n body: JSON.stringify(input),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) || 'Failed to fetch the response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n let accumulatedText = '';\n let latestObject: DeepPartial<RESULT> | undefined = undefined;\n\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream<string>({\n async write(chunk) {\n accumulatedText += chunk;\n\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value as DeepPartial<RESULT>;\n\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n\n mutate({ object: currentObject });\n }\n },\n\n async close() {\n if (abortControllerRef.current === abortController) {\n setIsLoading(false);\n }\n\n if (onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(schema),\n });\n\n await onFinish(\n validationResult.success\n ? { object: validationResult.value, error: undefined }\n : { object: undefined, error: validationResult.error },\n );\n }\n\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n },\n }),\n );\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n if (onError && error instanceof Error) {\n onError(error);\n }\n\n if (abortControllerRef.current === abortController) {\n setIsLoading(false);\n abortControllerRef.current = null;\n setError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n };\n\n const clear = () => {\n stop();\n clearObject();\n };\n\n const clearObject = () => {\n setError(undefined);\n setIsLoading(false);\n mutate({ object: undefined });\n };\n\n return {\n submit,\n object: data?.object,\n error,\n isLoading,\n stop,\n clear,\n };\n}\n","import {\n type AbstractChat,\n type ChatInit,\n type ChatTransport,\n type CreateUIMessage,\n type UIMessage,\n DefaultChatTransport,\n} from 'ai';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\nimport { Chat } from './chat.react';\n\nexport type { CreateUIMessage, UIMessage };\n\nexport type UseChatHelpers<UI_MESSAGE extends UIMessage> = {\n /**\n * The id of the chat.\n */\n readonly id: string;\n\n /**\n * Update the `messages` state locally. This is useful when you want to\n * edit the messages on the client, and then trigger the `reload` method\n * manually to regenerate the AI response.\n */\n setMessages: (\n messages: UI_MESSAGE[] | ((messages: UI_MESSAGE[]) => UI_MESSAGE[]),\n ) => void;\n\n error: Error | undefined;\n} & Pick<\n AbstractChat<UI_MESSAGE>,\n | 'sendMessage'\n | 'regenerate'\n | 'stop'\n | 'resumeStream'\n | 'addToolResult'\n | 'addToolOutput'\n | 'addToolApprovalResponse'\n | 'status'\n | 'messages'\n | 'clearError'\n>;\n\nexport type UseChatOptions<UI_MESSAGE extends UIMessage> = (\n | { chat: Chat<UI_MESSAGE> }\n | ChatInit<UI_MESSAGE>\n) & {\n /**\n * Custom throttle wait in ms for the chat messages and data updates.\n * Default is undefined, which disables throttling.\n */\n throttle?: number;\n\n /**\n * @deprecated Use `throttle` instead.\n */\n experimental_throttle?: number;\n\n /**\n * Whether to resume an ongoing chat generation stream.\n */\n resume?: boolean;\n};\n\nexport function useChat<UI_MESSAGE extends UIMessage = UIMessage>({\n throttle,\n experimental_throttle,\n resume = false,\n ...options\n}: UseChatOptions<UI_MESSAGE> = {}): UseChatHelpers<UI_MESSAGE> {\n const throttleWaitMs = throttle ?? experimental_throttle;\n // the Chat instance is created once and not recreated when options change,\n // so it would normally keep the callbacks/transport from the first render forever\n\n // keep latest values in a ref that is refreshed on every render,\n // and hand `Chat` stable wrappers that read from it to avoid stale closures\n const latestRef = useRef<\n Partial<\n Pick<\n ChatInit<UI_MESSAGE>,\n | 'onToolCall'\n | 'onData'\n | 'onFinish'\n | 'onError'\n | 'sendAutomaticallyWhen'\n | 'transport'\n >\n >\n >({});\n\n if (!('chat' in options)) {\n latestRef.current = {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen,\n transport: options.transport,\n };\n }\n\n // resolve the latest transport and fallback to a lazily created default transport\n let defaultTransport: ChatTransport<UI_MESSAGE> | undefined;\n const getTransport = () =>\n latestRef.current.transport ??\n (defaultTransport ??= new DefaultChatTransport<UI_MESSAGE>());\n\n // give `Chat` stable wrappers that always read the latest values from `latestRef`\n const chatOptions: typeof options = {\n ...options,\n transport: {\n sendMessages: sendOptions => getTransport().sendMessages(sendOptions),\n reconnectToStream: reconnectOptions =>\n getTransport().reconnectToStream(reconnectOptions),\n },\n onToolCall: arg => latestRef.current.onToolCall?.(arg),\n onData: arg => latestRef.current.onData?.(arg),\n onFinish: arg => latestRef.current.onFinish?.(arg),\n onError: arg => latestRef.current.onError?.(arg),\n sendAutomaticallyWhen: arg =>\n latestRef.current.sendAutomaticallyWhen?.(arg) ?? false,\n };\n\n const chatKey = 'chat' in options ? options.chat : options.id;\n const { chat, isExternallyManaged } = useMemo(\n () => ({\n chat: 'chat' in options ? options.chat : new Chat(chatOptions),\n isExternallyManaged: 'chat' in options,\n }),\n [chatKey],\n );\n\n useEffect(() => {\n if (isExternallyManaged) {\n return;\n }\n\n return () => {\n void chat.stop();\n };\n }, [chat, isExternallyManaged]);\n\n const messagesSnapshot = useMemo(() => ({ messages: chat.messages }), [chat]);\n\n const subscribeToMessages = useCallback(\n (update: () => void) => {\n let isSubscribed = true;\n\n const updateMessages = () => {\n if (!isSubscribed) {\n return;\n }\n\n messagesSnapshot.messages = chat.messages;\n update();\n };\n\n const unsubscribe = chat['~registerMessagesCallback'](\n updateMessages,\n throttleWaitMs,\n );\n\n // Synchronize changes that may have happened between render and\n // subscription. useSyncExternalStore checks the snapshot after\n // subscribing and schedules a render when it changed.\n messagesSnapshot.messages = chat.messages;\n\n return () => {\n isSubscribed = false;\n unsubscribe();\n };\n },\n [chat, messagesSnapshot, throttleWaitMs],\n );\n\n const getMessagesSnapshot = useCallback(\n () => messagesSnapshot.messages,\n [messagesSnapshot],\n );\n\n const messages = useSyncExternalStore(\n subscribeToMessages,\n getMessagesSnapshot,\n getMessagesSnapshot,\n );\n\n const subscribeToStatus = useCallback(\n (update: () => void) =>\n chat['~registerStatusCallback'](() => {\n if (chat.status === 'ready' || chat.status === 'error') {\n // Publish the latest messages before the terminal status can render.\n messagesSnapshot.messages = chat.messages;\n }\n\n update();\n }),\n [chat, messagesSnapshot],\n );\n\n const getStatusSnapshot = useCallback(() => chat.status, [chat]);\n\n const status = useSyncExternalStore(\n subscribeToStatus,\n getStatusSnapshot,\n getStatusSnapshot,\n );\n\n const error = useSyncExternalStore(\n chat['~registerErrorCallback'],\n () => chat.error,\n () => chat.error,\n );\n\n const setMessages = useCallback(\n (\n messagesParam: UI_MESSAGE[] | ((messages: UI_MESSAGE[]) => UI_MESSAGE[]),\n ) => {\n if (typeof messagesParam === 'function') {\n messagesParam = messagesParam(chat.messages);\n }\n chat.messages = messagesParam;\n },\n [chat],\n );\n\n useEffect(() => {\n if (resume) {\n chat.resumeStream();\n }\n }, [resume, chat]);\n\n return {\n id: chat.id,\n messages,\n setMessages,\n sendMessage: chat.sendMessage,\n regenerate: chat.regenerate,\n clearError: chat.clearError,\n stop: chat.stop,\n error,\n resumeStream: chat.resumeStream,\n status,\n /**\n * @deprecated Use `addToolOutput` instead.\n */\n addToolResult: chat.addToolOutput,\n addToolOutput: chat.addToolOutput,\n addToolApprovalResponse: chat.addToolApprovalResponse,\n };\n}\n","import {\n AbstractChat,\n type ChatInit,\n type ChatState,\n type ChatStatus,\n type UIMessage,\n} from 'ai';\nimport { throttle } from './throttle';\n\nfunction cloneMetadata<METADATA>(metadata: METADATA): METADATA {\n if (Array.isArray(metadata)) {\n return [...metadata] as METADATA;\n }\n\n if (\n metadata != null &&\n typeof metadata === 'object' &&\n (Object.getPrototypeOf(metadata) === Object.prototype ||\n Object.getPrototypeOf(metadata) === null)\n ) {\n return { ...metadata } as METADATA;\n }\n\n return metadata;\n}\n\nclass ReactChatState<\n UI_MESSAGE extends UIMessage,\n> implements ChatState<UI_MESSAGE> {\n #messages: UI_MESSAGE[];\n #status: ChatStatus = 'ready';\n #error: Error | undefined = undefined;\n\n #messagesCallbacks = new Set<() => void>();\n #statusCallbacks = new Set<() => void>();\n #errorCallbacks = new Set<() => void>();\n\n constructor(initialMessages: UI_MESSAGE[] = []) {\n this.#messages = initialMessages;\n }\n\n get status(): ChatStatus {\n return this.#status;\n }\n\n set status(newStatus: ChatStatus) {\n this.#status = newStatus;\n this.#callStatusCallbacks();\n }\n\n get error(): Error | undefined {\n return this.#error;\n }\n\n set error(newError: Error | undefined) {\n this.#error = newError;\n this.#callErrorCallbacks();\n }\n\n get messages(): UI_MESSAGE[] {\n return this.#messages;\n }\n\n set messages(newMessages: UI_MESSAGE[]) {\n this.#messages = [...newMessages];\n this.#callMessagesCallbacks();\n }\n\n pushMessage = (message: UI_MESSAGE) => {\n this.#messages = this.#messages.concat(message);\n this.#callMessagesCallbacks();\n };\n\n popMessage = () => {\n this.#messages = this.#messages.slice(0, -1);\n this.#callMessagesCallbacks();\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n this.#messages = [\n ...this.#messages.slice(0, index),\n this.snapshot(message),\n ...this.#messages.slice(index + 1),\n ];\n this.#callMessagesCallbacks();\n };\n\n snapshot = <T>(value: T): T => {\n if (\n value == null ||\n typeof value !== 'object' ||\n !('parts' in value) ||\n !Array.isArray(value.parts)\n ) {\n return value;\n }\n\n const message = value as UI_MESSAGE;\n const snapshot = {\n ...message,\n parts: message.parts.map(part => ({ ...part })),\n };\n\n if ('metadata' in message) {\n snapshot.metadata = cloneMetadata(message.metadata);\n }\n\n return snapshot as T;\n };\n\n '~registerMessagesCallback' = (\n onChange: () => void,\n throttleWaitMs?: number,\n ): (() => void) => {\n const callback = throttleWaitMs\n ? throttle(onChange, throttleWaitMs)\n : onChange;\n this.#messagesCallbacks.add(callback);\n return () => {\n this.#messagesCallbacks.delete(callback);\n };\n };\n\n '~registerStatusCallback' = (onChange: () => void): (() => void) => {\n this.#statusCallbacks.add(onChange);\n return () => {\n this.#statusCallbacks.delete(onChange);\n };\n };\n\n '~registerErrorCallback' = (onChange: () => void): (() => void) => {\n this.#errorCallbacks.add(onChange);\n return () => {\n this.#errorCallbacks.delete(onChange);\n };\n };\n\n #callMessagesCallbacks = () => {\n this.#messagesCallbacks.forEach(callback => callback());\n };\n\n #callStatusCallbacks = () => {\n this.#statusCallbacks.forEach(callback => callback());\n };\n\n #callErrorCallbacks = () => {\n this.#errorCallbacks.forEach(callback => callback());\n };\n}\n\nexport class Chat<\n UI_MESSAGE extends UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n #state: ReactChatState<UI_MESSAGE>;\n\n constructor({ messages, ...init }: ChatInit<UI_MESSAGE>) {\n const state = new ReactChatState(messages);\n super({ ...init, state });\n this.#state = state;\n }\n\n '~registerMessagesCallback' = (\n onChange: () => void,\n throttleWaitMs?: number,\n ): (() => void) =>\n this.#state['~registerMessagesCallback'](onChange, throttleWaitMs);\n\n '~registerStatusCallback' = (onChange: () => void): (() => void) =>\n this.#state['~registerStatusCallback'](onChange);\n\n '~registerErrorCallback' = (onChange: () => void): (() => void) =>\n this.#state['~registerErrorCallback'](onChange);\n}\n","import throttleFunction from 'throttleit';\n\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n waitMs: number | undefined,\n): T {\n return waitMs != null ? throttleFunction(fn, waitMs) : fn;\n}\n","import {\n callCompletionApi,\n type CompletionRequestOptions,\n type UseCompletionOptions,\n} from 'ai';\nimport { normalizeHeaders } from '@ai-sdk/provider-utils';\nimport { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport useSWR from 'swr';\nimport { throttle } from './throttle';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers<BODY extends object = object> = {\n /** The current completion result */\n completion: string;\n /**\n * Send a new prompt to the API endpoint and update the completion state.\n */\n complete: (\n prompt: string,\n options?: CompletionRequestOptions<BODY>,\n ) => Promise<string | null | undefined>;\n /** The error object of the API request */\n error: undefined | Error;\n /**\n * Abort the current API request but keep the generated tokens.\n */\n stop: () => void;\n /**\n * Update the `completion` state locally.\n */\n setCompletion: (completion: string) => void;\n /** The current value of the input */\n input: string;\n /** setState-powered method to update the input value */\n setInput: React.Dispatch<React.SetStateAction<string>>;\n /**\n * An input/textarea-ready onChange handler to control the value of the input\n * @example\n * ```jsx\n * <input onChange={handleInputChange} value={input} />\n * ```\n */\n handleInputChange: (\n event:\n | React.ChangeEvent<HTMLInputElement>\n | React.ChangeEvent<HTMLTextAreaElement>,\n ) => void;\n\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form onSubmit={handleSubmit}>\n * <input onChange={handleInputChange} value={input} />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n\n /** Whether the API request is in progress */\n isLoading: boolean;\n};\n\nexport function useCompletion<BODY extends object = object>({\n api = '/api/completion',\n id,\n initialCompletion = '',\n initialInput = '',\n credentials,\n headers,\n body,\n streamProtocol = 'data',\n fetch,\n onFinish,\n onError,\n throttle: throttleWait,\n experimental_throttle,\n}: UseCompletionOptions<NoInfer<BODY>> & {\n /**\n * Custom throttle wait in ms for the completion and data updates.\n * Default is undefined, which disables throttling.\n */\n throttle?: number;\n\n /**\n * @deprecated Use `throttle` instead.\n */\n experimental_throttle?: number;\n} = {}): UseCompletionHelpers<BODY> {\n const throttleWaitMs = throttleWait ?? experimental_throttle;\n // Generate an unique id for the completion if not provided.\n const hookId = useId();\n const completionId = id || hookId;\n\n // Store the completion state in SWR, using the completionId as the key to share states.\n const { data, mutate } = useSWR<string>([api, completionId], null, {\n fallbackData: initialCompletion,\n });\n\n const { data: isLoading = false, mutate: mutateLoading } = useSWR<boolean>(\n [completionId, 'loading'],\n null,\n );\n\n const [error, setError] = useState<undefined | Error>(undefined);\n const completion = data!;\n\n // Abort controller to cancel the current API call.\n const abortControllerRef = useRef<AbortController | null>(null);\n const requestIdRef = useRef(0);\n\n const extraMetadataRef = useRef({\n credentials,\n headers,\n body,\n });\n\n useEffect(() => {\n extraMetadataRef.current = {\n credentials,\n headers,\n body,\n };\n }, [credentials, headers, body]);\n\n const triggerRequest = useCallback(\n async (prompt: string, options?: CompletionRequestOptions<BODY>) => {\n const requestId = ++requestIdRef.current;\n\n return callCompletionApi({\n api,\n prompt,\n credentials: extraMetadataRef.current.credentials,\n headers: {\n ...normalizeHeaders(extraMetadataRef.current.headers),\n ...normalizeHeaders(options?.headers),\n },\n body: {\n ...extraMetadataRef.current.body,\n ...options?.body,\n },\n streamProtocol,\n fetch,\n // throttle streamed ui updates:\n setCompletion: throttle((completion: string) => {\n if (requestIdRef.current === requestId) {\n mutate(completion, false);\n }\n }, throttleWaitMs),\n setLoading: mutateLoading,\n setError,\n setAbortController: controller => {\n abortControllerRef.current = controller;\n },\n getAbortController: () => abortControllerRef.current,\n onFinish,\n onError,\n });\n },\n [\n mutate,\n mutateLoading,\n api,\n extraMetadataRef,\n onFinish,\n onError,\n setError,\n streamProtocol,\n fetch,\n throttleWaitMs,\n ],\n );\n\n const stop = useCallback(() => {\n abortControllerRef.current?.abort();\n }, []);\n\n const setCompletion = useCallback(\n (completion: string) => {\n mutate(completion, false);\n },\n [mutate],\n );\n\n const complete = useCallback<UseCompletionHelpers<BODY>['complete']>(\n async (prompt, options) => {\n return triggerRequest(prompt, options);\n },\n [triggerRequest],\n );\n\n const [input, setInput] = useState(initialInput);\n\n const handleSubmit = useCallback(\n (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n if (!input) {\n return;\n }\n\n const result = complete(input);\n setInput('');\n return result;\n },\n [input, complete, setInput],\n );\n\n const handleInputChange = useCallback(\n (e: any) => {\n setInput(e.target.value);\n },\n [setInput],\n );\n\n return {\n completion,\n complete,\n error,\n setCompletion,\n stop,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isLoading,\n };\n}\n","import { secureJsonParse } from '@ai-sdk/provider-utils';\nimport {\n Experimental_AbstractRealtimeSession as AbstractRealtimeSession,\n type Experimental_RealtimeServerEvent as RealtimeServerEvent,\n type Experimental_RealtimeSessionOptions as RealtimeSessionOptions,\n type Experimental_RealtimeState as RealtimeState,\n type Experimental_RealtimeStatus as RealtimeStatus,\n type UIMessage,\n} from 'ai';\nimport {\n useCallback,\n useEffect,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\ntype UseRealtimeOptions = RealtimeSessionOptions;\n\ntype RealtimeStateKey = keyof RealtimeState;\n\nconst useIsomorphicLayoutEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nconst RealtimeStore = /* @__PURE__ */ (() =>\n class RealtimeStore extends AbstractRealtimeSession {\n protected state: RealtimeState = {\n status: 'disconnected',\n messages: [],\n events: [],\n isCapturing: false,\n isPlaying: false,\n };\n\n private callbacks: { [K in RealtimeStateKey]-?: Set<() => void> } = {\n status: new Set(),\n messages: new Set(),\n events: new Set(),\n isCapturing: new Set(),\n isPlaying: new Set(),\n session: new Set(),\n };\n\n get status(): RealtimeStatus {\n return this.state.status;\n }\n\n get messages(): UIMessage[] {\n return this.state.messages;\n }\n\n get events(): RealtimeServerEvent[] {\n return this.state.events;\n }\n\n get isCapturing(): boolean {\n return this.state.isCapturing;\n }\n\n get isPlaying(): boolean {\n return this.state.isPlaying;\n }\n\n get session(): RealtimeState['session'] {\n return this.state.session;\n }\n\n subscribe(key: RealtimeStateKey, onChange: () => void): () => void {\n this.callbacks[key].add(onChange);\n\n return () => {\n this.callbacks[key].delete(onChange);\n };\n }\n\n protected setState<K extends RealtimeStateKey>(\n key: K,\n value: RealtimeState[K],\n ): void {\n this.state = { ...this.state, [key]: value };\n this.callbacks[key].forEach(callback => callback());\n }\n })();\n\ntype RealtimeStore = InstanceType<typeof RealtimeStore>;\n\ntype UseRealtimeReturn = {\n status: RealtimeStatus;\n messages: UIMessage[];\n events: RealtimeServerEvent[];\n isCapturing: boolean;\n isPlaying: boolean;\n session?: RealtimeState['session'];\n\n connect: AbstractRealtimeSession['connect'];\n close: AbstractRealtimeSession['close'];\n resumePlayback: () => Promise<void>;\n resumeAudioCapture: () => Promise<void>;\n disconnect: () => void;\n addToolOutput: (callId: string, result: unknown) => void;\n sendEvent: AbstractRealtimeSession['sendEvent'];\n sendTextMessage: (text: string) => void;\n sendAudio: (base64Audio: string) => void;\n commitAudio: () => void;\n clearAudioBuffer: () => void;\n requestResponse: (options?: { modalities?: string[] }) => void;\n cancelResponse: () => void;\n startAudioCapture: (stream: MediaStream) => void;\n stopAudioCapture: () => void;\n stopPlayback: () => void;\n};\n\nfunction useRealtime(options: UseRealtimeOptions): UseRealtimeReturn {\n const ownerRef = useRef<{\n store: RealtimeStore;\n onToolCall: UseRealtimeOptions['onToolCall'];\n onEvent: UseRealtimeOptions['onEvent'];\n onError: UseRealtimeOptions['onError'];\n } | null>(null);\n const {\n model,\n api,\n startupTimeoutMs,\n closeTimeoutMs,\n rtcDisconnectTimeoutMs,\n sessionConfig,\n sampleRate,\n maxEvents,\n maxPlaybackBufferSeconds,\n onToolCall,\n onEvent,\n onError,\n } = options;\n const { token, websocket, session: sessionEndpoint } = api;\n const protocols = JSON.stringify(api.protocols ?? []);\n\n // Candidates allocate no transports or media; only a committed owner can act.\n const rt = useMemo(() => {\n const store: RealtimeStore = new RealtimeStore({\n model,\n api:\n token != null\n ? { token }\n : sessionEndpoint != null\n ? { session: sessionEndpoint }\n : {\n websocket: websocket as string,\n protocols: secureJsonParse(protocols) as string[],\n },\n startupTimeoutMs,\n closeTimeoutMs,\n rtcDisconnectTimeoutMs,\n sessionConfig,\n sampleRate,\n maxEvents,\n maxPlaybackBufferSeconds,\n onEvent: (...args) =>\n ownerRef.current?.store === store\n ? ownerRef.current.onEvent?.(...args)\n : undefined,\n onError: (...args) =>\n ownerRef.current?.store === store\n ? ownerRef.current.onError?.(...args)\n : undefined,\n });\n return store;\n }, [\n model,\n token,\n sessionEndpoint,\n websocket,\n protocols,\n startupTimeoutMs,\n closeTimeoutMs,\n rtcDisconnectTimeoutMs,\n sessionConfig,\n sampleRate,\n maxEvents,\n maxPlaybackBufferSeconds,\n ]);\n\n // Publish before child layout effects; insertion cleanup only revokes refs.\n useInsertionEffect(() => {\n ownerRef.current = { store: rt, onToolCall, onEvent, onError };\n rt.onToolCall =\n onToolCall == null\n ? undefined\n : (...args) =>\n ownerRef.current?.store === rt\n ? ownerRef.current.onToolCall?.(...args)\n : undefined;\n return () => {\n ownerRef.current = null;\n };\n });\n\n // StrictMode replays layout effects, but keeps the insertion-phase owner.\n useIsomorphicLayoutEffect(() => {\n return () => rt.dispose();\n }, [rt]);\n\n const actions = useMemo(() => {\n const current = () => {\n if (ownerRef.current == null)\n throw new Error('Realtime controls require a mounted hook');\n return ownerRef.current.store;\n };\n return {\n connect: async (options?: {\n stream?: MediaStream;\n capture?: boolean;\n }) => {\n const store = current();\n return options == null ? store.connect() : store.connect(options);\n },\n close: async options => current().close(options),\n resumePlayback: async () => current().resumePlayback(),\n resumeAudioCapture: async () => current().resumeAudioCapture(),\n disconnect: () => current().disconnect(),\n addToolOutput: (callId, result) =>\n current().addToolOutput(callId, result),\n sendEvent: event => current().sendEvent(event),\n sendTextMessage: text => current().sendTextMessage(text),\n sendAudio: audio => current().sendAudio(audio),\n commitAudio: () => current().commitAudio(),\n clearAudioBuffer: () => current().clearAudioBuffer(),\n requestResponse: options => current().requestResponse(options),\n cancelResponse: () => current().cancelResponse(),\n startAudioCapture: stream => current().startAudioCapture(stream),\n stopAudioCapture: () => current().stopAudioCapture(),\n stopPlayback: () => current().stopPlayback(),\n } satisfies Omit<UseRealtimeReturn, keyof RealtimeState>;\n }, []);\n\n const status = useSyncExternalStore(\n useCallback(cb => rt.subscribe('status', cb), [rt]),\n () => rt.status,\n () => rt.status,\n );\n\n const messages = useSyncExternalStore(\n useCallback(cb => rt.subscribe('messages', cb), [rt]),\n () => rt.messages,\n () => rt.messages,\n );\n\n const events = useSyncExternalStore(\n useCallback(cb => rt.subscribe('events', cb), [rt]),\n () => rt.events,\n () => rt.events,\n );\n\n const isCapturing = useSyncExternalStore(\n useCallback(cb => rt.subscribe('isCapturing', cb), [rt]),\n () => rt.isCapturing,\n () => rt.isCapturing,\n );\n\n const isPlaying = useSyncExternalStore(\n useCallback(cb => rt.subscribe('isPlaying', cb), [rt]),\n () => rt.isPlaying,\n () => rt.isPlaying,\n );\n\n const session = useSyncExternalStore(\n useCallback(cb => rt.subscribe('session', cb), [rt]),\n () => rt.session,\n () => rt.session,\n );\n\n return {\n status,\n messages,\n events,\n isCapturing,\n isPlaying,\n session,\n ...actions,\n };\n}\n\nexport const experimental_useRealtime = useRealtime;\n\nexport type {\n RealtimeStatus as Experimental_RealtimeStatus,\n UseRealtimeOptions as Experimental_UseRealtimeOptions,\n UseRealtimeReturn as Experimental_UseRealtimeReturn,\n};\n","import type { MCPAppResource } from '@ai-sdk/mcp';\nimport { useEffect, useState } from 'react';\nimport { MCPAppFrame } from './app-frame';\nimport type { MCPAppMetadata, MCPAppRendererProps } from './types';\nimport { getMCPAppFromToolPart } from './utils';\n\ntype LoadedResourceState = {\n resourceUri: string;\n resource?: MCPAppResource;\n error?: Error;\n};\n\nfunction getToolPartOutput(part: MCPAppRendererProps['part']): unknown {\n return part.state === 'output-available' ? part.output : undefined;\n}\n\nfunction getToolPartInput(part: MCPAppRendererProps['part']): unknown {\n return part.state === 'input-available' || part.state === 'output-available'\n ? part.input\n : undefined;\n}\n\nexport function MCPAppRenderer({\n part,\n sandbox,\n resource: resourceProp,\n loadResource,\n handlers,\n hostInfo,\n hostContext,\n fallback = null,\n}: MCPAppRendererProps) {\n const app = getMCPAppFromToolPart(part);\n const [cachedApp, setCachedApp] = useState<MCPAppMetadata>();\n const [loadedResource, setLoadedResource] = useState<LoadedResourceState>();\n\n useEffect(() => {\n if (app != null) {\n setCachedApp(previous =>\n previous?.resourceUri === app.resourceUri ? previous : app,\n );\n }\n }, [app?.resourceUri]);\n\n const appForRender = app ?? cachedApp;\n\n useEffect(() => {\n if (appForRender == null || resourceProp != null || loadResource == null) {\n return;\n }\n\n let cancelled = false;\n const resourceUri = appForRender.resourceUri;\n\n loadResource(appForRender)\n .then(resource => {\n if (!cancelled) {\n setLoadedResource({ resourceUri, resource });\n }\n })\n .catch(error => {\n if (!cancelled) {\n setLoadedResource({\n resourceUri,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [appForRender?.resourceUri, loadResource, resourceProp]);\n\n const loadedResourceForApp =\n loadedResource?.resourceUri === appForRender?.resourceUri\n ? loadedResource\n : undefined;\n const resource = resourceProp ?? loadedResourceForApp?.resource;\n const error = resourceProp == null ? loadedResourceForApp?.error : undefined;\n\n if (appForRender == null || error != null || resource == null) {\n return fallback;\n }\n\n return (\n <MCPAppFrame\n app={appForRender}\n resource={resource}\n input={getToolPartInput(part)}\n output={getToolPartOutput(part)}\n sandbox={sandbox}\n handlers={handlers}\n hostInfo={hostInfo}\n hostContext={hostContext}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { MCPAppBridge } from './bridge';\nimport {\n MCP_APP_DEFAULT_INNER_SANDBOX,\n MCP_APP_DEFAULT_OUTER_SANDBOX,\n getMCPAppAllowAttribute,\n getMCPAppCSP,\n} from './sandbox';\nimport type { MCPAppFrameProps } from './types';\nimport { normalizeMCPAppToolResult } from './utils';\n\n/**\n * Derives the concrete origin of the sandbox proxy from its URL, so outbound\n * postMessage targets a specific origin instead of `'*'` and inbound messages\n * can be origin-checked. The proxy must be served from a stable, concrete\n * origin (the default outer sandbox keeps `allow-same-origin`). Falls back to\n * the host origin on a malformed URL, never `'*'`.\n */\nfunction deriveTargetOrigin(url: string): string {\n const location = typeof window !== 'undefined' ? window.location : undefined;\n try {\n return new URL(url, location?.href).origin;\n } catch {\n return location?.origin ?? 'null';\n }\n}\n\nfunction sendToolState({\n bridge,\n input,\n output,\n}: {\n bridge?: MCPAppBridge;\n input: unknown;\n output: unknown;\n}) {\n if (bridge == null) {\n return;\n }\n\n if (input !== undefined) {\n bridge.sendToolInput(input);\n }\n\n if (output !== undefined) {\n bridge.sendToolResult(normalizeMCPAppToolResult(output));\n }\n}\n\nexport function MCPAppFrame({\n app,\n resource,\n input,\n output,\n sandbox,\n handlers,\n hostInfo,\n hostContext,\n}: MCPAppFrameProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const bridgeRef = useRef<MCPAppBridge | undefined>(undefined);\n const inputRef = useRef(input);\n const outputRef = useRef(output);\n const hostContextRef = useRef(hostContext);\n const initializedRef = useRef(false);\n inputRef.current = input;\n outputRef.current = output;\n hostContextRef.current = hostContext;\n const sandboxUrl = String(sandbox.url);\n const targetOrigin = sandbox.targetOrigin ?? deriveTargetOrigin(sandboxUrl);\n const resourceCSP = getMCPAppCSP(resource.meta?.csp);\n const resourceAllow = getMCPAppAllowAttribute(\n resource.meta?.permissions,\n sandbox.allowedPermissions,\n );\n const innerSandbox = sandbox.innerSandbox ?? MCP_APP_DEFAULT_INNER_SANDBOX;\n const bridgeHandlers = useMemo(\n () => ({\n ...handlers,\n onInitialized: () => {\n initializedRef.current = true;\n handlers?.onInitialized?.();\n sendToolState({\n bridge: bridgeRef.current,\n input: inputRef.current,\n output: outputRef.current,\n });\n },\n }),\n [handlers],\n );\n const bridgeHandlersRef = useRef(bridgeHandlers);\n bridgeHandlersRef.current = bridgeHandlers;\n\n useEffect(() => {\n const iframe = iframeRef.current;\n const targetWindow = iframe?.contentWindow;\n if (targetWindow == null) {\n return;\n }\n\n initializedRef.current = false;\n\n const bridge = new MCPAppBridge({\n targetWindow,\n targetOrigin,\n handlers: bridgeHandlersRef.current,\n hostInfo,\n hostContext: hostContextRef.current,\n });\n bridgeRef.current = bridge;\n\n const onMessage = (event: MessageEvent) => {\n // Only handle messages from the proxy window and expected origin.\n if (!bridge.acceptsEvent(event)) {\n return;\n }\n\n if (\n event.data?.jsonrpc === '2.0' &&\n event.data.method === 'ui/notifications/sandbox-proxy-ready'\n ) {\n bridge.sendSandboxResourceReady({\n html: resource.html,\n csp: resourceCSP,\n sandbox: innerSandbox,\n allow: resourceAllow,\n });\n return;\n }\n\n bridge.handleMessage(event);\n };\n\n window.addEventListener('message', onMessage);\n\n return () => {\n initializedRef.current = false;\n window.removeEventListener('message', onMessage);\n void bridge.teardownResource().catch(() => {});\n bridge.close();\n bridgeRef.current = undefined;\n };\n }, [\n hostInfo,\n innerSandbox,\n resource.html,\n resourceAllow,\n resourceCSP,\n sandboxUrl,\n targetOrigin,\n ]);\n\n useEffect(() => {\n bridgeRef.current?.setHandlers(bridgeHandlers);\n }, [bridgeHandlers]);\n\n useEffect(() => {\n if (hostContext != null) {\n bridgeRef.current?.setHostContext(hostContext);\n }\n }, [hostContext]);\n\n useEffect(() => {\n if (initializedRef.current && input !== undefined) {\n bridgeRef.current?.sendToolInput(input);\n }\n }, [input]);\n\n useEffect(() => {\n if (initializedRef.current && output !== undefined) {\n bridgeRef.current?.sendToolResult(normalizeMCPAppToolResult(output));\n }\n }, [output]);\n\n return (\n <iframe\n ref={iframeRef}\n title=\"MCP App\"\n aria-label={sandbox.title ?? app.resourceUri}\n src={sandboxUrl}\n className={sandbox.className}\n style={sandbox.style}\n // Permissions Policy is hierarchical: the outer frame must delegate a\n // feature for the proxy to re-delegate it to the inner app frame.\n allow={resourceAllow}\n sandbox={sandbox.outerSandbox ?? MCP_APP_DEFAULT_OUTER_SANDBOX}\n />\n );\n}\n","import { isJSONObject } from '@ai-sdk/provider';\nimport type {\n MCPAppBridgeHandlers,\n MCPAppHostContext,\n MCPAppJsonRpcMessage,\n MCPAppJsonRpcNotification,\n MCPAppJsonRpcRequest,\n MCPAppJsonRpcResponse,\n MCPAppToolCallParams,\n} from './types';\n\nconst MCP_APP_PROTOCOL_VERSION = '2026-01-26';\n\n/**\n * Checks whether an iframe message looks like a JSON-RPC 2.0 message.\n */\nfunction isJsonRpcMessage(value: unknown): value is MCPAppJsonRpcMessage {\n return (\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'jsonrpc' in value &&\n value.jsonrpc === '2.0'\n );\n}\n\n/**\n * Checks whether a JSON-RPC message expects a response.\n */\nfunction isRequest(\n message: MCPAppJsonRpcMessage,\n): message is MCPAppJsonRpcRequest {\n return 'method' in message && 'id' in message;\n}\n\n/**\n * Checks whether a JSON-RPC message is a fire-and-forget notification.\n */\nfunction isNotification(\n message: MCPAppJsonRpcMessage,\n): message is MCPAppJsonRpcNotification {\n return 'method' in message && !('id' in message);\n}\n\n/**\n * Normalizes unknown thrown values into an `Error`.\n */\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Validates the params for app-initiated `tools/call` requests.\n */\nfunction assertToolCallParams(params: unknown): MCPAppToolCallParams {\n if (!isJSONObject(params) || typeof params.name !== 'string') {\n throw new Error('Invalid tools/call params');\n }\n\n return {\n name: params.name,\n arguments: isJSONObject(params.arguments) ? params.arguments : undefined,\n };\n}\n\n/**\n * Validates `resources/read` params and limits reads to `ui://` app resources.\n */\nfunction assertResourceReadParams(params: unknown): { uri: string } {\n if (!isJSONObject(params) || typeof params.uri !== 'string') {\n throw new Error('Invalid resources/read params');\n }\n if (!params.uri.startsWith('ui://')) {\n throw new Error(\n `resources/read is limited to ui:// resources: ${params.uri}`,\n );\n }\n return { uri: params.uri };\n}\n\n/**\n * Validates `ui/open-link` params and allows only `https:`/`http:`/`mailto:`\n * URLs.\n */\nfunction assertOpenLinkParams(params: unknown): { url: string } {\n if (!isJSONObject(params) || typeof params.url !== 'string') {\n throw new Error('Invalid ui/open-link params');\n }\n\n let scheme: string;\n try {\n scheme = new URL(params.url).protocol;\n } catch {\n throw new Error(`Invalid ui/open-link url: ${params.url}`);\n }\n\n if (scheme !== 'https:' && scheme !== 'http:' && scheme !== 'mailto:') {\n throw new Error(`Disallowed ui/open-link scheme: ${scheme}`);\n }\n\n return { url: params.url };\n}\n\n/**\n * Validates params for `ui/request-display-mode`.\n */\nfunction assertDisplayModeParams(params: unknown): {\n mode: 'inline' | 'fullscreen' | 'pip';\n} {\n if (\n !isJSONObject(params) ||\n (params.mode !== 'inline' &&\n params.mode !== 'fullscreen' &&\n params.mode !== 'pip')\n ) {\n throw new Error('Invalid ui/request-display-mode params');\n }\n return { mode: params.mode };\n}\n\n/**\n * Host-side JSON-RPC bridge for one MCP App iframe.\n *\n * It handles the MCP Apps initialization handshake, sends tool input/result\n * notifications to the iframe, and proxies allowed iframe requests through\n * host-provided callbacks.\n *\n * @example\n * ```ts\n * const bridge = new MCPAppBridge({\n * targetWindow: iframe.contentWindow!,\n * handlers: {\n * allowedTools: ['refreshDashboardData'],\n * callTool: params => client.callTool(params),\n * },\n * });\n *\n * window.addEventListener('message', event => bridge.handleMessage(event));\n * bridge.sendToolInput({ topic: 'usage' });\n * ```\n */\nexport class MCPAppBridge {\n private initialized = false;\n private pendingNotifications: MCPAppJsonRpcNotification[] = [];\n private nextRequestId = 0;\n private pendingResponses = new Map<\n string | number,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }\n >();\n\n constructor({\n targetWindow,\n targetOrigin = '*',\n handlers = {},\n hostInfo = { name: 'ai-sdk-react', version: '1.0.0' },\n hostContext = { displayMode: 'inline' },\n }: {\n targetWindow: Window;\n targetOrigin?: string;\n handlers?: MCPAppBridgeHandlers;\n hostInfo?: { name: string; version: string };\n hostContext?: MCPAppHostContext;\n }) {\n this.targetWindow = targetWindow;\n this.targetOrigin = targetOrigin;\n this.handlers = handlers;\n this.hostInfo = hostInfo;\n this.hostContext = hostContext;\n }\n\n private targetWindow: Window;\n private targetOrigin: string;\n private handlers: MCPAppBridgeHandlers;\n private hostInfo: { name: string; version: string };\n private hostContext: MCPAppHostContext;\n\n /**\n * Replaces the callbacks used to serve iframe requests.\n */\n setHandlers(handlers: MCPAppBridgeHandlers): void {\n this.handlers = handlers;\n }\n\n /**\n * Updates host context and notifies the iframe after initialization.\n *\n * @example\n * ```ts\n * bridge.setHostContext({ theme: 'dark', displayMode: 'inline' });\n * ```\n */\n setHostContext(hostContext: MCPAppHostContext): void {\n this.hostContext = hostContext;\n this.sendNotification({\n method: 'ui/notifications/host-context-changed',\n params: hostContext,\n });\n }\n\n /**\n * Whether a `message` event came from the expected proxy window and origin.\n * The origin check is skipped only when `targetOrigin` is the `'*'` default.\n * Callers that intercept events before {@link handleMessage} share this check.\n */\n acceptsEvent(event: MessageEvent): boolean {\n return (\n event.source === this.targetWindow &&\n (this.targetOrigin === '*' || event.origin === this.targetOrigin)\n );\n }\n\n /**\n * Processes one `message` event from the sandbox proxy iframe.\n */\n handleMessage(event: MessageEvent): void {\n if (!this.acceptsEvent(event) || !isJsonRpcMessage(event.data)) {\n return;\n }\n\n const message = event.data;\n\n if ('result' in message || 'error' in message) {\n this.handleResponse(message);\n return;\n }\n\n if (isRequest(message)) {\n void this.handleRequest(message);\n return;\n }\n\n if (isNotification(message)) {\n this.handleNotification(message);\n }\n }\n\n /**\n * Sends app HTML and sandbox settings to the sandbox proxy.\n */\n sendSandboxResourceReady(params: unknown): void {\n this.post({\n jsonrpc: '2.0',\n method: 'ui/notifications/sandbox-resource-ready',\n params,\n });\n }\n\n /**\n * Sends final tool arguments to the MCP App.\n */\n sendToolInput(input: unknown): void {\n this.sendNotification({\n method: 'ui/notifications/tool-input',\n params: { arguments: input },\n });\n }\n\n /**\n * Sends a completed MCP tool result to the MCP App.\n */\n sendToolResult(result: unknown): void {\n this.sendNotification({\n method: 'ui/notifications/tool-result',\n params: result,\n });\n }\n\n /**\n * Notifies the MCP App that the related tool call was cancelled.\n */\n sendToolCancelled(reason?: string): void {\n this.sendNotification({\n method: 'ui/notifications/tool-cancelled',\n params: reason != null ? { reason } : {},\n });\n }\n\n /**\n * Requests graceful teardown before the host removes the iframe.\n */\n teardownResource(): Promise<unknown> {\n return this.request('ui/resource-teardown', {});\n }\n\n /**\n * Rejects pending bridge requests and clears queued notifications.\n */\n close(): void {\n for (const pending of this.pendingResponses.values()) {\n pending.reject(new Error('MCP App bridge closed'));\n }\n this.pendingResponses.clear();\n this.pendingNotifications = [];\n }\n\n /**\n * Resolves or rejects a host-initiated request when the iframe responds.\n */\n private handleResponse(response: MCPAppJsonRpcResponse): void {\n const pending = this.pendingResponses.get(response.id);\n if (pending == null) {\n return;\n }\n\n this.pendingResponses.delete(response.id);\n\n if (response.error != null) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n\n /**\n * Runs a handler for an iframe request and posts the JSON-RPC response.\n */\n private async handleRequest(request: MCPAppJsonRpcRequest): Promise<void> {\n try {\n const result = await this.getRequestResult(request);\n this.post({ jsonrpc: '2.0', id: request.id, result });\n } catch (error) {\n const normalizedError = toError(error);\n this.handlers.onError?.(normalizedError);\n this.post({\n jsonrpc: '2.0',\n id: request.id,\n error: { code: -32603, message: normalizedError.message },\n });\n }\n }\n\n /**\n * Maps supported iframe request methods to host callbacks.\n */\n private async getRequestResult(\n request: MCPAppJsonRpcRequest,\n ): Promise<unknown> {\n switch (request.method) {\n case 'ui/initialize':\n return {\n protocolVersion: MCP_APP_PROTOCOL_VERSION,\n hostCapabilities: {\n ...(this.handlers.callTool != null ? { serverTools: {} } : {}),\n ...(this.handlers.readResource != null\n ? { serverResources: {} }\n : {}),\n ...(this.handlers.onLog != null ? { logging: {} } : {}),\n },\n hostInfo: this.hostInfo,\n hostContext: this.hostContext,\n };\n\n case 'tools/call': {\n if (this.handlers.callTool == null) {\n throw new Error('No tools/call handler configured');\n }\n const params = assertToolCallParams(request.params);\n // Deny-by-default: the (untrusted) MCP App may only invoke tools the\n // host has explicitly allow-listed. Omitting `allowedTools` exposes no\n // tools, rather than forwarding every requested tool to `callTool`.\n if (\n this.handlers.allowedTools == null ||\n !this.handlers.allowedTools.includes(params.name)\n ) {\n throw new Error(`Tool is not app-visible: ${params.name}`);\n }\n return this.handlers.callTool(params);\n }\n\n case 'resources/read':\n if (this.handlers.readResource == null) {\n throw new Error('No resources/read handler configured');\n }\n return this.handlers.readResource(\n assertResourceReadParams(request.params),\n );\n\n case 'resources/list':\n if (this.handlers.listResources == null) {\n throw new Error('No resources/list handler configured');\n }\n return this.handlers.listResources(request.params);\n\n case 'ui/open-link':\n if (this.handlers.openLink == null) {\n throw new Error('No ui/open-link handler configured');\n }\n return this.handlers.openLink(assertOpenLinkParams(request.params));\n\n case 'ui/message':\n return this.handlers.sendMessage?.(request.params) ?? {};\n\n case 'ui/update-model-context':\n return this.handlers.updateModelContext?.(request.params) ?? {};\n\n case 'ui/request-display-mode':\n return (\n this.handlers.requestDisplayMode?.(\n assertDisplayModeParams(request.params),\n ) ?? { mode: this.hostContext.displayMode ?? 'inline' }\n );\n\n default:\n throw new Error(`Unsupported MCP App method: ${request.method}`);\n }\n }\n\n /**\n * Handles iframe lifecycle and telemetry notifications.\n */\n private handleNotification(notification: MCPAppJsonRpcNotification): void {\n switch (notification.method) {\n case 'ui/notifications/initialized':\n this.initialized = true;\n this.flushNotifications();\n this.handlers.onInitialized?.();\n break;\n case 'ui/notifications/size-changed':\n this.handlers.onSizeChange?.(\n notification.params as { width?: number; height?: number },\n );\n break;\n case 'ui/notifications/request-teardown':\n this.handlers.onRequestTeardown?.(notification.params);\n break;\n case 'notifications/message':\n this.handlers.onLog?.(notification.params);\n break;\n }\n }\n\n /**\n * Sends a host-to-iframe notification, queueing it until app initialization.\n */\n private sendNotification(\n notification: Omit<MCPAppJsonRpcNotification, 'jsonrpc'>,\n ) {\n const message = { jsonrpc: '2.0' as const, ...notification };\n if (!this.initialized && !notification.method.includes('sandbox')) {\n this.pendingNotifications.push(message);\n return;\n }\n this.post(message);\n }\n\n /**\n * Sends notifications that were queued before `ui/notifications/initialized`.\n */\n private flushNotifications(): void {\n const notifications = this.pendingNotifications;\n this.pendingNotifications = [];\n for (const notification of notifications) {\n this.post(notification);\n }\n }\n\n /**\n * Sends a host-initiated JSON-RPC request to the iframe.\n */\n private request(method: string, params: unknown): Promise<unknown> {\n const id = this.nextRequestId++;\n this.post({ jsonrpc: '2.0', id, method, params });\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n });\n }\n\n /**\n * Posts a JSON-RPC message to the sandbox proxy iframe.\n */\n private post(message: MCPAppJsonRpcMessage): void {\n this.targetWindow.postMessage(message, this.targetOrigin);\n }\n}\n","import type { MCPAppResourceCSP } from '@ai-sdk/mcp';\n\n// CSP source values come from the (untrusted) MCP server. Rather than\n// denylisting bad characters on the raw string (which an encoding like \"%3B\"\n// can slip past), canonicalize each value: parse it as an absolute URL so any\n// percent-encoding is decoded, keep only https/wss origins, then re-check the\n// decoded origin so a separator that decoded back into \";\" \",\" or whitespace\n// cannot split the directive.\nconst ALLOWED_CSP_SCHEMES = new Set(['https:', 'wss:']);\n\nfunction sanitizeCSPSources(sources?: string[]): string[] {\n const result: string[] = [];\n for (const source of sources ?? []) {\n if (typeof source !== 'string') {\n continue;\n }\n\n let origin: string;\n try {\n const url = new URL(source);\n // Reject non-https/wss, the empty host, and a bare \"*\" host (which would\n // match every origin and defeat the allowlist, like scheme-only \"https:\").\n if (\n !ALLOWED_CSP_SCHEMES.has(url.protocol) ||\n url.host.length === 0 ||\n url.host === '*'\n ) {\n continue;\n }\n origin = url.origin;\n } catch {\n continue;\n }\n\n // Drop separators that split the directive and quotes that could break out\n // of an HTML attribute the policy may be embedded in downstream.\n if (/[\"'`\\s;,]/.test(origin)) {\n continue;\n }\n\n result.push(origin);\n }\n return result;\n}\n\n/**\n * Default sandbox permissions for the outer sandbox proxy iframe.\n */\nexport const MCP_APP_DEFAULT_OUTER_SANDBOX =\n 'allow-scripts allow-same-origin allow-forms';\n\n/**\n * Default sandbox permissions for the inner iframe that runs app HTML.\n */\nexport const MCP_APP_DEFAULT_INNER_SANDBOX = 'allow-scripts allow-forms';\n\n/**\n * Converts MCP App CSP metadata into a Content-Security-Policy string.\n *\n * The returned value is meant to be passed to a sandbox proxy, which can apply\n * it to the inner iframe document.\n *\n * @example\n * ```ts\n * const csp = getMCPAppCSP({\n * connectDomains: ['https://api.example.com'],\n * resourceDomains: ['https://cdn.example.com'],\n * });\n * ```\n */\nexport function getMCPAppCSP(csp?: MCPAppResourceCSP): string | undefined {\n if (csp == null) {\n return undefined;\n }\n\n const connectSrc = [\"'self'\", ...sanitizeCSPSources(csp.connectDomains)];\n const imgSrc = [\n \"'self'\",\n 'data:',\n ...sanitizeCSPSources(csp.resourceDomains),\n ];\n const frameSrc = [\"'self'\", ...sanitizeCSPSources(csp.frameDomains)];\n\n return [\n \"default-src 'none'\",\n \"base-uri 'none'\",\n \"form-action 'none'\",\n \"script-src 'unsafe-inline'\",\n \"style-src 'unsafe-inline'\",\n `connect-src ${connectSrc.join(' ')}`,\n `img-src ${imgSrc.join(' ')}`,\n `font-src ${imgSrc.join(' ')}`,\n `frame-src ${frameSrc.join(' ')}`,\n ].join('; ');\n}\n\n/**\n * A permission an MCP App may request and a host may allow.\n */\nexport type MCPAppPermission =\n | 'camera'\n | 'microphone'\n | 'geolocation'\n | 'clipboardWrite';\n\nconst MCP_APP_PERMISSION_FEATURES: Record<MCPAppPermission, string> = {\n camera: 'camera',\n microphone: 'microphone',\n geolocation: 'geolocation',\n clipboardWrite: 'clipboard-write',\n};\n\n/**\n * Converts MCP App permission metadata into an iframe `allow` attribute.\n *\n * Deny-by-default: a capability is granted only when it is both requested in\n * `permissions` and present in the host `allowedPermissions` allowlist.\n * Omitting the allowlist grants nothing, mirroring `allowedTools` in the bridge.\n *\n * @example\n * ```ts\n * const allow = getMCPAppAllowAttribute(\n * { microphone: {}, camera: {} },\n * ['microphone'],\n * );\n * // \"microphone\" — camera requested by server but not host-allowed\n * ```\n */\nexport function getMCPAppAllowAttribute(\n permissions?: Record<string, unknown>,\n allowedPermissions?: MCPAppPermission[],\n): string | undefined {\n if (permissions == null || allowedPermissions == null) {\n return undefined;\n }\n\n const allow = allowedPermissions\n .filter(permission => Boolean(permissions[permission]))\n .map(permission => MCP_APP_PERMISSION_FEATURES[permission]);\n\n return allow.length > 0 ? allow.join('; ') : undefined;\n}\n","import { isJSONObject } from '@ai-sdk/provider';\nimport type { MCPAppMetadata, MCPAppRendererProps } from './types';\n\n/**\n * Extracts MCP App metadata from an AI SDK tool UI part.\n *\n * @example\n * ```ts\n * const app = getMCPAppFromToolPart({\n * type: 'dynamic-tool',\n * toolName: 'showDashboard',\n * toolCallId: 'call-1',\n * state: 'input-available',\n * input: { topic: 'usage' },\n * toolMetadata: {\n * app: {\n * resourceUri: 'ui://example/dashboard',\n * mimeType: 'text/html;profile=mcp-app',\n * },\n * },\n * });\n * // { resourceUri: 'ui://example/dashboard', mimeType: 'text/html;profile=mcp-app' }\n * ```\n */\nexport function getMCPAppFromToolPart(\n part: MCPAppRendererProps['part'],\n): MCPAppMetadata | undefined {\n const rawAppMetadata = part.toolMetadata?.app;\n const appMetadata = isJSONObject(rawAppMetadata) ? rawAppMetadata : undefined;\n\n if (\n appMetadata == null ||\n appMetadata.mimeType !== 'text/html;profile=mcp-app' ||\n typeof appMetadata.resourceUri !== 'string' ||\n !appMetadata.resourceUri.startsWith('ui://') ||\n (appMetadata.visibility != null &&\n (!Array.isArray(appMetadata.visibility) ||\n appMetadata.visibility.some(\n value => value !== 'model' && value !== 'app',\n )))\n ) {\n return undefined;\n }\n\n return appMetadata as MCPAppMetadata;\n}\n\n/**\n * Converts an AI SDK tool output into the MCP Apps tool-result shape.\n *\n * MCP Apps expect tool results to have `content` and optional\n * `structuredContent`. MCP tools already return that shape, but typed AI SDK\n * tools may return only structured data. This helper wraps structured-only\n * outputs so the iframe can receive a valid tool result notification.\n *\n * @example\n * ```ts\n * normalizeMCPAppToolResult({ cards: [] });\n * // { content: [], structuredContent: { cards: [] } }\n * ```\n */\nexport function normalizeMCPAppToolResult(output: unknown): {\n content: unknown[];\n structuredContent?: unknown;\n isError?: boolean;\n} {\n if (output != null && typeof output === 'object' && 'content' in output) {\n return output as {\n content: unknown[];\n structuredContent?: unknown;\n isError?: boolean;\n };\n }\n\n return {\n content: [],\n structuredContent: output,\n };\n}\n","import type { FlexibleSchema } from '@ai-sdk/provider-utils';\nimport {\n useObject,\n type UseObjectHelpers,\n type UseObjectOptions,\n} from './use-object';\n\nexport * from './use-chat';\nexport { Chat } from './chat.react';\nexport * from './use-completion';\nexport * from './use-object';\nexport * from './use-realtime';\nexport * from './mcp-apps';\n\n// deprecated aliases\n// note: declared here (instead of export aliases) so that the `@deprecated`\n// tags are preserved in the bundled type declarations\n\n/**\n * @deprecated Use `useObject` instead.\n */\nexport const experimental_useObject = useObject;\n\n/**\n * @deprecated Use `UseObjectOptions` instead.\n */\nexport type Experimental_UseObjectOptions<\n SCHEMA extends FlexibleSchema,\n RESULT,\n> = UseObjectOptions<SCHEMA, RESULT>;\n\n/**\n * @deprecated Use `UseObjectHelpers` instead.\n */\nexport type Experimental_UseObjectHelpers<RESULT, INPUT> = UseObjectHelpers<\n RESULT,\n INPUT\n>;\n"],"mappings":"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","names":["fetch","error","useCallback","useRef","throttle","useRef","useCallback","normalizeHeaders","useCallback","useEffect","useId","useRef","useState","useSWR","fetch","useId","useSWR","useState","useRef","useEffect","useCallback","normalizeHeaders","completion","useCallback","useEffect","useMemo","useRef","useSyncExternalStore","_a","options","useEffect","useState","useEffect","useMemo","useRef","resolve","isJSONObject","useRef","useMemo","_a","useEffect","jsx","useState","useEffect","resource","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/use-object.ts","../src/use-chat.ts","../src/chat.react.ts","../src/throttle.ts","../src/use-completion.ts","../src/use-realtime.ts","../src/mcp-apps/app-renderer.tsx","../src/mcp-apps/app-frame.tsx","../src/mcp-apps/bridge.ts","../src/mcp-apps/sandbox.ts","../src/mcp-apps/utils.ts","../src/index.ts"],"sourcesContent":["import {\n isAbortError,\n resolve,\n normalizeHeaders,\n safeValidateTypes,\n type FetchFunction,\n type FlexibleSchema,\n type InferSchema,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n} from 'ai';\nimport { useCallback, useId, useRef, useState } from 'react';\nimport useSWR from 'swr';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => fetch;\n\nexport type UseObjectOptions<SCHEMA extends FlexibleSchema, RESULT> = {\n /**\n * The API endpoint. It should stream JSON that matches the schema as chunked text.\n */\n api: string;\n\n /**\n * A schema that defines the shape of the complete object.\n */\n schema: SCHEMA;\n\n /**\n * An unique identifier. If not provided, a random one will be\n * generated. When provided, the `useObject` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * An optional value for the initial object.\n */\n initialValue?: DeepPartial<RESULT>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Callback that is called when the stream has finished.\n */\n onFinish?: (event: {\n /**\n * The generated object (typed according to the schema).\n * Can be undefined if the final object does not match the schema.\n */\n object: RESULT | undefined;\n\n /**\n * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n */\n error: Error | undefined;\n }) => Promise<void> | void;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: (error: Error) => void;\n\n /**\n * Additional HTTP headers to be included in the request.\n * Can be a static object, a function that returns headers, or an async function\n * for dynamic auth tokens.\n */\n headers?: Resolvable<Record<string, string> | Headers>;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n};\n\nexport type UseObjectHelpers<RESULT, INPUT> = {\n /**\n * Calls the API with the provided input as JSON body.\n */\n submit: (input: INPUT) => void;\n\n /**\n * The current value for the generated object. Updated as the API streams JSON chunks.\n */\n object: DeepPartial<RESULT> | undefined;\n\n /**\n * The error object of the API request if any.\n */\n error: Error | undefined;\n\n /**\n * Flag that indicates whether an API request is in progress.\n */\n isLoading: boolean;\n\n /**\n * Abort the current request immediately, keep the current partial object if any.\n */\n stop: () => void;\n\n /**\n * Clear the object state.\n */\n clear: () => void;\n};\n\ntype ObjectState<RESULT> = {\n object: DeepPartial<RESULT> | undefined;\n};\n\nexport function useObject<\n SCHEMA extends FlexibleSchema,\n RESULT = InferSchema<SCHEMA>,\n INPUT = any,\n>({\n api,\n id,\n schema, // required, in the future we will use it for validation\n initialValue,\n fetch,\n onError,\n onFinish,\n headers,\n credentials,\n}: UseObjectOptions<SCHEMA, RESULT>): UseObjectHelpers<RESULT, INPUT> {\n // Generate an unique id if not provided.\n const hookId = useId();\n const completionId = id ?? hookId;\n\n // Store the completion state in SWR, using the completionId as the key to share states.\n const { data, mutate } = useSWR<ObjectState<RESULT>>(\n [completionId, 'object'],\n null,\n { fallbackData: { object: initialValue } },\n );\n\n const [error, setError] = useState<undefined | Error>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n\n // Abort controller to cancel the current API call.\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const stop = useCallback(() => {\n try {\n abortControllerRef.current?.abort();\n } catch {\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n }, []);\n\n const submit = async (input: INPUT) => {\n const abortController = new AbortController();\n\n try {\n clearObject();\n\n setIsLoading(true);\n\n abortControllerRef.current = abortController;\n\n // Resolve headers at request time (supports async functions for dynamic auth tokens)\n const resolvedHeaders = await resolve(headers);\n\n const actualFetch = fetch ?? getOriginalFetch();\n const response = await actualFetch(api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...normalizeHeaders(resolvedHeaders),\n },\n credentials,\n signal: abortController.signal,\n body: JSON.stringify(input),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) || 'Failed to fetch the response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n let accumulatedText = '';\n let latestObject: DeepPartial<RESULT> | undefined = undefined;\n\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream<string>({\n async write(chunk) {\n accumulatedText += chunk;\n\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value as DeepPartial<RESULT>;\n\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n\n mutate({ object: currentObject });\n }\n },\n\n async close() {\n if (abortControllerRef.current === abortController) {\n setIsLoading(false);\n }\n\n if (onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(schema),\n });\n\n await onFinish(\n validationResult.success\n ? { object: validationResult.value, error: undefined }\n : { object: undefined, error: validationResult.error },\n );\n }\n\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n },\n }),\n );\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n if (onError && error instanceof Error) {\n onError(error);\n }\n\n if (abortControllerRef.current === abortController) {\n setIsLoading(false);\n abortControllerRef.current = null;\n setError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n };\n\n const clear = () => {\n stop();\n clearObject();\n };\n\n const clearObject = () => {\n setError(undefined);\n setIsLoading(false);\n mutate({ object: undefined });\n };\n\n return {\n submit,\n object: data?.object,\n error,\n isLoading,\n stop,\n clear,\n };\n}\n","import {\n type AbstractChat,\n type ChatInit,\n type ChatTransport,\n type CreateUIMessage,\n type UIMessage,\n DefaultChatTransport,\n} from 'ai';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\nimport { Chat } from './chat.react';\n\nexport type { CreateUIMessage, UIMessage };\n\nexport type UseChatHelpers<UI_MESSAGE extends UIMessage> = {\n /**\n * The id of the chat.\n */\n readonly id: string;\n\n /**\n * Update the `messages` state locally. This is useful when you want to\n * edit the messages on the client, and then trigger the `reload` method\n * manually to regenerate the AI response.\n */\n setMessages: (\n messages: UI_MESSAGE[] | ((messages: UI_MESSAGE[]) => UI_MESSAGE[]),\n ) => void;\n\n error: Error | undefined;\n} & Pick<\n AbstractChat<UI_MESSAGE>,\n | 'sendMessage'\n | 'regenerate'\n | 'stop'\n | 'resumeStream'\n | 'addToolResult'\n | 'addToolOutput'\n | 'addToolApprovalResponse'\n | 'status'\n | 'messages'\n | 'clearError'\n>;\n\nexport type UseChatOptions<UI_MESSAGE extends UIMessage> = (\n | { chat: Chat<UI_MESSAGE> }\n | ChatInit<UI_MESSAGE>\n) & {\n /**\n * Custom throttle wait in ms for the chat messages and data updates.\n * Default is undefined, which disables throttling.\n */\n throttle?: number;\n\n /**\n * @deprecated Use `throttle` instead.\n */\n experimental_throttle?: number;\n\n /**\n * Whether to resume an ongoing chat generation stream.\n */\n resume?: boolean;\n};\n\nexport function useChat<UI_MESSAGE extends UIMessage = UIMessage>({\n throttle,\n experimental_throttle,\n resume = false,\n ...options\n}: UseChatOptions<UI_MESSAGE> = {}): UseChatHelpers<UI_MESSAGE> {\n const throttleWaitMs = throttle ?? experimental_throttle;\n // the Chat instance is created once and not recreated when options change,\n // so it would normally keep the callbacks/transport from the first render forever\n\n // keep latest values in a ref that is refreshed on every render,\n // and hand `Chat` stable wrappers that read from it to avoid stale closures\n const latestRef = useRef<\n Partial<\n Pick<\n ChatInit<UI_MESSAGE>,\n | 'onToolCall'\n | 'onData'\n | 'onFinish'\n | 'onError'\n | 'sendAutomaticallyWhen'\n | 'transport'\n >\n >\n >({});\n\n if (!('chat' in options)) {\n latestRef.current = {\n onToolCall: options.onToolCall,\n onData: options.onData,\n onFinish: options.onFinish,\n onError: options.onError,\n sendAutomaticallyWhen: options.sendAutomaticallyWhen,\n transport: options.transport,\n };\n }\n\n // resolve the latest transport and fallback to a lazily created default transport\n let defaultTransport: ChatTransport<UI_MESSAGE> | undefined;\n const getTransport = () =>\n latestRef.current.transport ??\n (defaultTransport ??= new DefaultChatTransport<UI_MESSAGE>());\n\n // give `Chat` stable wrappers that always read the latest values from `latestRef`\n const chatOptions: typeof options = {\n ...options,\n transport: {\n sendMessages: sendOptions => getTransport().sendMessages(sendOptions),\n reconnectToStream: reconnectOptions =>\n getTransport().reconnectToStream(reconnectOptions),\n },\n onToolCall: arg => latestRef.current.onToolCall?.(arg),\n onData: arg => latestRef.current.onData?.(arg),\n onFinish: arg => latestRef.current.onFinish?.(arg),\n onError: arg => latestRef.current.onError?.(arg),\n sendAutomaticallyWhen: arg =>\n latestRef.current.sendAutomaticallyWhen?.(arg) ?? false,\n };\n\n const chatKey = 'chat' in options ? options.chat : options.id;\n const { chat, isExternallyManaged } = useMemo(\n () => ({\n chat: 'chat' in options ? options.chat : new Chat(chatOptions),\n isExternallyManaged: 'chat' in options,\n }),\n [chatKey],\n );\n\n useEffect(() => {\n if (isExternallyManaged) {\n return;\n }\n\n return () => {\n void chat.stop();\n };\n }, [chat, isExternallyManaged]);\n\n const messagesSnapshot = useMemo(() => ({ messages: chat.messages }), [chat]);\n\n const subscribeToMessages = useCallback(\n (update: () => void) => {\n let isSubscribed = true;\n\n const updateMessages = () => {\n if (!isSubscribed) {\n return;\n }\n\n messagesSnapshot.messages = chat.messages;\n update();\n };\n\n const unsubscribe = chat['~registerMessagesCallback'](\n updateMessages,\n throttleWaitMs,\n );\n\n // Synchronize changes that may have happened between render and\n // subscription. useSyncExternalStore checks the snapshot after\n // subscribing and schedules a render when it changed.\n messagesSnapshot.messages = chat.messages;\n\n return () => {\n isSubscribed = false;\n unsubscribe();\n };\n },\n [chat, messagesSnapshot, throttleWaitMs],\n );\n\n const getMessagesSnapshot = useCallback(\n () => messagesSnapshot.messages,\n [messagesSnapshot],\n );\n\n const messages = useSyncExternalStore(\n subscribeToMessages,\n getMessagesSnapshot,\n getMessagesSnapshot,\n );\n\n const subscribeToStatus = useCallback(\n (update: () => void) =>\n chat['~registerStatusCallback'](() => {\n if (chat.status === 'ready' || chat.status === 'error') {\n // Publish the latest messages before the terminal status can render.\n messagesSnapshot.messages = chat.messages;\n }\n\n update();\n }),\n [chat, messagesSnapshot],\n );\n\n const getStatusSnapshot = useCallback(() => chat.status, [chat]);\n\n const status = useSyncExternalStore(\n subscribeToStatus,\n getStatusSnapshot,\n getStatusSnapshot,\n );\n\n const error = useSyncExternalStore(\n chat['~registerErrorCallback'],\n () => chat.error,\n () => chat.error,\n );\n\n const setMessages = useCallback(\n (\n messagesParam: UI_MESSAGE[] | ((messages: UI_MESSAGE[]) => UI_MESSAGE[]),\n ) => {\n if (typeof messagesParam === 'function') {\n messagesParam = messagesParam(chat.messages);\n }\n chat.messages = messagesParam;\n },\n [chat],\n );\n\n useEffect(() => {\n if (resume) {\n chat.resumeStream();\n }\n }, [resume, chat]);\n\n return {\n id: chat.id,\n messages,\n setMessages,\n sendMessage: chat.sendMessage,\n regenerate: chat.regenerate,\n clearError: chat.clearError,\n stop: chat.stop,\n error,\n resumeStream: chat.resumeStream,\n status,\n /**\n * @deprecated Use `addToolOutput` instead.\n */\n addToolResult: chat.addToolOutput,\n addToolOutput: chat.addToolOutput,\n addToolApprovalResponse: chat.addToolApprovalResponse,\n };\n}\n","import {\n AbstractChat,\n type ChatInit,\n type ChatState,\n type ChatStatus,\n type UIMessage,\n} from 'ai';\nimport { throttle } from './throttle';\n\nfunction cloneMetadata<METADATA>(metadata: METADATA): METADATA {\n if (Array.isArray(metadata)) {\n return [...metadata] as METADATA;\n }\n\n if (\n metadata != null &&\n typeof metadata === 'object' &&\n (Object.getPrototypeOf(metadata) === Object.prototype ||\n Object.getPrototypeOf(metadata) === null)\n ) {\n return { ...metadata } as METADATA;\n }\n\n return metadata;\n}\n\nclass ReactChatState<\n UI_MESSAGE extends UIMessage,\n> implements ChatState<UI_MESSAGE> {\n #messages: UI_MESSAGE[];\n #status: ChatStatus = 'ready';\n #error: Error | undefined = undefined;\n\n #messagesCallbacks = new Set<() => void>();\n #statusCallbacks = new Set<() => void>();\n #errorCallbacks = new Set<() => void>();\n\n constructor(initialMessages: UI_MESSAGE[] = []) {\n this.#messages = initialMessages;\n }\n\n get status(): ChatStatus {\n return this.#status;\n }\n\n set status(newStatus: ChatStatus) {\n this.#status = newStatus;\n this.#callStatusCallbacks();\n }\n\n get error(): Error | undefined {\n return this.#error;\n }\n\n set error(newError: Error | undefined) {\n this.#error = newError;\n this.#callErrorCallbacks();\n }\n\n get messages(): UI_MESSAGE[] {\n return this.#messages;\n }\n\n set messages(newMessages: UI_MESSAGE[]) {\n this.#messages = [...newMessages];\n this.#callMessagesCallbacks();\n }\n\n pushMessage = (message: UI_MESSAGE) => {\n this.#messages = this.#messages.concat(message);\n this.#callMessagesCallbacks();\n };\n\n popMessage = () => {\n this.#messages = this.#messages.slice(0, -1);\n this.#callMessagesCallbacks();\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n this.#messages = [\n ...this.#messages.slice(0, index),\n this.snapshot(message),\n ...this.#messages.slice(index + 1),\n ];\n this.#callMessagesCallbacks();\n };\n\n snapshot = <T>(value: T): T => {\n if (\n value == null ||\n typeof value !== 'object' ||\n !('parts' in value) ||\n !Array.isArray(value.parts)\n ) {\n return value;\n }\n\n const message = value as UI_MESSAGE;\n const snapshot = {\n ...message,\n parts: message.parts.map(part => ({ ...part })),\n };\n\n if ('metadata' in message) {\n snapshot.metadata = cloneMetadata(message.metadata);\n }\n\n return snapshot as T;\n };\n\n '~registerMessagesCallback' = (\n onChange: () => void,\n throttleWaitMs?: number,\n ): (() => void) => {\n const callback = throttleWaitMs\n ? throttle(onChange, throttleWaitMs)\n : onChange;\n this.#messagesCallbacks.add(callback);\n return () => {\n this.#messagesCallbacks.delete(callback);\n };\n };\n\n '~registerStatusCallback' = (onChange: () => void): (() => void) => {\n this.#statusCallbacks.add(onChange);\n return () => {\n this.#statusCallbacks.delete(onChange);\n };\n };\n\n '~registerErrorCallback' = (onChange: () => void): (() => void) => {\n this.#errorCallbacks.add(onChange);\n return () => {\n this.#errorCallbacks.delete(onChange);\n };\n };\n\n #callMessagesCallbacks = () => {\n this.#messagesCallbacks.forEach(callback => callback());\n };\n\n #callStatusCallbacks = () => {\n this.#statusCallbacks.forEach(callback => callback());\n };\n\n #callErrorCallbacks = () => {\n this.#errorCallbacks.forEach(callback => callback());\n };\n}\n\nexport class Chat<\n UI_MESSAGE extends UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n #state: ReactChatState<UI_MESSAGE>;\n\n constructor({ messages, ...init }: ChatInit<UI_MESSAGE>) {\n const state = new ReactChatState(messages);\n super({ ...init, state });\n this.#state = state;\n }\n\n '~registerMessagesCallback' = (\n onChange: () => void,\n throttleWaitMs?: number,\n ): (() => void) =>\n this.#state['~registerMessagesCallback'](onChange, throttleWaitMs);\n\n '~registerStatusCallback' = (onChange: () => void): (() => void) =>\n this.#state['~registerStatusCallback'](onChange);\n\n '~registerErrorCallback' = (onChange: () => void): (() => void) =>\n this.#state['~registerErrorCallback'](onChange);\n}\n","import throttleFunction from 'throttleit';\n\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n waitMs: number | undefined,\n): T {\n return waitMs != null ? throttleFunction(fn, waitMs) : fn;\n}\n","import {\n callCompletionApi,\n type CompletionRequestOptions,\n type UseCompletionOptions,\n} from 'ai';\nimport { normalizeHeaders } from '@ai-sdk/provider-utils';\nimport { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport useSWR from 'swr';\nimport { throttle } from './throttle';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers<BODY extends object = object> = {\n /** The current completion result */\n completion: string;\n /**\n * Send a new prompt to the API endpoint and update the completion state.\n */\n complete: (\n prompt: string,\n options?: CompletionRequestOptions<BODY>,\n ) => Promise<string | null | undefined>;\n /** The error object of the API request */\n error: undefined | Error;\n /**\n * Abort the current API request but keep the generated tokens.\n */\n stop: () => void;\n /**\n * Update the `completion` state locally.\n */\n setCompletion: (completion: string) => void;\n /** The current value of the input */\n input: string;\n /** setState-powered method to update the input value */\n setInput: React.Dispatch<React.SetStateAction<string>>;\n /**\n * An input/textarea-ready onChange handler to control the value of the input\n * @example\n * ```jsx\n * <input onChange={handleInputChange} value={input} />\n * ```\n */\n handleInputChange: (\n event:\n | React.ChangeEvent<HTMLInputElement>\n | React.ChangeEvent<HTMLTextAreaElement>,\n ) => void;\n\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form onSubmit={handleSubmit}>\n * <input onChange={handleInputChange} value={input} />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n\n /** Whether the API request is in progress */\n isLoading: boolean;\n};\n\nexport function useCompletion<BODY extends object = object>({\n api = '/api/completion',\n id,\n initialCompletion = '',\n initialInput = '',\n credentials,\n headers,\n body,\n streamProtocol = 'data',\n fetch,\n onFinish,\n onError,\n throttle: throttleWait,\n experimental_throttle,\n}: UseCompletionOptions<NoInfer<BODY>> & {\n /**\n * Custom throttle wait in ms for the completion and data updates.\n * Default is undefined, which disables throttling.\n */\n throttle?: number;\n\n /**\n * @deprecated Use `throttle` instead.\n */\n experimental_throttle?: number;\n} = {}): UseCompletionHelpers<BODY> {\n const throttleWaitMs = throttleWait ?? experimental_throttle;\n // Generate an unique id for the completion if not provided.\n const hookId = useId();\n const completionId = id || hookId;\n\n // Store the completion state in SWR, using the completionId as the key to share states.\n const { data, mutate } = useSWR<string>([api, completionId], null, {\n fallbackData: initialCompletion,\n });\n\n const { data: isLoading = false, mutate: mutateLoading } = useSWR<boolean>(\n [completionId, 'loading'],\n null,\n );\n\n const [error, setError] = useState<undefined | Error>(undefined);\n const completion = data!;\n\n // Abort controller to cancel the current API call.\n const abortControllerRef = useRef<AbortController | null>(null);\n const requestIdRef = useRef(0);\n\n const extraMetadataRef = useRef({\n credentials,\n headers,\n body,\n });\n\n useEffect(() => {\n extraMetadataRef.current = {\n credentials,\n headers,\n body,\n };\n }, [credentials, headers, body]);\n\n const triggerRequest = useCallback(\n async (prompt: string, options?: CompletionRequestOptions<BODY>) => {\n const requestId = ++requestIdRef.current;\n\n return callCompletionApi({\n api,\n prompt,\n credentials: extraMetadataRef.current.credentials,\n headers: {\n ...normalizeHeaders(extraMetadataRef.current.headers),\n ...normalizeHeaders(options?.headers),\n },\n body: {\n ...extraMetadataRef.current.body,\n ...options?.body,\n },\n streamProtocol,\n fetch,\n // throttle streamed ui updates:\n setCompletion: throttle((completion: string) => {\n if (requestIdRef.current === requestId) {\n mutate(completion, false);\n }\n }, throttleWaitMs),\n setLoading: mutateLoading,\n setError,\n setAbortController: controller => {\n abortControllerRef.current = controller;\n },\n getAbortController: () => abortControllerRef.current,\n onFinish,\n onError,\n });\n },\n [\n mutate,\n mutateLoading,\n api,\n extraMetadataRef,\n onFinish,\n onError,\n setError,\n streamProtocol,\n fetch,\n throttleWaitMs,\n ],\n );\n\n const stop = useCallback(() => {\n abortControllerRef.current?.abort();\n }, []);\n\n const setCompletion = useCallback(\n (completion: string) => {\n mutate(completion, false);\n },\n [mutate],\n );\n\n const complete = useCallback<UseCompletionHelpers<BODY>['complete']>(\n async (prompt, options) => {\n return triggerRequest(prompt, options);\n },\n [triggerRequest],\n );\n\n const [input, setInput] = useState(initialInput);\n\n const handleSubmit = useCallback(\n (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n if (!input) {\n return;\n }\n\n const result = complete(input);\n setInput('');\n return result;\n },\n [input, complete, setInput],\n );\n\n const handleInputChange = useCallback(\n (e: any) => {\n setInput(e.target.value);\n },\n [setInput],\n );\n\n return {\n completion,\n complete,\n error,\n setCompletion,\n stop,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isLoading,\n };\n}\n","import { secureJsonParse } from '@ai-sdk/provider-utils';\nimport {\n Experimental_AbstractRealtimeSession as AbstractRealtimeSession,\n type Experimental_RealtimeServerEvent as RealtimeServerEvent,\n type Experimental_RealtimeSessionOptions as RealtimeSessionOptions,\n type Experimental_RealtimeState as RealtimeState,\n type Experimental_RealtimeStatus as RealtimeStatus,\n type UIMessage,\n} from 'ai';\nimport {\n useCallback,\n useEffect,\n useInsertionEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\ntype UseRealtimeOptions = RealtimeSessionOptions;\n\ntype RealtimeStateKey = keyof RealtimeState;\n\nconst useIsomorphicLayoutEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nconst RealtimeStore = /* @__PURE__ */ (() =>\n class RealtimeStore extends AbstractRealtimeSession {\n protected state: RealtimeState = {\n status: 'disconnected',\n messages: [],\n events: [],\n isCapturing: false,\n isPlaying: false,\n };\n\n private callbacks: { [K in RealtimeStateKey]-?: Set<() => void> } = {\n status: new Set(),\n messages: new Set(),\n events: new Set(),\n isCapturing: new Set(),\n isPlaying: new Set(),\n session: new Set(),\n };\n\n get status(): RealtimeStatus {\n return this.state.status;\n }\n\n get messages(): UIMessage[] {\n return this.state.messages;\n }\n\n get events(): RealtimeServerEvent[] {\n return this.state.events;\n }\n\n get isCapturing(): boolean {\n return this.state.isCapturing;\n }\n\n get isPlaying(): boolean {\n return this.state.isPlaying;\n }\n\n get session(): RealtimeState['session'] {\n return this.state.session;\n }\n\n subscribe(key: RealtimeStateKey, onChange: () => void): () => void {\n this.callbacks[key].add(onChange);\n\n return () => {\n this.callbacks[key].delete(onChange);\n };\n }\n\n protected setState<K extends RealtimeStateKey>(\n key: K,\n value: RealtimeState[K],\n ): void {\n this.state = { ...this.state, [key]: value };\n this.callbacks[key].forEach(callback => callback());\n }\n })();\n\ntype RealtimeStore = InstanceType<typeof RealtimeStore>;\n\ntype UseRealtimeReturn = {\n status: RealtimeStatus;\n messages: UIMessage[];\n events: RealtimeServerEvent[];\n isCapturing: boolean;\n isPlaying: boolean;\n session?: RealtimeState['session'];\n\n connect: AbstractRealtimeSession['connect'];\n close: AbstractRealtimeSession['close'];\n resumePlayback: () => Promise<void>;\n resumeAudioCapture: () => Promise<void>;\n disconnect: () => void;\n addToolOutput: (callId: string, result: unknown) => void;\n sendEvent: AbstractRealtimeSession['sendEvent'];\n sendTextMessage: (text: string) => void;\n sendAudio: (base64Audio: string) => void;\n commitAudio: () => void;\n clearAudioBuffer: () => void;\n requestResponse: (options?: { modalities?: string[] }) => void;\n cancelResponse: () => void;\n startAudioCapture: (stream: MediaStream) => void;\n stopAudioCapture: () => void;\n stopPlayback: () => void;\n};\n\nfunction useRealtime(options: UseRealtimeOptions): UseRealtimeReturn {\n const ownerRef = useRef<{\n store: RealtimeStore;\n onToolCall: UseRealtimeOptions['onToolCall'];\n onEvent: UseRealtimeOptions['onEvent'];\n onError: UseRealtimeOptions['onError'];\n } | null>(null);\n const {\n model,\n api,\n startupTimeoutMs,\n closeTimeoutMs,\n rtcDisconnectTimeoutMs,\n sessionConfig,\n sampleRate,\n maxEvents,\n maxPlaybackBufferSeconds,\n onToolCall,\n onEvent,\n onError,\n } = options;\n const { token, websocket, session: sessionEndpoint } = api;\n const protocols = JSON.stringify(api.protocols ?? []);\n\n // Candidates allocate no transports or media; only a committed owner can act.\n const rt = useMemo(() => {\n const store: RealtimeStore = new RealtimeStore({\n model,\n api:\n token != null\n ? { token }\n : sessionEndpoint != null\n ? { session: sessionEndpoint }\n : {\n websocket: websocket as string,\n protocols: secureJsonParse(protocols) as string[],\n },\n startupTimeoutMs,\n closeTimeoutMs,\n rtcDisconnectTimeoutMs,\n sessionConfig,\n sampleRate,\n maxEvents,\n maxPlaybackBufferSeconds,\n onEvent: (...args) =>\n ownerRef.current?.store === store\n ? ownerRef.current.onEvent?.(...args)\n : undefined,\n onError: (...args) =>\n ownerRef.current?.store === store\n ? ownerRef.current.onError?.(...args)\n : undefined,\n });\n return store;\n }, [\n model,\n token,\n sessionEndpoint,\n websocket,\n protocols,\n startupTimeoutMs,\n closeTimeoutMs,\n rtcDisconnectTimeoutMs,\n sessionConfig,\n sampleRate,\n maxEvents,\n maxPlaybackBufferSeconds,\n ]);\n\n // Publish before child layout effects; insertion cleanup only revokes refs.\n useInsertionEffect(() => {\n ownerRef.current = { store: rt, onToolCall, onEvent, onError };\n rt.onToolCall =\n onToolCall == null\n ? undefined\n : (...args) =>\n ownerRef.current?.store === rt\n ? ownerRef.current.onToolCall?.(...args)\n : undefined;\n return () => {\n ownerRef.current = null;\n };\n });\n\n // StrictMode replays layout effects, but keeps the insertion-phase owner.\n useIsomorphicLayoutEffect(() => {\n return () => rt.dispose();\n }, [rt]);\n\n const actions = useMemo(() => {\n const current = () => {\n if (ownerRef.current == null)\n throw new Error('Realtime controls require a mounted hook');\n return ownerRef.current.store;\n };\n return {\n connect: async (options?: {\n stream?: MediaStream;\n capture?: boolean;\n }) => {\n const store = current();\n return options == null ? store.connect() : store.connect(options);\n },\n close: async options => current().close(options),\n resumePlayback: async () => current().resumePlayback(),\n resumeAudioCapture: async () => current().resumeAudioCapture(),\n disconnect: () => current().disconnect(),\n addToolOutput: (callId, result) =>\n current().addToolOutput(callId, result),\n sendEvent: event => current().sendEvent(event),\n sendTextMessage: text => current().sendTextMessage(text),\n sendAudio: audio => current().sendAudio(audio),\n commitAudio: () => current().commitAudio(),\n clearAudioBuffer: () => current().clearAudioBuffer(),\n requestResponse: options => current().requestResponse(options),\n cancelResponse: () => current().cancelResponse(),\n startAudioCapture: stream => current().startAudioCapture(stream),\n stopAudioCapture: () => current().stopAudioCapture(),\n stopPlayback: () => current().stopPlayback(),\n } satisfies Omit<UseRealtimeReturn, keyof RealtimeState>;\n }, []);\n\n const status = useSyncExternalStore(\n useCallback(cb => rt.subscribe('status', cb), [rt]),\n () => rt.status,\n () => rt.status,\n );\n\n const messages = useSyncExternalStore(\n useCallback(cb => rt.subscribe('messages', cb), [rt]),\n () => rt.messages,\n () => rt.messages,\n );\n\n const events = useSyncExternalStore(\n useCallback(cb => rt.subscribe('events', cb), [rt]),\n () => rt.events,\n () => rt.events,\n );\n\n const isCapturing = useSyncExternalStore(\n useCallback(cb => rt.subscribe('isCapturing', cb), [rt]),\n () => rt.isCapturing,\n () => rt.isCapturing,\n );\n\n const isPlaying = useSyncExternalStore(\n useCallback(cb => rt.subscribe('isPlaying', cb), [rt]),\n () => rt.isPlaying,\n () => rt.isPlaying,\n );\n\n const session = useSyncExternalStore(\n useCallback(cb => rt.subscribe('session', cb), [rt]),\n () => rt.session,\n () => rt.session,\n );\n\n return {\n status,\n messages,\n events,\n isCapturing,\n isPlaying,\n session,\n ...actions,\n };\n}\n\nexport const experimental_useRealtime = useRealtime;\n\nexport type {\n RealtimeStatus as Experimental_RealtimeStatus,\n UseRealtimeOptions as Experimental_UseRealtimeOptions,\n UseRealtimeReturn as Experimental_UseRealtimeReturn,\n};\n","import type { MCPAppResource } from '@ai-sdk/mcp';\nimport { useEffect, useState } from 'react';\nimport { MCPAppFrame } from './app-frame';\nimport type { MCPAppMetadata, MCPAppRendererProps } from './types';\nimport { getMCPAppFromToolPart } from './utils';\n\ntype LoadedResourceState = {\n resourceUri: string;\n resource?: MCPAppResource;\n error?: Error;\n};\n\nfunction getToolPartOutput(part: MCPAppRendererProps['part']): unknown {\n return part.state === 'output-available' ? part.output : undefined;\n}\n\nfunction getToolPartInput(part: MCPAppRendererProps['part']): unknown {\n return part.state === 'input-available' || part.state === 'output-available'\n ? part.input\n : undefined;\n}\n\nexport function MCPAppRenderer({\n part,\n sandbox,\n resource: resourceProp,\n loadResource,\n handlers,\n hostInfo,\n hostContext,\n fallback = null,\n}: MCPAppRendererProps) {\n const app = getMCPAppFromToolPart(part);\n const [cachedApp, setCachedApp] = useState<MCPAppMetadata>();\n const [loadedResource, setLoadedResource] = useState<LoadedResourceState>();\n\n useEffect(() => {\n if (app != null) {\n setCachedApp(previous =>\n previous?.resourceUri === app.resourceUri ? previous : app,\n );\n }\n }, [app?.resourceUri]);\n\n const appForRender = app ?? cachedApp;\n\n useEffect(() => {\n if (appForRender == null || resourceProp != null || loadResource == null) {\n return;\n }\n\n let cancelled = false;\n const resourceUri = appForRender.resourceUri;\n\n loadResource(appForRender)\n .then(resource => {\n if (!cancelled) {\n setLoadedResource({ resourceUri, resource });\n }\n })\n .catch(error => {\n if (!cancelled) {\n setLoadedResource({\n resourceUri,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [appForRender?.resourceUri, loadResource, resourceProp]);\n\n const loadedResourceForApp =\n loadedResource?.resourceUri === appForRender?.resourceUri\n ? loadedResource\n : undefined;\n const resource = resourceProp ?? loadedResourceForApp?.resource;\n const error = resourceProp == null ? loadedResourceForApp?.error : undefined;\n\n if (appForRender == null || error != null || resource == null) {\n return fallback;\n }\n\n return (\n <MCPAppFrame\n app={appForRender}\n resource={resource}\n input={getToolPartInput(part)}\n output={getToolPartOutput(part)}\n sandbox={sandbox}\n handlers={handlers}\n hostInfo={hostInfo}\n hostContext={hostContext}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { MCPAppBridge } from './bridge';\nimport {\n MCP_APP_DEFAULT_INNER_SANDBOX,\n MCP_APP_DEFAULT_OUTER_SANDBOX,\n getMCPAppAllowAttribute,\n getMCPAppCSP,\n} from './sandbox';\nimport type { MCPAppFrameProps } from './types';\nimport { normalizeMCPAppToolResult } from './utils';\n\n/**\n * Derives the concrete origin of the sandbox proxy from its URL, so outbound\n * postMessage targets a specific origin instead of `'*'` and inbound messages\n * can be origin-checked. The proxy must be served from a stable, concrete\n * origin (the default outer sandbox keeps `allow-same-origin`). Falls back to\n * the host origin on a malformed URL, never `'*'`.\n */\nfunction deriveTargetOrigin(url: string): string {\n const location = typeof window !== 'undefined' ? window.location : undefined;\n try {\n return new URL(url, location?.href).origin;\n } catch {\n return location?.origin ?? 'null';\n }\n}\n\nfunction sendToolState({\n bridge,\n input,\n output,\n}: {\n bridge?: MCPAppBridge;\n input: unknown;\n output: unknown;\n}) {\n if (bridge == null) {\n return;\n }\n\n if (input !== undefined) {\n bridge.sendToolInput(input);\n }\n\n if (output !== undefined) {\n bridge.sendToolResult(normalizeMCPAppToolResult(output));\n }\n}\n\nexport function MCPAppFrame({\n app,\n resource,\n input,\n output,\n sandbox,\n handlers,\n hostInfo,\n hostContext,\n}: MCPAppFrameProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const bridgeRef = useRef<MCPAppBridge | undefined>(undefined);\n const inputRef = useRef(input);\n const outputRef = useRef(output);\n const hostContextRef = useRef(hostContext);\n const initializedRef = useRef(false);\n inputRef.current = input;\n outputRef.current = output;\n hostContextRef.current = hostContext;\n const sandboxUrl = String(sandbox.url);\n const targetOrigin = sandbox.targetOrigin ?? deriveTargetOrigin(sandboxUrl);\n const resourceCSP = getMCPAppCSP(resource.meta?.csp);\n const resourceAllow = getMCPAppAllowAttribute(\n resource.meta?.permissions,\n sandbox.allowedPermissions,\n );\n const innerSandbox = sandbox.innerSandbox ?? MCP_APP_DEFAULT_INNER_SANDBOX;\n const bridgeHandlers = useMemo(\n () => ({\n ...handlers,\n onInitialized: () => {\n initializedRef.current = true;\n handlers?.onInitialized?.();\n sendToolState({\n bridge: bridgeRef.current,\n input: inputRef.current,\n output: outputRef.current,\n });\n },\n }),\n [handlers],\n );\n const bridgeHandlersRef = useRef(bridgeHandlers);\n bridgeHandlersRef.current = bridgeHandlers;\n\n useEffect(() => {\n const iframe = iframeRef.current;\n const targetWindow = iframe?.contentWindow;\n if (targetWindow == null) {\n return;\n }\n\n initializedRef.current = false;\n\n const bridge = new MCPAppBridge({\n targetWindow,\n targetOrigin,\n handlers: bridgeHandlersRef.current,\n hostInfo,\n hostContext: hostContextRef.current,\n });\n bridgeRef.current = bridge;\n\n const onMessage = (event: MessageEvent) => {\n // Only handle messages from the proxy window and expected origin.\n if (!bridge.acceptsEvent(event)) {\n return;\n }\n\n if (\n event.data?.jsonrpc === '2.0' &&\n event.data.method === 'ui/notifications/sandbox-proxy-ready'\n ) {\n bridge.sendSandboxResourceReady({\n html: resource.html,\n csp: resourceCSP,\n sandbox: innerSandbox,\n allow: resourceAllow,\n });\n return;\n }\n\n bridge.handleMessage(event);\n };\n\n window.addEventListener('message', onMessage);\n\n return () => {\n initializedRef.current = false;\n window.removeEventListener('message', onMessage);\n void bridge.teardownResource().catch(() => {});\n bridge.close();\n bridgeRef.current = undefined;\n };\n }, [\n hostInfo,\n innerSandbox,\n resource.html,\n resourceAllow,\n resourceCSP,\n sandboxUrl,\n targetOrigin,\n ]);\n\n useEffect(() => {\n bridgeRef.current?.setHandlers(bridgeHandlers);\n }, [bridgeHandlers]);\n\n useEffect(() => {\n if (hostContext != null) {\n bridgeRef.current?.setHostContext(hostContext);\n }\n }, [hostContext]);\n\n useEffect(() => {\n if (initializedRef.current && input !== undefined) {\n bridgeRef.current?.sendToolInput(input);\n }\n }, [input]);\n\n useEffect(() => {\n if (initializedRef.current && output !== undefined) {\n bridgeRef.current?.sendToolResult(normalizeMCPAppToolResult(output));\n }\n }, [output]);\n\n return (\n <iframe\n ref={iframeRef}\n title=\"MCP App\"\n aria-label={sandbox.title ?? app.resourceUri}\n src={sandboxUrl}\n className={sandbox.className}\n style={sandbox.style}\n // Permissions Policy is hierarchical: the outer frame must delegate a\n // feature for the proxy to re-delegate it to the inner app frame.\n allow={resourceAllow}\n sandbox={sandbox.outerSandbox ?? MCP_APP_DEFAULT_OUTER_SANDBOX}\n />\n );\n}\n","import { isJSONObject } from '@ai-sdk/provider';\nimport type {\n MCPAppBridgeHandlers,\n MCPAppHostContext,\n MCPAppJsonRpcMessage,\n MCPAppJsonRpcNotification,\n MCPAppJsonRpcRequest,\n MCPAppJsonRpcResponse,\n MCPAppToolCallParams,\n} from './types';\n\nconst MCP_APP_PROTOCOL_VERSION = '2026-01-26';\n\n/**\n * Checks whether an iframe message looks like a JSON-RPC 2.0 message.\n */\nfunction isJsonRpcMessage(value: unknown): value is MCPAppJsonRpcMessage {\n return (\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'jsonrpc' in value &&\n value.jsonrpc === '2.0'\n );\n}\n\n/**\n * Checks whether a JSON-RPC message expects a response.\n */\nfunction isRequest(\n message: MCPAppJsonRpcMessage,\n): message is MCPAppJsonRpcRequest {\n return 'method' in message && 'id' in message;\n}\n\n/**\n * Checks whether a JSON-RPC message is a fire-and-forget notification.\n */\nfunction isNotification(\n message: MCPAppJsonRpcMessage,\n): message is MCPAppJsonRpcNotification {\n return 'method' in message && !('id' in message);\n}\n\n/**\n * Normalizes unknown thrown values into an `Error`.\n */\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Validates the params for app-initiated `tools/call` requests.\n */\nfunction assertToolCallParams(params: unknown): MCPAppToolCallParams {\n if (!isJSONObject(params) || typeof params.name !== 'string') {\n throw new Error('Invalid tools/call params');\n }\n\n return {\n name: params.name,\n arguments: isJSONObject(params.arguments) ? params.arguments : undefined,\n };\n}\n\n/**\n * Validates `resources/read` params and limits reads to `ui://` app resources.\n */\nfunction assertResourceReadParams(params: unknown): { uri: string } {\n if (!isJSONObject(params) || typeof params.uri !== 'string') {\n throw new Error('Invalid resources/read params');\n }\n if (!params.uri.startsWith('ui://')) {\n throw new Error(\n `resources/read is limited to ui:// resources: ${params.uri}`,\n );\n }\n return { uri: params.uri };\n}\n\n/**\n * Validates `ui/open-link` params and allows only `https:`/`http:`/`mailto:`\n * URLs.\n */\nfunction assertOpenLinkParams(params: unknown): { url: string } {\n if (!isJSONObject(params) || typeof params.url !== 'string') {\n throw new Error('Invalid ui/open-link params');\n }\n\n let scheme: string;\n try {\n scheme = new URL(params.url).protocol;\n } catch {\n throw new Error(`Invalid ui/open-link url: ${params.url}`);\n }\n\n if (scheme !== 'https:' && scheme !== 'http:' && scheme !== 'mailto:') {\n throw new Error(`Disallowed ui/open-link scheme: ${scheme}`);\n }\n\n return { url: params.url };\n}\n\n/**\n * Validates params for `ui/request-display-mode`.\n */\nfunction assertDisplayModeParams(params: unknown): {\n mode: 'inline' | 'fullscreen' | 'pip';\n} {\n if (\n !isJSONObject(params) ||\n (params.mode !== 'inline' &&\n params.mode !== 'fullscreen' &&\n params.mode !== 'pip')\n ) {\n throw new Error('Invalid ui/request-display-mode params');\n }\n return { mode: params.mode };\n}\n\n/**\n * Host-side JSON-RPC bridge for one MCP App iframe.\n *\n * It handles the MCP Apps initialization handshake, sends tool input/result\n * notifications to the iframe, and proxies allowed iframe requests through\n * host-provided callbacks.\n *\n * @example\n * ```ts\n * const bridge = new MCPAppBridge({\n * targetWindow: iframe.contentWindow!,\n * handlers: {\n * allowedTools: ['refreshDashboardData'],\n * callTool: params => client.callTool(params),\n * },\n * });\n *\n * window.addEventListener('message', event => bridge.handleMessage(event));\n * bridge.sendToolInput({ topic: 'usage' });\n * ```\n */\nexport class MCPAppBridge {\n private initialized = false;\n private pendingNotifications: MCPAppJsonRpcNotification[] = [];\n private nextRequestId = 0;\n private pendingResponses = new Map<\n string | number,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n }\n >();\n\n constructor({\n targetWindow,\n targetOrigin = '*',\n handlers = {},\n hostInfo = { name: 'ai-sdk-react', version: '1.0.0' },\n hostContext = { displayMode: 'inline' },\n }: {\n targetWindow: Window;\n targetOrigin?: string;\n handlers?: MCPAppBridgeHandlers;\n hostInfo?: { name: string; version: string };\n hostContext?: MCPAppHostContext;\n }) {\n this.targetWindow = targetWindow;\n this.targetOrigin = targetOrigin;\n this.handlers = handlers;\n this.hostInfo = hostInfo;\n this.hostContext = hostContext;\n }\n\n private targetWindow: Window;\n private targetOrigin: string;\n private handlers: MCPAppBridgeHandlers;\n private hostInfo: { name: string; version: string };\n private hostContext: MCPAppHostContext;\n\n /**\n * Replaces the callbacks used to serve iframe requests.\n */\n setHandlers(handlers: MCPAppBridgeHandlers): void {\n this.handlers = handlers;\n }\n\n /**\n * Updates host context and notifies the iframe after initialization.\n *\n * @example\n * ```ts\n * bridge.setHostContext({ theme: 'dark', displayMode: 'inline' });\n * ```\n */\n setHostContext(hostContext: MCPAppHostContext): void {\n this.hostContext = hostContext;\n this.sendNotification({\n method: 'ui/notifications/host-context-changed',\n params: hostContext,\n });\n }\n\n /**\n * Whether a `message` event came from the expected proxy window and origin.\n * The origin check is skipped only when `targetOrigin` is the `'*'` default.\n * Callers that intercept events before {@link handleMessage} share this check.\n */\n acceptsEvent(event: MessageEvent): boolean {\n return (\n event.source === this.targetWindow &&\n (this.targetOrigin === '*' || event.origin === this.targetOrigin)\n );\n }\n\n /**\n * Processes one `message` event from the sandbox proxy iframe.\n */\n handleMessage(event: MessageEvent): void {\n if (!this.acceptsEvent(event) || !isJsonRpcMessage(event.data)) {\n return;\n }\n\n const message = event.data;\n\n if ('result' in message || 'error' in message) {\n this.handleResponse(message);\n return;\n }\n\n if (isRequest(message)) {\n void this.handleRequest(message);\n return;\n }\n\n if (isNotification(message)) {\n this.handleNotification(message);\n }\n }\n\n /**\n * Sends app HTML and sandbox settings to the sandbox proxy.\n */\n sendSandboxResourceReady(params: unknown): void {\n this.post({\n jsonrpc: '2.0',\n method: 'ui/notifications/sandbox-resource-ready',\n params,\n });\n }\n\n /**\n * Sends final tool arguments to the MCP App.\n */\n sendToolInput(input: unknown): void {\n this.sendNotification({\n method: 'ui/notifications/tool-input',\n params: { arguments: input },\n });\n }\n\n /**\n * Sends a completed MCP tool result to the MCP App.\n */\n sendToolResult(result: unknown): void {\n this.sendNotification({\n method: 'ui/notifications/tool-result',\n params: result,\n });\n }\n\n /**\n * Notifies the MCP App that the related tool call was cancelled.\n */\n sendToolCancelled(reason?: string): void {\n this.sendNotification({\n method: 'ui/notifications/tool-cancelled',\n params: reason != null ? { reason } : {},\n });\n }\n\n /**\n * Requests graceful teardown before the host removes the iframe.\n */\n teardownResource(): Promise<unknown> {\n return this.request('ui/resource-teardown', {});\n }\n\n /**\n * Rejects pending bridge requests and clears queued notifications.\n */\n close(): void {\n for (const pending of this.pendingResponses.values()) {\n pending.reject(new Error('MCP App bridge closed'));\n }\n this.pendingResponses.clear();\n this.pendingNotifications = [];\n }\n\n /**\n * Resolves or rejects a host-initiated request when the iframe responds.\n */\n private handleResponse(response: MCPAppJsonRpcResponse): void {\n const pending = this.pendingResponses.get(response.id);\n if (pending == null) {\n return;\n }\n\n this.pendingResponses.delete(response.id);\n\n if (response.error != null) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n\n /**\n * Runs a handler for an iframe request and posts the JSON-RPC response.\n */\n private async handleRequest(request: MCPAppJsonRpcRequest): Promise<void> {\n try {\n const result = await this.getRequestResult(request);\n this.post({ jsonrpc: '2.0', id: request.id, result });\n } catch (error) {\n const normalizedError = toError(error);\n this.handlers.onError?.(normalizedError);\n this.post({\n jsonrpc: '2.0',\n id: request.id,\n error: { code: -32603, message: normalizedError.message },\n });\n }\n }\n\n /**\n * Maps supported iframe request methods to host callbacks.\n */\n private async getRequestResult(\n request: MCPAppJsonRpcRequest,\n ): Promise<unknown> {\n switch (request.method) {\n case 'ui/initialize':\n return {\n protocolVersion: MCP_APP_PROTOCOL_VERSION,\n hostCapabilities: {\n ...(this.handlers.callTool != null ? { serverTools: {} } : {}),\n ...(this.handlers.readResource != null\n ? { serverResources: {} }\n : {}),\n ...(this.handlers.onLog != null ? { logging: {} } : {}),\n },\n hostInfo: this.hostInfo,\n hostContext: this.hostContext,\n };\n\n case 'tools/call': {\n if (this.handlers.callTool == null) {\n throw new Error('No tools/call handler configured');\n }\n const params = assertToolCallParams(request.params);\n // Deny-by-default: the (untrusted) MCP App may only invoke tools the\n // host has explicitly allow-listed. Omitting `allowedTools` exposes no\n // tools, rather than forwarding every requested tool to `callTool`.\n if (\n this.handlers.allowedTools == null ||\n !this.handlers.allowedTools.includes(params.name)\n ) {\n throw new Error(`Tool is not app-visible: ${params.name}`);\n }\n return this.handlers.callTool(params);\n }\n\n case 'resources/read':\n if (this.handlers.readResource == null) {\n throw new Error('No resources/read handler configured');\n }\n return this.handlers.readResource(\n assertResourceReadParams(request.params),\n );\n\n case 'resources/list':\n if (this.handlers.listResources == null) {\n throw new Error('No resources/list handler configured');\n }\n return this.handlers.listResources(request.params);\n\n case 'ui/open-link':\n if (this.handlers.openLink == null) {\n throw new Error('No ui/open-link handler configured');\n }\n return this.handlers.openLink(assertOpenLinkParams(request.params));\n\n case 'ui/message':\n return this.handlers.sendMessage?.(request.params) ?? {};\n\n case 'ui/update-model-context':\n return this.handlers.updateModelContext?.(request.params) ?? {};\n\n case 'ui/request-display-mode':\n return (\n this.handlers.requestDisplayMode?.(\n assertDisplayModeParams(request.params),\n ) ?? { mode: this.hostContext.displayMode ?? 'inline' }\n );\n\n default:\n throw new Error(`Unsupported MCP App method: ${request.method}`);\n }\n }\n\n /**\n * Handles iframe lifecycle and telemetry notifications.\n */\n private handleNotification(notification: MCPAppJsonRpcNotification): void {\n switch (notification.method) {\n case 'ui/notifications/initialized':\n this.initialized = true;\n this.flushNotifications();\n this.handlers.onInitialized?.();\n break;\n case 'ui/notifications/size-changed':\n this.handlers.onSizeChange?.(\n notification.params as { width?: number; height?: number },\n );\n break;\n case 'ui/notifications/request-teardown':\n this.handlers.onRequestTeardown?.(notification.params);\n break;\n case 'notifications/message':\n this.handlers.onLog?.(notification.params);\n break;\n }\n }\n\n /**\n * Sends a host-to-iframe notification, queueing it until app initialization.\n */\n private sendNotification(\n notification: Omit<MCPAppJsonRpcNotification, 'jsonrpc'>,\n ) {\n const message = { jsonrpc: '2.0' as const, ...notification };\n if (!this.initialized && !notification.method.includes('sandbox')) {\n this.pendingNotifications.push(message);\n return;\n }\n this.post(message);\n }\n\n /**\n * Sends notifications that were queued before `ui/notifications/initialized`.\n */\n private flushNotifications(): void {\n const notifications = this.pendingNotifications;\n this.pendingNotifications = [];\n for (const notification of notifications) {\n this.post(notification);\n }\n }\n\n /**\n * Sends a host-initiated JSON-RPC request to the iframe.\n */\n private request(method: string, params: unknown): Promise<unknown> {\n const id = this.nextRequestId++;\n this.post({ jsonrpc: '2.0', id, method, params });\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n });\n }\n\n /**\n * Posts a JSON-RPC message to the sandbox proxy iframe.\n */\n private post(message: MCPAppJsonRpcMessage): void {\n this.targetWindow.postMessage(message, this.targetOrigin);\n }\n}\n","import type { MCPAppResourceCSP } from '@ai-sdk/mcp';\n\n// CSP source values come from the (untrusted) MCP server. Rather than\n// denylisting bad characters on the raw string (which an encoding like \"%3B\"\n// can slip past), canonicalize each value: parse it as an absolute URL so any\n// percent-encoding is decoded, keep only https/wss origins, then re-check the\n// decoded origin so a separator that decoded back into \";\" \",\" or whitespace\n// cannot split the directive.\nconst ALLOWED_CSP_SCHEMES = new Set(['https:', 'wss:']);\n\nfunction sanitizeCSPSources(sources?: string[]): string[] {\n const result: string[] = [];\n for (const source of sources ?? []) {\n if (typeof source !== 'string') {\n continue;\n }\n\n let origin: string;\n try {\n const url = new URL(source);\n // Reject non-https/wss, the empty host, and a bare \"*\" host (which would\n // match every origin and defeat the allowlist, like scheme-only \"https:\").\n if (\n !ALLOWED_CSP_SCHEMES.has(url.protocol) ||\n url.host.length === 0 ||\n url.host === '*'\n ) {\n continue;\n }\n origin = url.origin;\n } catch {\n continue;\n }\n\n // Drop separators that split the directive and quotes that could break out\n // of an HTML attribute the policy may be embedded in downstream.\n if (/[\"'`\\s;,]/.test(origin)) {\n continue;\n }\n\n result.push(origin);\n }\n return result;\n}\n\n/**\n * Default sandbox permissions for the outer sandbox proxy iframe.\n */\nexport const MCP_APP_DEFAULT_OUTER_SANDBOX =\n 'allow-scripts allow-same-origin allow-forms';\n\n/**\n * Default sandbox permissions for the inner iframe that runs app HTML.\n */\nexport const MCP_APP_DEFAULT_INNER_SANDBOX = 'allow-scripts allow-forms';\n\n/**\n * Converts MCP App CSP metadata into a Content-Security-Policy string.\n *\n * The returned value is meant to be passed to a sandbox proxy, which can apply\n * it to the inner iframe document.\n *\n * @example\n * ```ts\n * const csp = getMCPAppCSP({\n * connectDomains: ['https://api.example.com'],\n * resourceDomains: ['https://cdn.example.com'],\n * });\n * ```\n */\nexport function getMCPAppCSP(csp?: MCPAppResourceCSP): string | undefined {\n if (csp == null) {\n return undefined;\n }\n\n const connectSrc = [\"'self'\", ...sanitizeCSPSources(csp.connectDomains)];\n const imgSrc = [\n \"'self'\",\n 'data:',\n ...sanitizeCSPSources(csp.resourceDomains),\n ];\n const frameSrc = [\"'self'\", ...sanitizeCSPSources(csp.frameDomains)];\n\n return [\n \"default-src 'none'\",\n \"base-uri 'none'\",\n \"form-action 'none'\",\n \"script-src 'unsafe-inline'\",\n \"style-src 'unsafe-inline'\",\n `connect-src ${connectSrc.join(' ')}`,\n `img-src ${imgSrc.join(' ')}`,\n `font-src ${imgSrc.join(' ')}`,\n `frame-src ${frameSrc.join(' ')}`,\n ].join('; ');\n}\n\n/**\n * A permission an MCP App may request and a host may allow.\n */\nexport type MCPAppPermission =\n | 'camera'\n | 'microphone'\n | 'geolocation'\n | 'clipboardWrite';\n\nconst MCP_APP_PERMISSION_FEATURES: Record<MCPAppPermission, string> = {\n camera: 'camera',\n microphone: 'microphone',\n geolocation: 'geolocation',\n clipboardWrite: 'clipboard-write',\n};\n\n/**\n * Converts MCP App permission metadata into an iframe `allow` attribute.\n *\n * Deny-by-default: a capability is granted only when it is both requested in\n * `permissions` and present in the host `allowedPermissions` allowlist.\n * Omitting the allowlist grants nothing, mirroring `allowedTools` in the bridge.\n *\n * @example\n * ```ts\n * const allow = getMCPAppAllowAttribute(\n * { microphone: {}, camera: {} },\n * ['microphone'],\n * );\n * // \"microphone\" — camera requested by server but not host-allowed\n * ```\n */\nexport function getMCPAppAllowAttribute(\n permissions?: Record<string, unknown>,\n allowedPermissions?: MCPAppPermission[],\n): string | undefined {\n if (permissions == null || allowedPermissions == null) {\n return undefined;\n }\n\n const allow = allowedPermissions\n .filter(permission => Boolean(permissions[permission]))\n .map(permission => MCP_APP_PERMISSION_FEATURES[permission]);\n\n return allow.length > 0 ? allow.join('; ') : undefined;\n}\n","import { isJSONObject } from '@ai-sdk/provider';\nimport type { MCPAppMetadata, MCPAppRendererProps } from './types';\n\n/**\n * Extracts MCP App metadata from an AI SDK tool UI part.\n *\n * @example\n * ```ts\n * const app = getMCPAppFromToolPart({\n * type: 'dynamic-tool',\n * toolName: 'showDashboard',\n * toolCallId: 'call-1',\n * state: 'input-available',\n * input: { topic: 'usage' },\n * toolMetadata: {\n * app: {\n * resourceUri: 'ui://example/dashboard',\n * mimeType: 'text/html;profile=mcp-app',\n * },\n * },\n * });\n * // { resourceUri: 'ui://example/dashboard', mimeType: 'text/html;profile=mcp-app' }\n * ```\n */\nexport function getMCPAppFromToolPart(\n part: MCPAppRendererProps['part'],\n): MCPAppMetadata | undefined {\n const rawAppMetadata = part.toolMetadata?.app;\n const appMetadata = isJSONObject(rawAppMetadata) ? rawAppMetadata : undefined;\n\n if (\n appMetadata == null ||\n appMetadata.mimeType !== 'text/html;profile=mcp-app' ||\n typeof appMetadata.resourceUri !== 'string' ||\n !appMetadata.resourceUri.startsWith('ui://') ||\n (appMetadata.visibility != null &&\n (!Array.isArray(appMetadata.visibility) ||\n appMetadata.visibility.some(\n value => value !== 'model' && value !== 'app',\n )))\n ) {\n return undefined;\n }\n\n return appMetadata as MCPAppMetadata;\n}\n\n/**\n * Converts an AI SDK tool output into the MCP Apps tool-result shape.\n *\n * MCP Apps expect tool results to have `content` and optional\n * `structuredContent`. MCP tools already return that shape, but typed AI SDK\n * tools may return only structured data. This helper wraps structured-only\n * outputs so the iframe can receive a valid tool result notification.\n *\n * @example\n * ```ts\n * normalizeMCPAppToolResult({ cards: [] });\n * // { content: [], structuredContent: { cards: [] } }\n * ```\n */\nexport function normalizeMCPAppToolResult(output: unknown): {\n content: unknown[];\n structuredContent?: unknown;\n isError?: boolean;\n} {\n if (output != null && typeof output === 'object' && 'content' in output) {\n return output as {\n content: unknown[];\n structuredContent?: unknown;\n isError?: boolean;\n };\n }\n\n return {\n content: [],\n structuredContent: output,\n };\n}\n","import type { FlexibleSchema } from '@ai-sdk/provider-utils';\nimport {\n useObject,\n type UseObjectHelpers,\n type UseObjectOptions,\n} from './use-object';\n\nexport * from './use-chat';\nexport { Chat } from './chat.react';\nexport * from './use-completion';\nexport * from './use-object';\nexport * from './use-realtime';\nexport * from './mcp-apps';\n\n// deprecated aliases\n// note: declared here (instead of export aliases) so that the `@deprecated`\n// tags are preserved in the bundled type declarations\n\n/**\n * @deprecated Use `useObject` instead.\n */\nexport const experimental_useObject = useObject;\n\n/**\n * @deprecated Use `UseObjectOptions` instead.\n */\nexport type Experimental_UseObjectOptions<\n SCHEMA extends FlexibleSchema,\n RESULT,\n> = UseObjectOptions<SCHEMA, RESULT>;\n\n/**\n * @deprecated Use `UseObjectHelpers` instead.\n */\nexport type Experimental_UseObjectHelpers<RESULT, INPUT> = UseObjectHelpers<\n RESULT,\n INPUT\n>;\n"],"mappings":"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","names":["fetch","error","useCallback","useRef","throttle","useRef","useCallback","normalizeHeaders","useCallback","useEffect","useId","useRef","useState","useSWR","fetch","useId","useSWR","useState","useRef","useEffect","useCallback","normalizeHeaders","completion","useCallback","useEffect","useMemo","useRef","useSyncExternalStore","options","useEffect","useState","useEffect","useMemo","useRef","resolve","isJSONObject","useRef","useMemo","useEffect","jsx","useState","useEffect","resource","error"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/react",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.119",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,15 +26,15 @@
|
|
|
26
26
|
"README.md"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ai-sdk/mcp": "2.0.
|
|
29
|
+
"@ai-sdk/mcp": "2.0.60",
|
|
30
30
|
"@ai-sdk/provider": "4.0.18",
|
|
31
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
32
|
-
"ai": "7.0.
|
|
31
|
+
"@ai-sdk/provider-utils": "5.0.49",
|
|
32
|
+
"ai": "7.0.116",
|
|
33
33
|
"swr": "^2.4.1",
|
|
34
34
|
"throttleit": "2.1.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@ai-sdk/test-server": "2.0.
|
|
37
|
+
"@ai-sdk/test-server": "2.0.2",
|
|
38
38
|
"@testing-library/jest-dom": "^6.9.1",
|
|
39
39
|
"@testing-library/react": "^16.3.2",
|
|
40
40
|
"@testing-library/user-event": "^14.6.1",
|