@cloudbase/agent-ui-web 0.0.2

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/dist/index.js ADDED
@@ -0,0 +1,550 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ clientTool: () => clientTool,
34
+ partialParse: () => partialParse,
35
+ serverTool: () => serverTool,
36
+ useChat: () => useChat
37
+ });
38
+ module.exports = __toCommonJS(index_exports);
39
+
40
+ // src/use-chat.tsx
41
+ var import_agent_shared = require("@cloudbase/agent-shared");
42
+
43
+ // src/utils.ts
44
+ var import_react = require("react");
45
+ var import_stream = require("eventsource-parser/stream");
46
+ var import_jsonrepair = require("jsonrepair");
47
+ function partialParse(input) {
48
+ try {
49
+ return JSON.parse(input);
50
+ } catch (_) {
51
+ try {
52
+ return JSON.parse((0, import_jsonrepair.jsonrepair)(input));
53
+ } catch (e) {
54
+ console.error("Failed to repair JSON", e);
55
+ return {};
56
+ }
57
+ }
58
+ }
59
+ function bodyToSseAsyncGenerator(body) {
60
+ const eventSourceStream = body.pipeThrough(new TextDecoderStream()).pipeThrough(new import_stream.EventSourceParserStream());
61
+ return readableStreamToAsyncGenerator(eventSourceStream);
62
+ }
63
+ async function* readableStreamToAsyncGenerator(stream) {
64
+ const reader = stream.getReader();
65
+ while (true) {
66
+ const { done, value } = await reader.read();
67
+ if (done) break;
68
+ yield value;
69
+ }
70
+ }
71
+ function safeJSONParse(json) {
72
+ try {
73
+ return JSON.parse(json);
74
+ } catch (_) {
75
+ return null;
76
+ }
77
+ }
78
+ function useRefState(initialValue) {
79
+ const ref = (0, import_react.useRef)(initialValue);
80
+ const [state, setState] = (0, import_react.useState)(initialValue);
81
+ const setStateAndRef = (value) => {
82
+ const next = typeof value === "function" ? value(ref.current) : value;
83
+ ref.current = next;
84
+ setState(next);
85
+ };
86
+ const getLatest = () => ref.current;
87
+ return [state, setStateAndRef, getLatest];
88
+ }
89
+
90
+ // src/use-chat.tsx
91
+ var z4 = __toESM(require("zod/v4/core"));
92
+ var import_react2 = require("react");
93
+
94
+ // src/tool.ts
95
+ function clientTool(tool) {
96
+ return tool;
97
+ }
98
+ function isClientToolWithHandler(tool) {
99
+ return "handler" in tool;
100
+ }
101
+ function isClientToolWithRender(tool) {
102
+ return "render" in tool;
103
+ }
104
+ function isClientToolWithRenderAndWaitForResponse(tool) {
105
+ return "renderAndWaitForResponse" in tool;
106
+ }
107
+ function serverTool(tool) {
108
+ return tool;
109
+ }
110
+
111
+ // src/use-chat.tsx
112
+ var import_react3 = require("react");
113
+ var import_uuid = require("uuid");
114
+ var import_zod_to_json_schema = require("@ag-kit/zod-to-json-schema");
115
+ function toJsonSchema(schema) {
116
+ return (0, import_agent_shared.isV4Schema)(schema) ? z4.toJSONSchema(schema) : (0, import_zod_to_json_schema.zodToJsonSchema)(schema);
117
+ }
118
+ function useChat({
119
+ clientTools,
120
+ serverTools,
121
+ url = "/send-message",
122
+ threadId = (0, import_uuid.v4)(),
123
+ interrupt,
124
+ fetch = globalThis.fetch
125
+ }) {
126
+ const threadIdRef = (0, import_react3.useRef)(threadId);
127
+ const [messages, setMessages] = useRefState([]);
128
+ const [_, setDeltaMessages, getLatestDeltaMessages] = useRefState([]);
129
+ const [loading] = useRefState(false);
130
+ const [streaming, setStreaming] = useRefState(false);
131
+ const [pendingInterrupt, setPendingInterrupt] = useRefState(
132
+ null
133
+ );
134
+ const [resolveInterrupt, setResolveInterrupt] = useRefState(null);
135
+ const [uiToolCalls, setUiToolCalls] = useRefState([]);
136
+ const [currentRoundUiToolCallIds, setCurrentRoundUiToolCallIds] = useRefState([]);
137
+ const calledToolCalls = (0, import_react3.useRef)(/* @__PURE__ */ new Set());
138
+ const [error, setError] = useRefState(null);
139
+ const uiMessages = messages.reduce((acc, cur, index) => {
140
+ if (cur.role === "user") {
141
+ return [
142
+ ...acc,
143
+ {
144
+ role: "user",
145
+ parts: [{ type: "text", text: cur.content }]
146
+ }
147
+ ];
148
+ } else if (cur.role === "system") {
149
+ return acc;
150
+ } else {
151
+ const lastMessage = acc.at(-1);
152
+ if (cur.role === "assistant") {
153
+ let parts = [];
154
+ if (cur.content?.trim()) {
155
+ parts.push({ type: "text", text: cur.content });
156
+ }
157
+ if (Array.isArray(cur.toolCalls) && cur.toolCalls.length > 0) {
158
+ parts = [
159
+ ...parts,
160
+ ...cur.toolCalls.map(
161
+ (toolCall) => {
162
+ const uiToolCall = uiToolCalls.find(
163
+ (x) => x.id === toolCall.id
164
+ );
165
+ const clientTool3 = clientTools?.find(
166
+ (tool) => tool.name === uiToolCall.name
167
+ );
168
+ const serverTool3 = serverTools?.find(
169
+ (tool) => tool.name === uiToolCall.name
170
+ );
171
+ if (clientTool3) {
172
+ if (isClientToolWithRender(clientTool3)) {
173
+ return {
174
+ ...uiToolCall,
175
+ type: "tool-call",
176
+ render: () => clientTool3.render({
177
+ input: partialParse(uiToolCall.arguments),
178
+ part: { ...uiToolCall, type: "tool-call" }
179
+ })
180
+ };
181
+ }
182
+ if (isClientToolWithRenderAndWaitForResponse(clientTool3)) {
183
+ return {
184
+ ...uiToolCall,
185
+ type: "tool-call",
186
+ render: () => clientTool3.renderAndWaitForResponse({
187
+ part: { ...uiToolCall, type: "tool-call" },
188
+ submitToolResult: uiToolCall.state === "input-available" ? (output) => {
189
+ setUiToolCalls((oldToolCalls) => {
190
+ const toolCallIndex = oldToolCalls.findIndex(
191
+ (x) => x.id === uiToolCall.id
192
+ );
193
+ return [
194
+ ...oldToolCalls.slice(0, toolCallIndex),
195
+ {
196
+ ...oldToolCalls[toolCallIndex],
197
+ result: output,
198
+ state: "output-available"
199
+ },
200
+ ...oldToolCalls.slice(toolCallIndex + 1)
201
+ ];
202
+ });
203
+ } : void 0
204
+ })
205
+ };
206
+ }
207
+ }
208
+ if (serverTool3) {
209
+ return {
210
+ ...uiToolCall,
211
+ type: "tool-call",
212
+ render: () => serverTool3.render({
213
+ input: partialParse(uiToolCall.arguments),
214
+ part: { ...uiToolCall, type: "tool-call" }
215
+ })
216
+ };
217
+ }
218
+ return { ...uiToolCall, type: "tool-call" };
219
+ }
220
+ )
221
+ ];
222
+ }
223
+ if (pendingInterrupt && !resolveInterrupt) {
224
+ parts.push({
225
+ type: "interrupt",
226
+ interrupt: pendingInterrupt,
227
+ render: messages.slice(index + 1).findIndex((x) => x.role === "assistant") === -1 && interrupt ? () => interrupt.renderWithResume({
228
+ interrupt: pendingInterrupt,
229
+ resume: (result) => {
230
+ setResolveInterrupt({
231
+ id: pendingInterrupt.id,
232
+ reason: pendingInterrupt.reason,
233
+ payload: pendingInterrupt.payload,
234
+ resumePayload: result
235
+ });
236
+ }
237
+ }) : void 0
238
+ });
239
+ }
240
+ if (lastMessage === void 0) {
241
+ return [...acc, { role: "assistant", parts }];
242
+ }
243
+ if (lastMessage.role === "user") {
244
+ return [...acc, { role: "assistant", parts }];
245
+ } else {
246
+ return [
247
+ ...acc.slice(0, -1),
248
+ { ...lastMessage, parts: [...lastMessage.parts, ...parts] }
249
+ ];
250
+ }
251
+ } else {
252
+ return acc;
253
+ }
254
+ }
255
+ }, []);
256
+ const sendMessage = async (prop) => {
257
+ setStreaming(true);
258
+ setCurrentRoundUiToolCallIds([]);
259
+ if (typeof prop === "string") {
260
+ setMessages((oldMessages) => [
261
+ ...oldMessages,
262
+ { role: "user", content: prop }
263
+ ]);
264
+ setDeltaMessages((oldMessages) => [
265
+ ...oldMessages,
266
+ { role: "user", content: prop }
267
+ ]);
268
+ } else if (prop && "toolCallId" in prop) {
269
+ setMessages((old) => [
270
+ ...old,
271
+ { role: "tool", content: prop.content, toolCallId: prop.toolCallId }
272
+ ]);
273
+ setDeltaMessages((old) => [
274
+ ...old,
275
+ { role: "tool", content: prop.content, toolCallId: prop.toolCallId }
276
+ ]);
277
+ }
278
+ let sendMessageInput;
279
+ if (prop && typeof prop === "object" && "interruptId" in prop) {
280
+ sendMessageInput = {
281
+ resume: {
282
+ interruptId: prop.interruptId,
283
+ payload: JSON.stringify(prop.payload)
284
+ },
285
+ tools: clientTools?.map((tool) => ({
286
+ name: tool.name,
287
+ description: tool.description,
288
+ parameters: JSON.stringify(toJsonSchema(tool.parameters))
289
+ })),
290
+ conversationId: threadIdRef.current
291
+ };
292
+ } else {
293
+ const deltaMessages = getLatestDeltaMessages();
294
+ setDeltaMessages([]);
295
+ sendMessageInput = {
296
+ messages: deltaMessages,
297
+ tools: clientTools?.map((tool) => ({
298
+ name: tool.name,
299
+ description: tool.description,
300
+ parameters: JSON.stringify(toJsonSchema(tool.parameters))
301
+ })),
302
+ conversationId: threadIdRef.current
303
+ };
304
+ }
305
+ const requestInit = {
306
+ method: "POST",
307
+ headers: {
308
+ "Content-Type": "application/json",
309
+ Accept: "text/event-stream"
310
+ },
311
+ body: JSON.stringify(sendMessageInput)
312
+ };
313
+ try {
314
+ const res = await fetch(url, requestInit);
315
+ if (!res.ok) {
316
+ throw new Error(
317
+ JSON.stringify({
318
+ request: {
319
+ url,
320
+ ...requestInit
321
+ },
322
+ response: {
323
+ status: res.status,
324
+ statusText: res.statusText,
325
+ body: res.bodyUsed ? null : await res.text()
326
+ }
327
+ })
328
+ );
329
+ }
330
+ const eventSourceGenerator = bodyToSseAsyncGenerator(res.body);
331
+ for await (const event of eventSourceGenerator) {
332
+ if (event.data === "[DONE]") {
333
+ break;
334
+ }
335
+ const parsed = import_agent_shared.sendMessageEventSchema.safeParse(
336
+ safeJSONParse(event.data)
337
+ );
338
+ if (parsed.success !== true) {
339
+ continue;
340
+ }
341
+ const { data } = parsed;
342
+ if (data.type === "text") {
343
+ setMessages((oldMessages) => {
344
+ const lastMessage = oldMessages.at(-1);
345
+ if (lastMessage?.role === "assistant") {
346
+ return [
347
+ ...oldMessages.slice(0, -1),
348
+ {
349
+ ...lastMessage,
350
+ content: (lastMessage.content ?? "") + data.content
351
+ }
352
+ ];
353
+ } else {
354
+ const newMessage = {
355
+ role: "assistant",
356
+ content: data.content
357
+ };
358
+ return [...oldMessages, newMessage];
359
+ }
360
+ });
361
+ } else if (data.type === "tool-call-start") {
362
+ const toolCall = {
363
+ type: "function",
364
+ id: data.toolCallId,
365
+ function: {
366
+ arguments: "",
367
+ name: data.toolCallName
368
+ }
369
+ };
370
+ setMessages((old) => {
371
+ const lastMessage = old.at(-1);
372
+ if (lastMessage?.role === "assistant") {
373
+ return [
374
+ ...old.slice(0, -1),
375
+ {
376
+ ...lastMessage,
377
+ toolCalls: [...lastMessage?.toolCalls ?? [], toolCall]
378
+ }
379
+ ];
380
+ } else {
381
+ return [...old, { role: "assistant", toolCalls: [toolCall] }];
382
+ }
383
+ });
384
+ setUiToolCalls((old) => [
385
+ ...old,
386
+ {
387
+ id: data.toolCallId,
388
+ name: data.toolCallName,
389
+ arguments: "",
390
+ state: "input-streaming"
391
+ }
392
+ ]);
393
+ } else if (data.type === "tool-call-args") {
394
+ setMessages((old) => {
395
+ const lastMessage = old.at(-1);
396
+ if (lastMessage?.role !== "assistant") {
397
+ throw new Error(`Last message is not an assistant message.`);
398
+ }
399
+ const toolCalls = lastMessage.toolCalls;
400
+ const toolCallIndex = toolCalls.findIndex(
401
+ (x) => x.id === data.toolCallId
402
+ );
403
+ const nextToolCalls = [
404
+ ...toolCalls.slice(0, toolCallIndex),
405
+ {
406
+ ...toolCalls[toolCallIndex],
407
+ function: {
408
+ ...toolCalls[toolCallIndex].function,
409
+ arguments: toolCalls[toolCallIndex].function.arguments + data.delta
410
+ }
411
+ },
412
+ ...toolCalls.slice(toolCallIndex + 1)
413
+ ];
414
+ return [
415
+ ...old.slice(0, -1),
416
+ { ...lastMessage, toolCalls: nextToolCalls }
417
+ ];
418
+ });
419
+ setUiToolCalls((old) => {
420
+ const index = old.findIndex((x) => x.id === data.toolCallId);
421
+ return [
422
+ ...old.slice(0, index),
423
+ {
424
+ ...old[index],
425
+ arguments: old[index].arguments + data.delta,
426
+ state: "input-streaming"
427
+ },
428
+ ...old.slice(index + 1)
429
+ ];
430
+ });
431
+ } else if (data.type === "tool-call-end") {
432
+ setUiToolCalls((old) => {
433
+ const index = old.findIndex((x) => x.id === data.toolCallId);
434
+ return [
435
+ ...old.slice(0, index),
436
+ { ...old[index], state: "input-available" },
437
+ ...old.slice(index + 1)
438
+ ];
439
+ });
440
+ setCurrentRoundUiToolCallIds((old) => [...old, data.toolCallId]);
441
+ } else if (data.type === "tool-result") {
442
+ setCurrentRoundUiToolCallIds(
443
+ (old) => old.filter((x) => x !== data.toolCallId)
444
+ );
445
+ setMessages((old) => [
446
+ ...old,
447
+ { role: "tool", content: data.result, toolCallId: data.toolCallId }
448
+ ]);
449
+ setUiToolCalls((old) => {
450
+ const index = old.findIndex((x) => x.id === data.toolCallId);
451
+ return [
452
+ ...old.slice(0, index),
453
+ { ...old[index], result: data.result, state: "output-available" },
454
+ ...old.slice(index + 1)
455
+ ];
456
+ });
457
+ } else if (data.type === "interrupt") {
458
+ setPendingInterrupt({
459
+ id: data.id,
460
+ payload: data.payload,
461
+ reason: data.reason
462
+ });
463
+ }
464
+ }
465
+ setStreaming(false);
466
+ } catch (e) {
467
+ console.log(e);
468
+ setError(e);
469
+ setStreaming(false);
470
+ }
471
+ };
472
+ const runnableTools = clientTools?.filter(isClientToolWithHandler) || [];
473
+ const runnableToolCalls = uiToolCalls.filter(
474
+ (toolCall) => toolCall.state === "input-available" && runnableTools.some((tool) => tool.name === toolCall.name)
475
+ );
476
+ (0, import_react2.useEffect)(() => {
477
+ if (streaming) {
478
+ return;
479
+ }
480
+ runnableToolCalls.filter((toolCall) => !calledToolCalls.current.has(toolCall.id)).forEach((toolCall) => {
481
+ calledToolCalls.current.add(toolCall.id);
482
+ const tool = runnableTools.find((tool2) => tool2.name === toolCall.name);
483
+ async function runToolCall() {
484
+ return tool.handler(JSON.parse(toolCall.arguments));
485
+ }
486
+ Promise.resolve(runToolCall()).then(
487
+ (res) => res,
488
+ (err) => `Tool call failed with info: ${typeof err === "string" ? err : String(err)}`
489
+ ).then((res) => {
490
+ setUiToolCalls((old) => {
491
+ const index = old.findIndex((x) => x.id === toolCall.id);
492
+ return [
493
+ ...old.slice(0, index),
494
+ {
495
+ ...old[index],
496
+ result: typeof res === "string" ? res : JSON.stringify(res),
497
+ state: "output-available"
498
+ },
499
+ ...old.slice(index + 1)
500
+ ];
501
+ });
502
+ const toolResultMessage = {
503
+ role: "tool",
504
+ content: typeof res === "string" ? res : JSON.stringify(res),
505
+ toolCallId: toolCall.id
506
+ };
507
+ setMessages((old) => [...old, toolResultMessage]);
508
+ setDeltaMessages((old) => [...old, toolResultMessage]);
509
+ });
510
+ });
511
+ }, [runnableToolCalls, runnableTools, streaming]);
512
+ (0, import_react2.useEffect)(() => {
513
+ if (streaming) {
514
+ return;
515
+ }
516
+ if (currentRoundUiToolCallIds.length > 0 && currentRoundUiToolCallIds.every(
517
+ (id) => uiToolCalls.find((x) => x.id === id)?.state === "output-available"
518
+ )) {
519
+ sendMessage();
520
+ }
521
+ }, [streaming, currentRoundUiToolCallIds, uiToolCalls]);
522
+ (0, import_react2.useEffect)(() => {
523
+ if (!streaming && pendingInterrupt && resolveInterrupt && pendingInterrupt.id === resolveInterrupt.id) {
524
+ setPendingInterrupt(null);
525
+ setResolveInterrupt(null);
526
+ sendMessage({
527
+ interruptId: resolveInterrupt.id,
528
+ payload: resolveInterrupt.resumePayload
529
+ });
530
+ }
531
+ }, [pendingInterrupt, resolveInterrupt, streaming]);
532
+ return {
533
+ messages,
534
+ setMessages,
535
+ uiMessages,
536
+ uiToolCalls,
537
+ sendMessage,
538
+ loading,
539
+ streaming,
540
+ error
541
+ };
542
+ }
543
+ // Annotate the CommonJS export names for ESM import in node:
544
+ 0 && (module.exports = {
545
+ clientTool,
546
+ partialParse,
547
+ serverTool,
548
+ useChat
549
+ });
550
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/use-chat.tsx","../src/utils.ts","../src/tool.ts"],"sourcesContent":["export { useChat } from \"./use-chat\";\n\nexport { clientTool, serverTool } from \"./tool\";\n\nexport { partialParse } from \"./utils\";\n\nexport * from \"./type\";\n","import {\n sendMessageEventSchema,\n ClientMessage,\n SendMessageInput,\n isV4Schema,\n Schema,\n} from \"@cloudbase/agent-shared\";\nimport {\n safeJSONParse,\n bodyToSseAsyncGenerator,\n useRefState,\n partialParse,\n} from \"./utils\";\nimport {\n UIMessage,\n UIMessagePart,\n UIMessagePartToolCallWithRender,\n InterruptWithResume,\n Interrupt,\n ToolStreamingState,\n} from \"./type\";\nimport * as z4 from \"zod/v4/core\";\nimport { useEffect } from \"react\";\nimport {\n clientTool,\n isClientToolWithHandler,\n isClientToolWithRender,\n isClientToolWithRenderAndWaitForResponse,\n serverTool,\n} from \"./tool\";\nimport { useRef } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { zodToJsonSchema } from \"@ag-kit/zod-to-json-schema\";\n\nfunction toJsonSchema(schema: Schema) {\n return isV4Schema(schema) ? z4.toJSONSchema(schema) : zodToJsonSchema(schema);\n}\n\ninterface UseChatOptions {\n url?: string;\n clientTools?: ReadonlyArray<ReturnType<typeof clientTool>>;\n serverTools?: ReadonlyArray<ReturnType<typeof serverTool>>;\n threadId?: string;\n interrupt?: InterruptWithResume;\n fetch?: typeof fetch;\n}\n\nexport function useChat({\n clientTools,\n serverTools,\n url = \"/send-message\",\n threadId = uuidv4(),\n interrupt,\n fetch = globalThis.fetch,\n}: UseChatOptions) {\n const threadIdRef = useRef(threadId);\n const [messages, setMessages] = useRefState<Array<ClientMessage>>([]);\n const [_, setDeltaMessages, getLatestDeltaMessages] = useRefState<\n Array<ClientMessage>\n >([]);\n\n const [loading] = useRefState(false);\n const [streaming, setStreaming] = useRefState(false);\n\n const [pendingInterrupt, setPendingInterrupt] = useRefState<Interrupt | null>(\n null\n );\n const [resolveInterrupt, setResolveInterrupt] = useRefState<\n (Interrupt & { resumePayload: unknown }) | null\n >(null);\n\n const [uiToolCalls, setUiToolCalls] = useRefState<\n Array<{\n id: string;\n name: string;\n arguments: string;\n result?: string;\n state: ToolStreamingState;\n errorText?: string;\n }>\n >([]);\n\n const [currentRoundUiToolCallIds, setCurrentRoundUiToolCallIds] = useRefState<\n Array<string>\n >([]);\n\n const calledToolCalls = useRef(new Set<string>());\n const [error, setError] = useRefState<null | unknown>(null);\n\n const uiMessages = messages.reduce<Array<UIMessage>>((acc, cur, index) => {\n if (cur.role === \"user\") {\n return [\n ...acc,\n {\n role: \"user\" as const,\n parts: [{ type: \"text\", text: cur.content }],\n },\n ];\n } else if (cur.role === \"system\") {\n return acc;\n } else {\n const lastMessage = acc.at(-1);\n if (cur.role === \"assistant\") {\n let parts: Array<UIMessagePart> = [];\n if (cur.content?.trim()) {\n parts.push({ type: \"text\", text: cur.content });\n }\n if (Array.isArray(cur.toolCalls) && cur.toolCalls.length > 0) {\n parts = [\n ...parts,\n ...cur.toolCalls.map<UIMessagePartToolCallWithRender>(\n (toolCall) => {\n const uiToolCall = uiToolCalls.find(\n (x) => x.id === toolCall.id\n )!;\n\n const clientTool = clientTools?.find(\n (tool) => tool.name === uiToolCall.name\n );\n\n const serverTool = serverTools?.find(\n (tool) => tool.name === uiToolCall.name\n );\n\n if (clientTool) {\n if (isClientToolWithRender(clientTool)) {\n return {\n ...uiToolCall,\n type: \"tool-call\",\n render: () =>\n clientTool.render({\n input: partialParse(uiToolCall.arguments),\n part: { ...uiToolCall, type: \"tool-call\" },\n }),\n };\n }\n if (isClientToolWithRenderAndWaitForResponse(clientTool)) {\n return {\n ...uiToolCall,\n type: \"tool-call\",\n render: () =>\n clientTool.renderAndWaitForResponse({\n part: { ...uiToolCall, type: \"tool-call\" },\n submitToolResult:\n uiToolCall.state === \"input-available\"\n ? (output) => {\n setUiToolCalls((oldToolCalls) => {\n const toolCallIndex =\n oldToolCalls.findIndex(\n (x) => x.id === uiToolCall.id\n );\n return [\n ...oldToolCalls.slice(0, toolCallIndex),\n {\n ...oldToolCalls[toolCallIndex],\n result: output,\n state: \"output-available\",\n },\n ...oldToolCalls.slice(toolCallIndex + 1),\n ];\n });\n }\n : undefined,\n }),\n };\n }\n }\n\n if (serverTool) {\n return {\n ...uiToolCall,\n type: \"tool-call\",\n render: () =>\n serverTool.render({\n input: partialParse(uiToolCall.arguments),\n part: { ...uiToolCall, type: \"tool-call\" },\n }),\n };\n }\n\n return { ...uiToolCall, type: \"tool-call\" };\n }\n ),\n ];\n }\n\n if (pendingInterrupt && !resolveInterrupt) {\n parts.push({\n type: \"interrupt\",\n interrupt: pendingInterrupt,\n render:\n messages\n .slice(index + 1)\n .findIndex((x) => x.role === \"assistant\") === -1 && interrupt\n ? () =>\n interrupt.renderWithResume({\n interrupt: pendingInterrupt,\n resume: (result) => {\n setResolveInterrupt({\n id: pendingInterrupt.id,\n reason: pendingInterrupt.reason,\n payload: pendingInterrupt.payload,\n resumePayload: result,\n });\n },\n })\n : undefined,\n });\n }\n\n if (lastMessage === undefined) {\n return [...acc, { role: \"assistant\", parts }];\n }\n if (lastMessage.role === \"user\") {\n return [...acc, { role: \"assistant\", parts }];\n } else {\n return [\n ...acc.slice(0, -1),\n { ...lastMessage, parts: [...lastMessage.parts, ...parts] },\n ];\n }\n } else {\n return acc;\n }\n }\n }, []);\n\n const sendMessage = async (\n prop?:\n | string\n | { toolCallId: string; content: string }\n | {\n interruptId: string;\n payload: unknown;\n }\n ) => {\n setStreaming(true);\n setCurrentRoundUiToolCallIds([]);\n\n if (typeof prop === \"string\") {\n setMessages((oldMessages) => [\n ...oldMessages,\n { role: \"user\", content: prop },\n ]);\n setDeltaMessages((oldMessages) => [\n ...oldMessages,\n { role: \"user\", content: prop },\n ]);\n } else if (prop && \"toolCallId\" in prop) {\n setMessages((old) => [\n ...old,\n { role: \"tool\", content: prop.content, toolCallId: prop.toolCallId },\n ]);\n setDeltaMessages((old) => [\n ...old,\n { role: \"tool\", content: prop.content, toolCallId: prop.toolCallId },\n ]);\n }\n\n let sendMessageInput: SendMessageInput;\n\n if (prop && typeof prop === \"object\" && \"interruptId\" in prop) {\n sendMessageInput = {\n resume: {\n interruptId: prop.interruptId,\n payload: JSON.stringify(prop.payload),\n },\n tools: clientTools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: JSON.stringify(toJsonSchema(tool.parameters)),\n })),\n conversationId: threadIdRef.current,\n };\n } else {\n const deltaMessages = getLatestDeltaMessages();\n setDeltaMessages([]);\n\n sendMessageInput = {\n messages: deltaMessages,\n tools: clientTools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: JSON.stringify(toJsonSchema(tool.parameters)),\n })),\n conversationId: threadIdRef.current,\n };\n }\n\n const requestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n },\n body: JSON.stringify(sendMessageInput),\n };\n\n try {\n const res = await fetch(url, requestInit);\n\n if (!res.ok) {\n throw new Error(\n JSON.stringify({\n request: {\n url,\n ...requestInit,\n },\n response: {\n status: res.status,\n statusText: res.statusText,\n body: res.bodyUsed ? null : await res.text(),\n },\n })\n );\n }\n\n const eventSourceGenerator = bodyToSseAsyncGenerator(res.body!);\n\n for await (const event of eventSourceGenerator) {\n if (event.data === \"[DONE]\") {\n break;\n }\n\n const parsed = sendMessageEventSchema.safeParse(\n safeJSONParse(event.data)\n );\n\n if (parsed.success !== true) {\n continue;\n }\n\n const { data } = parsed;\n\n if (data.type === \"text\") {\n setMessages((oldMessages) => {\n const lastMessage = oldMessages.at(-1);\n if (lastMessage?.role === \"assistant\") {\n return [\n ...oldMessages.slice(0, -1),\n {\n ...lastMessage,\n content: (lastMessage.content ?? \"\") + data.content,\n },\n ];\n } else {\n const newMessage: ClientMessage = {\n role: \"assistant\",\n content: data.content,\n };\n return [...oldMessages, newMessage];\n }\n });\n } else if (data.type === \"tool-call-start\") {\n const toolCall = {\n type: \"function\" as const,\n id: data.toolCallId,\n function: {\n arguments: \"\",\n name: data.toolCallName,\n },\n };\n setMessages((old) => {\n const lastMessage = old.at(-1);\n if (lastMessage?.role === \"assistant\") {\n return [\n ...old.slice(0, -1),\n {\n ...lastMessage,\n toolCalls: [...(lastMessage?.toolCalls ?? []), toolCall],\n },\n ];\n } else {\n return [...old, { role: \"assistant\", toolCalls: [toolCall] }];\n }\n });\n setUiToolCalls((old) => [\n ...old,\n {\n id: data.toolCallId,\n name: data.toolCallName,\n arguments: \"\",\n state: \"input-streaming\",\n },\n ]);\n } else if (data.type === \"tool-call-args\") {\n setMessages((old) => {\n const lastMessage = old.at(-1);\n if (lastMessage?.role !== \"assistant\") {\n throw new Error(`Last message is not an assistant message.`);\n }\n\n const toolCalls = lastMessage.toolCalls!;\n const toolCallIndex = toolCalls.findIndex(\n (x) => x.id === data.toolCallId\n );\n const nextToolCalls: typeof toolCalls = [\n ...toolCalls.slice(0, toolCallIndex),\n {\n ...toolCalls[toolCallIndex],\n function: {\n ...toolCalls[toolCallIndex].function,\n arguments:\n toolCalls[toolCallIndex].function.arguments + data.delta,\n },\n },\n ...toolCalls.slice(toolCallIndex + 1),\n ];\n\n return [\n ...old.slice(0, -1),\n { ...lastMessage, toolCalls: nextToolCalls },\n ];\n });\n\n setUiToolCalls((old) => {\n const index = old.findIndex((x) => x.id === data.toolCallId)!;\n return [\n ...old.slice(0, index),\n {\n ...old[index],\n arguments: old[index].arguments + data.delta,\n state: \"input-streaming\",\n },\n ...old.slice(index + 1),\n ];\n });\n } else if (data.type === \"tool-call-end\") {\n setUiToolCalls((old) => {\n const index = old.findIndex((x) => x.id === data.toolCallId)!;\n return [\n ...old.slice(0, index),\n { ...old[index], state: \"input-available\" },\n ...old.slice(index + 1),\n ];\n });\n setCurrentRoundUiToolCallIds((old) => [...old, data.toolCallId]);\n } else if (data.type === \"tool-result\") {\n setCurrentRoundUiToolCallIds((old) =>\n old.filter((x) => x !== data.toolCallId)\n );\n setMessages((old) => [\n ...old,\n { role: \"tool\", content: data.result, toolCallId: data.toolCallId },\n ]);\n setUiToolCalls((old) => {\n const index = old.findIndex((x) => x.id === data.toolCallId)!;\n return [\n ...old.slice(0, index),\n { ...old[index], result: data.result, state: \"output-available\" },\n ...old.slice(index + 1),\n ];\n });\n } else if (data.type === \"interrupt\") {\n setPendingInterrupt({\n id: data.id,\n payload: data.payload,\n reason: data.reason,\n });\n }\n }\n\n setStreaming(false);\n } catch (e) {\n console.log(e);\n setError(e);\n setStreaming(false);\n }\n };\n\n const runnableTools = clientTools?.filter(isClientToolWithHandler) || [];\n\n const runnableToolCalls = uiToolCalls.filter(\n (toolCall) =>\n toolCall.state === \"input-available\" &&\n runnableTools.some((tool) => tool.name === toolCall.name)\n );\n\n useEffect(() => {\n if (streaming) {\n return;\n }\n\n runnableToolCalls\n .filter((toolCall) => !calledToolCalls.current.has(toolCall.id))\n .forEach((toolCall) => {\n calledToolCalls.current.add(toolCall.id);\n const tool = runnableTools.find((tool) => tool.name === toolCall.name)!;\n async function runToolCall() {\n return tool.handler(JSON.parse(toolCall.arguments));\n }\n Promise.resolve(runToolCall())\n .then(\n (res) => res,\n (err) =>\n `Tool call failed with info: ${typeof err === \"string\" ? err : String(err)}`\n )\n .then((res) => {\n setUiToolCalls((old) => {\n const index = old.findIndex((x) => x.id === toolCall.id)!;\n return [\n ...old.slice(0, index),\n {\n ...old[index],\n result: typeof res === \"string\" ? res : JSON.stringify(res),\n state: \"output-available\",\n },\n ...old.slice(index + 1),\n ];\n });\n\n const toolResultMessage: ClientMessage = {\n role: \"tool\",\n content: typeof res === \"string\" ? res : JSON.stringify(res),\n toolCallId: toolCall.id,\n };\n\n setMessages((old) => [...old, toolResultMessage]);\n setDeltaMessages((old) => [...old, toolResultMessage]);\n });\n });\n }, [runnableToolCalls, runnableTools, streaming]);\n\n useEffect(() => {\n if (streaming) {\n return;\n }\n\n if (\n currentRoundUiToolCallIds.length > 0 &&\n currentRoundUiToolCallIds.every(\n (id) =>\n uiToolCalls.find((x) => x.id === id)?.state === \"output-available\"\n )\n ) {\n sendMessage();\n }\n }, [streaming, currentRoundUiToolCallIds, uiToolCalls]);\n\n useEffect(() => {\n if (\n !streaming &&\n pendingInterrupt &&\n resolveInterrupt &&\n pendingInterrupt.id === resolveInterrupt.id\n ) {\n setPendingInterrupt(null);\n setResolveInterrupt(null);\n sendMessage({\n interruptId: resolveInterrupt.id,\n payload: resolveInterrupt.resumePayload,\n });\n }\n }, [pendingInterrupt, resolveInterrupt, streaming]);\n\n return {\n messages,\n setMessages,\n uiMessages,\n uiToolCalls,\n sendMessage,\n loading,\n streaming,\n error,\n };\n}\n","import { useRef, useState } from \"react\";\nimport { EventSourceParserStream } from \"eventsource-parser/stream\";\nimport { jsonrepair } from \"jsonrepair\";\n\nexport function partialParse<T>(input: string) {\n try {\n return JSON.parse(input) as T;\n } catch (_) {\n try {\n return JSON.parse(jsonrepair(input)) as T;\n } catch (e) {\n console.error(\"Failed to repair JSON\", e);\n return {} as T;\n }\n }\n}\n\nexport function bodyToSseAsyncGenerator(\n body: NonNullable<Awaited<ReturnType<typeof fetch>>[\"body\"]>\n) {\n const eventSourceStream = body\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream());\n\n return readableStreamToAsyncGenerator(eventSourceStream);\n}\n\nexport async function* readableStreamToAsyncGenerator<T>(\n stream: ReadableStream<T>\n) {\n const reader = stream.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n}\n\nexport function safeJSONParse(json: string) {\n try {\n return JSON.parse(json);\n } catch (_) {\n return null;\n }\n}\n\nexport function useRefState<T>(initialValue: T) {\n const ref = useRef<T>(initialValue);\n const [state, setState] = useState<T>(initialValue);\n\n const setStateAndRef = (value: T | ((prev: T) => T)) => {\n const next =\n typeof value === \"function\"\n ? (value as (prev: T) => T)(ref.current)\n : value;\n\n ref.current = next;\n\n setState(next);\n };\n\n const getLatest = () => ref.current;\n\n return [state, setStateAndRef, getLatest] as const;\n}\n","import {\n ClientTool,\n ClientToolBase,\n ClientToolWithHandler,\n ClientToolWithInputSchema,\n ClientToolWithRender,\n ClientToolWithRenderAndWaitForResponse,\n ServerTool,\n} from \"./type\";\nimport type { Schema } from \"@cloudbase/agent-shared\";\n\nexport function clientTool<TSchema extends Schema>(\n tool: ClientToolBase<TSchema>\n): ClientToolWithInputSchema<TSchema>;\nexport function clientTool<TSchema extends Schema>(\n tool: ClientToolWithHandler<TSchema>\n): ClientToolWithInputSchema<TSchema>;\nexport function clientTool<TSchema extends Schema>(\n tool: ClientToolWithRender<TSchema>\n): ClientToolWithInputSchema<TSchema>;\nexport function clientTool<TSchema extends Schema>(\n tool: ClientToolWithRenderAndWaitForResponse<TSchema>\n): ClientToolWithInputSchema<TSchema>;\nexport function clientTool<TSchema extends Schema>(tool: ClientTool<TSchema>) {\n return tool;\n}\n\nexport function isClientToolWithHandler<TSchema extends Schema>(\n tool: ClientToolWithInputSchema<TSchema>\n): tool is ClientToolWithHandler<TSchema> {\n return \"handler\" in tool;\n}\n\nexport function isClientToolWithRender<TSchema extends Schema>(\n tool: ClientToolWithInputSchema<TSchema>\n): tool is ClientToolWithRender<TSchema> {\n return \"render\" in tool;\n}\n\nexport function isClientToolWithRenderAndWaitForResponse<\n TSchema extends Schema,\n>(\n tool: ClientToolWithInputSchema<TSchema>\n): tool is ClientToolWithRenderAndWaitForResponse<TSchema> {\n return \"renderAndWaitForResponse\" in tool;\n}\n\nexport function serverTool<TSchema extends Schema>(\n tool: ServerTool<TSchema>\n): ServerTool<TSchema> {\n return tool;\n}\n"],"mappings":"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","names":["import_react","import_react","uuidv4","clientTool","serverTool","tool"]}