agents 0.0.0-5ebaeb2 → 0.0.0-629836

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +103 -5
  2. package/dist/_esm-LV5FJ3HK.js +3922 -0
  3. package/dist/_esm-LV5FJ3HK.js.map +1 -0
  4. package/dist/ai-chat-agent.d.ts +3 -1
  5. package/dist/ai-chat-agent.js +375 -58
  6. package/dist/ai-chat-agent.js.map +1 -1
  7. package/dist/ai-chat-v5-migration.js +1 -0
  8. package/dist/ai-react.d.ts +8 -1
  9. package/dist/ai-react.js +151 -111
  10. package/dist/ai-react.js.map +1 -1
  11. package/dist/ai-types.d.ts +1 -0
  12. package/dist/ai-types.js +2 -1
  13. package/dist/ccip-CMBYN64O.js +15 -0
  14. package/dist/ccip-CMBYN64O.js.map +1 -0
  15. package/dist/chunk-5Y6BEZDY.js +276 -0
  16. package/dist/chunk-5Y6BEZDY.js.map +1 -0
  17. package/dist/{chunk-AVYJQSLW.js → chunk-BER7KXUJ.js} +2 -1
  18. package/dist/chunk-BER7KXUJ.js.map +1 -0
  19. package/dist/{chunk-LL2AFX7V.js → chunk-C2OEBJZ2.js} +10 -6
  20. package/dist/chunk-C2OEBJZ2.js.map +1 -0
  21. package/dist/chunk-JJBFIGUC.js +5202 -0
  22. package/dist/chunk-JJBFIGUC.js.map +1 -0
  23. package/dist/chunk-PR4QN5HX.js +43 -0
  24. package/dist/chunk-PR4QN5HX.js.map +1 -0
  25. package/dist/chunk-TYAY6AU6.js +159 -0
  26. package/dist/chunk-TYAY6AU6.js.map +1 -0
  27. package/dist/{chunk-IJPBZOSS.js → chunk-XGMKNUJA.js} +97 -50
  28. package/dist/chunk-XGMKNUJA.js.map +1 -0
  29. package/dist/{chunk-VYENMKFS.js → chunk-ZMMHNOMZ.js} +400 -70
  30. package/dist/chunk-ZMMHNOMZ.js.map +1 -0
  31. package/dist/{client-CcIORE73.d.ts → client-C8tswVoM.d.ts} +891 -250
  32. package/dist/client.js +2 -1
  33. package/dist/codemode/ai.d.ts +25 -0
  34. package/dist/codemode/ai.js +5200 -0
  35. package/dist/codemode/ai.js.map +1 -0
  36. package/dist/index.d.ts +25 -32
  37. package/dist/index.js +5 -4
  38. package/dist/mcp/client.d.ts +2 -1
  39. package/dist/mcp/client.js +2 -1
  40. package/dist/mcp/do-oauth-client-provider.js +2 -1
  41. package/dist/mcp/index.d.ts +16 -34
  42. package/dist/mcp/index.js +253 -183
  43. package/dist/mcp/index.js.map +1 -1
  44. package/dist/mcp/x402.d.ts +39 -0
  45. package/dist/mcp/x402.js +3195 -0
  46. package/dist/mcp/x402.js.map +1 -0
  47. package/dist/mcp-BH1fJeiU.d.ts +58 -0
  48. package/dist/observability/index.d.ts +12 -24
  49. package/dist/observability/index.js +5 -4
  50. package/dist/react.d.ts +10 -6
  51. package/dist/react.js +101 -3
  52. package/dist/react.js.map +1 -1
  53. package/dist/schedule.js +2 -0
  54. package/dist/schedule.js.map +1 -1
  55. package/dist/secp256k1-M22GZP2U.js +2193 -0
  56. package/dist/secp256k1-M22GZP2U.js.map +1 -0
  57. package/package.json +27 -10
  58. package/src/index.ts +141 -57
  59. package/dist/chunk-AVYJQSLW.js.map +0 -1
  60. package/dist/chunk-IJPBZOSS.js.map +0 -1
  61. package/dist/chunk-LL2AFX7V.js.map +0 -1
  62. package/dist/chunk-VYENMKFS.js.map +0 -1
@@ -3,13 +3,19 @@ import {
3
3
  } from "./chunk-UJVEAURM.js";
4
4
  import {
5
5
  Agent
6
- } from "./chunk-IJPBZOSS.js";
7
- import "./chunk-VYENMKFS.js";
8
- import "./chunk-LL2AFX7V.js";
6
+ } from "./chunk-XGMKNUJA.js";
7
+ import "./chunk-ZMMHNOMZ.js";
8
+ import "./chunk-C2OEBJZ2.js";
9
9
  import "./chunk-QEVM4BVL.js";
10
- import "./chunk-AVYJQSLW.js";
10
+ import "./chunk-BER7KXUJ.js";
11
+ import "./chunk-PR4QN5HX.js";
11
12
 
12
13
  // src/ai-chat-agent.ts
14
+ import {
15
+ getToolName,
16
+ isToolUIPart,
17
+ parsePartialJson
18
+ } from "ai";
13
19
  var decoder = new TextDecoder();
14
20
  var AIChatAgent = class extends Agent {
15
21
  constructor(ctx, env) {
@@ -19,15 +25,24 @@ var AIChatAgent = class extends Agent {
19
25
  message text not null,
20
26
  created_at datetime default current_timestamp
21
27
  )`;
22
- const rawMessages = (this.sql`select * from cf_ai_chat_agent_messages` || []).map((row) => {
23
- return JSON.parse(row.message);
24
- });
28
+ const rawMessages = this._loadMessagesFromDb();
25
29
  this.messages = autoTransformMessages(rawMessages);
26
30
  this._chatMessageAbortControllers = /* @__PURE__ */ new Map();
27
31
  }
28
32
  _broadcastChatMessage(message, exclude) {
29
33
  this.broadcast(JSON.stringify(message), exclude);
30
34
  }
35
+ _loadMessagesFromDb() {
36
+ const rows = this.sql`select * from cf_ai_chat_agent_messages order by created_at` || [];
37
+ return rows.map((row) => {
38
+ try {
39
+ return JSON.parse(row.message);
40
+ } catch (error) {
41
+ console.error(`Failed to parse message ${row.id}:`, error);
42
+ return null;
43
+ }
44
+ }).filter((msg) => msg !== null);
45
+ }
31
46
  async onMessage(connection, message) {
32
47
  if (typeof message === "string") {
33
48
  let data;
@@ -127,9 +142,7 @@ var AIChatAgent = class extends Agent {
127
142
  return this._tryCatchChat(() => {
128
143
  const url = new URL(request.url);
129
144
  if (url.pathname.endsWith("/get-messages")) {
130
- const messages = (this.sql`select * from cf_ai_chat_agent_messages` || []).map((row) => {
131
- return JSON.parse(row.message);
132
- });
145
+ const messages = this._loadMessagesFromDb();
133
146
  return Response.json(messages);
134
147
  }
135
148
  return super.onRequest(request);
@@ -159,13 +172,22 @@ var AIChatAgent = class extends Agent {
159
172
  */
160
173
  async saveMessages(messages) {
161
174
  await this.persistMessages(messages);
175
+ await this._tryCatchChat(async () => {
176
+ const response = await this.onChatMessage(() => {
177
+ });
178
+ if (response) this._reply(crypto.randomUUID(), response);
179
+ });
162
180
  }
163
181
  async persistMessages(messages, excludeBroadcastIds = []) {
164
- this.sql`delete from cf_ai_chat_agent_messages`;
165
182
  for (const message of messages) {
166
- this.sql`insert into cf_ai_chat_agent_messages (id, message) values (${message.id},${JSON.stringify(message)})`;
183
+ this.sql`
184
+ insert into cf_ai_chat_agent_messages (id, message)
185
+ values (${message.id}, ${JSON.stringify(message)})
186
+ on conflict(id) do update set message = excluded.message
187
+ `;
167
188
  }
168
- this.messages = messages;
189
+ const persisted = this._loadMessagesFromDb();
190
+ this.messages = autoTransformMessages(persisted);
169
191
  this._broadcastChatMessage(
170
192
  {
171
193
  messages,
@@ -186,8 +208,84 @@ var AIChatAgent = class extends Agent {
186
208
  return;
187
209
  }
188
210
  const reader = response.body.getReader();
189
- let fullResponseText = "";
190
- const toolCalls = /* @__PURE__ */ new Map();
211
+ const message = {
212
+ id: `assistant_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,
213
+ // default
214
+ role: "assistant",
215
+ parts: []
216
+ };
217
+ let activeTextParts = {};
218
+ let activeReasoningParts = {};
219
+ const partialToolCalls = {};
220
+ function updateDynamicToolPart(options) {
221
+ const part = message.parts.find(
222
+ (part2) => part2.type === "dynamic-tool" && part2.toolCallId === options.toolCallId
223
+ );
224
+ const anyOptions = options;
225
+ const anyPart = part;
226
+ if (part != null) {
227
+ part.state = options.state;
228
+ anyPart.toolName = options.toolName;
229
+ anyPart.input = anyOptions.input;
230
+ anyPart.output = anyOptions.output;
231
+ anyPart.errorText = anyOptions.errorText;
232
+ anyPart.rawInput = anyOptions.rawInput ?? anyPart.rawInput;
233
+ anyPart.preliminary = anyOptions.preliminary;
234
+ if (anyOptions.providerMetadata != null && part.state === "input-available") {
235
+ part.callProviderMetadata = anyOptions.providerMetadata;
236
+ }
237
+ } else {
238
+ message.parts.push({
239
+ type: "dynamic-tool",
240
+ toolName: options.toolName,
241
+ toolCallId: options.toolCallId,
242
+ state: options.state,
243
+ input: anyOptions.input,
244
+ output: anyOptions.output,
245
+ errorText: anyOptions.errorText,
246
+ preliminary: anyOptions.preliminary,
247
+ ...anyOptions.providerMetadata != null ? { callProviderMetadata: anyOptions.providerMetadata } : {}
248
+ });
249
+ }
250
+ }
251
+ function updateToolPart(options) {
252
+ const part = message.parts.find(
253
+ (part2) => isToolUIPart(part2) && part2.toolCallId === options.toolCallId
254
+ );
255
+ const anyOptions = options;
256
+ const anyPart = part;
257
+ if (part != null) {
258
+ part.state = options.state;
259
+ anyPart.input = anyOptions.input;
260
+ anyPart.output = anyOptions.output;
261
+ anyPart.errorText = anyOptions.errorText;
262
+ anyPart.rawInput = anyOptions.rawInput;
263
+ anyPart.preliminary = anyOptions.preliminary;
264
+ anyPart.providerExecuted = anyOptions.providerExecuted ?? part.providerExecuted;
265
+ if (anyOptions.providerMetadata != null && part.state === "input-available") {
266
+ part.callProviderMetadata = anyOptions.providerMetadata;
267
+ }
268
+ } else {
269
+ message.parts.push({
270
+ type: `tool-${options.toolName}`,
271
+ toolCallId: options.toolCallId,
272
+ state: options.state,
273
+ input: anyOptions.input,
274
+ output: anyOptions.output,
275
+ rawInput: anyOptions.rawInput,
276
+ errorText: anyOptions.errorText,
277
+ providerExecuted: anyOptions.providerExecuted,
278
+ preliminary: anyOptions.preliminary,
279
+ ...anyOptions.providerMetadata != null ? { callProviderMetadata: anyOptions.providerMetadata } : {}
280
+ });
281
+ }
282
+ }
283
+ async function updateMessageMetadata(metadata) {
284
+ if (metadata != null) {
285
+ const mergedMetadata = message.metadata != null ? { ...message.metadata, ...metadata } : metadata;
286
+ message.metadata = mergedMetadata;
287
+ }
288
+ }
191
289
  try {
192
290
  while (true) {
193
291
  const { done, value } = await reader.read();
@@ -210,33 +308,270 @@ var AIChatAgent = class extends Agent {
210
308
  try {
211
309
  const data = JSON.parse(line.slice(6));
212
310
  switch (data.type) {
213
- // SSE event signaling the tool input is ready. We track by
214
- // `toolCallId` so we can persist it as a tool part in the message.
215
- case "tool-input-available": {
216
- const { toolCallId, toolName, input } = data;
217
- toolCalls.set(toolCallId, {
218
- toolCallId,
219
- toolName,
220
- input,
221
- type: toolName ? `tool-${toolName}` : "dynamic-tool",
222
- state: "input-available"
311
+ case "text-start": {
312
+ const textPart = {
313
+ type: "text",
314
+ text: "",
315
+ providerMetadata: data.providerMetadata,
316
+ state: "streaming"
317
+ };
318
+ activeTextParts[data.id] = textPart;
319
+ message.parts.push(textPart);
320
+ break;
321
+ }
322
+ case "text-delta": {
323
+ const textPart = activeTextParts[data.id];
324
+ textPart.text += data.delta;
325
+ textPart.providerMetadata = data.providerMetadata ?? textPart.providerMetadata;
326
+ break;
327
+ }
328
+ case "text-end": {
329
+ const textPart = activeTextParts[data.id];
330
+ textPart.state = "done";
331
+ textPart.providerMetadata = data.providerMetadata ?? textPart.providerMetadata;
332
+ delete activeTextParts[data.id];
333
+ break;
334
+ }
335
+ case "reasoning-start": {
336
+ const reasoningPart = {
337
+ type: "reasoning",
338
+ text: "",
339
+ providerMetadata: data.providerMetadata,
340
+ state: "streaming"
341
+ };
342
+ activeReasoningParts[data.id] = reasoningPart;
343
+ message.parts.push(reasoningPart);
344
+ break;
345
+ }
346
+ case "reasoning-delta": {
347
+ const reasoningPart = activeReasoningParts[data.id];
348
+ reasoningPart.text += data.delta;
349
+ reasoningPart.providerMetadata = data.providerMetadata ?? reasoningPart.providerMetadata;
350
+ break;
351
+ }
352
+ case "reasoning-end": {
353
+ const reasoningPart = activeReasoningParts[data.id];
354
+ reasoningPart.providerMetadata = data.providerMetadata ?? reasoningPart.providerMetadata;
355
+ reasoningPart.state = "done";
356
+ delete activeReasoningParts[data.id];
357
+ break;
358
+ }
359
+ case "file": {
360
+ message.parts.push({
361
+ type: "file",
362
+ mediaType: data.mediaType,
363
+ url: data.url
364
+ });
365
+ break;
366
+ }
367
+ case "source-url": {
368
+ message.parts.push({
369
+ type: "source-url",
370
+ sourceId: data.sourceId,
371
+ url: data.url,
372
+ title: data.title,
373
+ providerMetadata: data.providerMetadata
374
+ });
375
+ break;
376
+ }
377
+ case "source-document": {
378
+ message.parts.push({
379
+ type: "source-document",
380
+ sourceId: data.sourceId,
381
+ mediaType: data.mediaType,
382
+ title: data.title,
383
+ filename: data.filename,
384
+ providerMetadata: data.providerMetadata
223
385
  });
224
386
  break;
225
387
  }
226
- // SSE event signaling the tool output is ready. We should've
227
- // already received the input in a previous event so an entry
228
- // with `toolCallId` should already be present
388
+ case "tool-input-start": {
389
+ const toolInvocations = message.parts.filter(isToolUIPart);
390
+ partialToolCalls[data.toolCallId] = {
391
+ text: "",
392
+ toolName: data.toolName,
393
+ index: toolInvocations.length,
394
+ dynamic: data.dynamic
395
+ };
396
+ if (data.dynamic) {
397
+ updateDynamicToolPart({
398
+ toolCallId: data.toolCallId,
399
+ toolName: data.toolName,
400
+ state: "input-streaming",
401
+ input: void 0
402
+ });
403
+ } else {
404
+ updateToolPart({
405
+ toolCallId: data.toolCallId,
406
+ toolName: data.toolName,
407
+ state: "input-streaming",
408
+ input: void 0
409
+ });
410
+ }
411
+ break;
412
+ }
413
+ case "tool-input-delta": {
414
+ const partialToolCall = partialToolCalls[data.toolCallId];
415
+ partialToolCall.text += data.inputTextDelta;
416
+ const { value: partialArgs } = await parsePartialJson(
417
+ partialToolCall.text
418
+ );
419
+ if (partialToolCall.dynamic) {
420
+ updateDynamicToolPart({
421
+ toolCallId: data.toolCallId,
422
+ toolName: partialToolCall.toolName,
423
+ state: "input-streaming",
424
+ input: partialArgs
425
+ });
426
+ } else {
427
+ updateToolPart({
428
+ toolCallId: data.toolCallId,
429
+ toolName: partialToolCall.toolName,
430
+ state: "input-streaming",
431
+ input: partialArgs
432
+ });
433
+ }
434
+ break;
435
+ }
436
+ case "tool-input-available": {
437
+ if (data.dynamic) {
438
+ updateDynamicToolPart({
439
+ toolCallId: data.toolCallId,
440
+ toolName: data.toolName,
441
+ state: "input-available",
442
+ input: data.input,
443
+ providerMetadata: data.providerMetadata
444
+ });
445
+ } else {
446
+ updateToolPart({
447
+ toolCallId: data.toolCallId,
448
+ toolName: data.toolName,
449
+ state: "input-available",
450
+ input: data.input,
451
+ providerExecuted: data.providerExecuted,
452
+ providerMetadata: data.providerMetadata
453
+ });
454
+ }
455
+ break;
456
+ }
457
+ case "tool-input-error": {
458
+ if (data.dynamic) {
459
+ updateDynamicToolPart({
460
+ toolCallId: data.toolCallId,
461
+ toolName: data.toolName,
462
+ state: "output-error",
463
+ input: data.input,
464
+ errorText: data.errorText,
465
+ providerMetadata: data.providerMetadata
466
+ });
467
+ } else {
468
+ updateToolPart({
469
+ toolCallId: data.toolCallId,
470
+ toolName: data.toolName,
471
+ state: "output-error",
472
+ input: void 0,
473
+ rawInput: data.input,
474
+ errorText: data.errorText,
475
+ providerExecuted: data.providerExecuted,
476
+ providerMetadata: data.providerMetadata
477
+ });
478
+ }
479
+ break;
480
+ }
229
481
  case "tool-output-available": {
230
- const { toolCallId, output, isError, errorText } = data;
231
- const toolPart = toolCalls.get(toolCallId);
232
- if (toolPart)
233
- toolCalls.set(toolCallId, {
234
- ...toolPart,
235
- output,
236
- isError,
237
- errorText,
238
- state: "output-available"
482
+ if (data.dynamic) {
483
+ const toolInvocations = message.parts.filter(
484
+ (part) => part.type === "dynamic-tool"
485
+ );
486
+ const toolInvocation = toolInvocations.find(
487
+ (invocation) => invocation.toolCallId === data.toolCallId
488
+ );
489
+ if (!toolInvocation)
490
+ throw new Error("Tool invocation not found");
491
+ updateDynamicToolPart({
492
+ toolCallId: data.toolCallId,
493
+ toolName: toolInvocation.toolName,
494
+ state: "output-available",
495
+ input: toolInvocation.input,
496
+ output: data.output,
497
+ preliminary: data.preliminary
498
+ });
499
+ } else {
500
+ const toolInvocations = message.parts.filter(isToolUIPart);
501
+ const toolInvocation = toolInvocations.find(
502
+ (invocation) => invocation.toolCallId === data.toolCallId
503
+ );
504
+ if (!toolInvocation)
505
+ throw new Error("Tool invocation not found");
506
+ updateToolPart({
507
+ toolCallId: data.toolCallId,
508
+ toolName: getToolName(toolInvocation),
509
+ state: "output-available",
510
+ input: toolInvocation.input,
511
+ output: data.output,
512
+ providerExecuted: data.providerExecuted,
513
+ preliminary: data.preliminary
514
+ });
515
+ }
516
+ break;
517
+ }
518
+ case "tool-output-error": {
519
+ if (data.dynamic) {
520
+ const toolInvocations = message.parts.filter(
521
+ (part) => part.type === "dynamic-tool"
522
+ );
523
+ const toolInvocation = toolInvocations.find(
524
+ (invocation) => invocation.toolCallId === data.toolCallId
525
+ );
526
+ if (!toolInvocation)
527
+ throw new Error("Tool invocation not found");
528
+ updateDynamicToolPart({
529
+ toolCallId: data.toolCallId,
530
+ toolName: toolInvocation.toolName,
531
+ state: "output-error",
532
+ input: toolInvocation.input,
533
+ errorText: data.errorText
534
+ });
535
+ } else {
536
+ const toolInvocations = message.parts.filter(isToolUIPart);
537
+ const toolInvocation = toolInvocations.find(
538
+ (invocation) => invocation.toolCallId === data.toolCallId
539
+ );
540
+ if (!toolInvocation)
541
+ throw new Error("Tool invocation not found");
542
+ updateToolPart({
543
+ toolCallId: data.toolCallId,
544
+ toolName: getToolName(toolInvocation),
545
+ state: "output-error",
546
+ input: toolInvocation.input,
547
+ rawInput: "rawInput" in toolInvocation ? toolInvocation.rawInput : void 0,
548
+ errorText: data.errorText
239
549
  });
550
+ }
551
+ break;
552
+ }
553
+ case "start-step": {
554
+ message.parts.push({ type: "step-start" });
555
+ break;
556
+ }
557
+ case "finish-step": {
558
+ activeTextParts = {};
559
+ activeReasoningParts = {};
560
+ break;
561
+ }
562
+ case "start": {
563
+ if (data.messageId != null) {
564
+ message.id = data.messageId;
565
+ }
566
+ await updateMessageMetadata(data.messageMetadata);
567
+ break;
568
+ }
569
+ case "finish": {
570
+ await updateMessageMetadata(data.messageMetadata);
571
+ break;
572
+ }
573
+ case "message-metadata": {
574
+ await updateMessageMetadata(data.messageMetadata);
240
575
  break;
241
576
  }
242
577
  case "error": {
@@ -247,10 +582,6 @@ var AIChatAgent = class extends Agent {
247
582
  id,
248
583
  type: "cf_agent_use_chat_response" /* CF_AGENT_USE_CHAT_RESPONSE */
249
584
  });
250
- return;
251
- }
252
- case "text-delta": {
253
- if (data.delta) fullResponseText += data.delta;
254
585
  break;
255
586
  }
256
587
  }
@@ -266,7 +597,7 @@ var AIChatAgent = class extends Agent {
266
597
  }
267
598
  } else {
268
599
  if (chunk.length > 0) {
269
- fullResponseText += chunk;
600
+ message.parts.push({ type: "text", text: chunk });
270
601
  this._broadcastChatMessage({
271
602
  body: JSON.stringify({ type: "text-delta", delta: chunk }),
272
603
  done: false,
@@ -279,22 +610,8 @@ var AIChatAgent = class extends Agent {
279
610
  } finally {
280
611
  reader.releaseLock();
281
612
  }
282
- const messageParts = [];
283
- Array.from(toolCalls.values()).forEach((t) => {
284
- messageParts.push(t);
285
- });
286
- if (fullResponseText.trim()) {
287
- messageParts.push({ type: "text", text: fullResponseText });
288
- }
289
- if (messageParts.length > 0) {
290
- await this.persistMessages([
291
- ...this.messages,
292
- {
293
- id: `assistant_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`,
294
- role: "assistant",
295
- parts: messageParts
296
- }
297
- ]);
613
+ if (message.parts.length > 0) {
614
+ await this.persistMessages([...this.messages, message]);
298
615
  }
299
616
  });
300
617
  }