@mastra/client-js 1.56.0-alpha.1 → 1.56.0-alpha.3
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/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/docs-harness-signals.md +3 -1
- package/dist/index.cjs +584 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +578 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/agent-controller.d.ts +4 -1
- package/dist/resources/agent-controller.d.ts.map +1 -1
- package/dist/resources/agent.d.ts +2 -2
- package/dist/resources/agent.d.ts.map +1 -1
- package/dist/route-types.generated.d.ts +34 -0
- package/dist/route-types.generated.d.ts.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/ai-sdk-v4/data-stream-parts.d.ts +89 -0
- package/dist/utils/ai-sdk-v4/data-stream-parts.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/fix-json.d.ts +2 -0
- package/dist/utils/ai-sdk-v4/fix-json.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/index.d.ts +5 -0
- package/dist/utils/ai-sdk-v4/index.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/parse-partial-json.d.ts +6 -0
- package/dist/utils/ai-sdk-v4/parse-partial-json.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/process-data-stream.d.ts +53 -0
- package/dist/utils/ai-sdk-v4/process-data-stream.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/types.d.ts +93 -0
- package/dist/utils/ai-sdk-v4/types.d.ts.map +1 -0
- package/package.json +6 -7
- package/dist/_types/@ai-sdk_provider/dist/index.d.ts +0 -1587
- package/dist/_types/@ai-sdk_provider/package.json +0 -1
- package/dist/_types/@ai-sdk_provider-utils/dist/index.d.ts +0 -379
- package/dist/_types/@ai-sdk_provider-utils/package.json +0 -1
- package/dist/_types/@ai-sdk_ui-utils/dist/index.d.ts +0 -820
- package/dist/_types/@ai-sdk_ui-utils/package.json +0 -1
package/dist/docs/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: mastra-client-js
|
|
|
3
3
|
description: Documentation for @mastra/client-js. Use when working with @mastra/client-js APIs, configuration, or implementation.
|
|
4
4
|
metadata:
|
|
5
5
|
package: "@mastra/client-js"
|
|
6
|
-
version: "1.56.0-alpha.
|
|
6
|
+
version: "1.56.0-alpha.3"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
@@ -416,7 +416,9 @@ Use the connection tools for distinct operations:
|
|
|
416
416
|
|
|
417
417
|
Saved connections remain in the sender thread until explicitly disconnected. Every send independently refreshes discovery and verifies the exact endpoint before routing begins. A saved connection therefore records collaboration intent. It doesn't indicate current presence.
|
|
418
418
|
|
|
419
|
-
After a send attempt reaches Core routing, the routing result is authoritative. The result can be `wake`, `deliver`, `persist`, `blocked`, or `discard`, depending on the target thread and notification policy. A send that isn't
|
|
419
|
+
After a send attempt reaches Core routing, the routing result is authoritative. The result can be `wake`, `deliver`, `persist`, `blocked`, or `discard`, depending on the target thread and notification policy. A send that fails a direct delivery because no thread owner acknowledged it isn't lost: the signal stays pending in the target's notification inbox and the send reports `persist` instead of claiming delivery. The notification dispatcher retries that delivery on its own, so the sender doesn't need to resend it. The `messageId` isn't recorded in sent history and isn't rejected as a duplicate, although the pending notification still matches on it. A resend with the same `messageId` merges into that notification while it's pending, and delivers a second copy once the retry has succeeded. A send made with `expectsReply: true` returns an error there, because the reply obligation isn't established until the signal is delivered.
|
|
420
|
+
|
|
421
|
+
When the delivery policy routes a signal to a notification summary rather than delivering it directly, the send records the `messageId`, so retrying with the same id reports a duplicate instead of routing again. A low-priority send always takes this route and reports `persist`. A high- or medium-priority send to an active thread takes it too, but there the summary signal is emitted immediately, so the send reports that signal's routing result (`wake`, `deliver`, or `persist`) and records the `messageId` the same way, including when `expectsReply: true`. Only when the policy schedules a summary without emitting a signal at send time does an `expectsReply: true` send fail to establish its reply obligation: it returns an error and doesn't record the send in sent history, so establishing the reply obligation takes a new signal at a priority that routes directly.
|
|
420
422
|
|
|
421
423
|
### Discover agents in other projects
|
|
422
424
|
|
package/dist/index.cjs
CHANGED
|
@@ -21,7 +21,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
21
21
|
enumerable: true
|
|
22
22
|
}) : target, mod));
|
|
23
23
|
//#endregion
|
|
24
|
-
let _ai_sdk_ui_utils = require("@ai-sdk/ui-utils");
|
|
25
24
|
let _lukeed_uuid = require("@lukeed/uuid");
|
|
26
25
|
let _mastra_core_error = require("@mastra/core/error");
|
|
27
26
|
let _mastra_schema_compat_schema = require("@mastra/schema-compat/schema");
|
|
@@ -410,6 +409,583 @@ function isTerminalReconnectError(error) {
|
|
|
410
409
|
return isTerminalHttpError(error) && status !== 408 && status !== 429;
|
|
411
410
|
}
|
|
412
411
|
//#endregion
|
|
412
|
+
//#region src/utils/ai-sdk-v4/data-stream-parts.ts
|
|
413
|
+
const dataStreamParts = [
|
|
414
|
+
{
|
|
415
|
+
code: "0",
|
|
416
|
+
name: "text",
|
|
417
|
+
parse: (value) => {
|
|
418
|
+
if (typeof value !== "string") throw new Error("\"text\" parts expect a string value.");
|
|
419
|
+
return {
|
|
420
|
+
type: "text",
|
|
421
|
+
value
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
code: "2",
|
|
427
|
+
name: "data",
|
|
428
|
+
parse: (value) => {
|
|
429
|
+
if (!Array.isArray(value)) throw new Error("\"data\" parts expect an array value.");
|
|
430
|
+
return {
|
|
431
|
+
type: "data",
|
|
432
|
+
value
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
code: "3",
|
|
438
|
+
name: "error",
|
|
439
|
+
parse: (value) => {
|
|
440
|
+
if (typeof value !== "string") throw new Error("\"error\" parts expect a string value.");
|
|
441
|
+
return {
|
|
442
|
+
type: "error",
|
|
443
|
+
value
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
code: "8",
|
|
449
|
+
name: "message_annotations",
|
|
450
|
+
parse: (value) => {
|
|
451
|
+
if (!Array.isArray(value)) throw new Error("\"message_annotations\" parts expect an array value.");
|
|
452
|
+
return {
|
|
453
|
+
type: "message_annotations",
|
|
454
|
+
value
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
code: "9",
|
|
460
|
+
name: "tool_call",
|
|
461
|
+
parse: (value) => {
|
|
462
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("toolName" in value) || typeof value.toolName !== "string" || !("args" in value) || typeof value.args !== "object") throw new Error("\"tool_call\" parts expect an object with a \"toolCallId\", \"toolName\", and \"args\" property.");
|
|
463
|
+
return {
|
|
464
|
+
type: "tool_call",
|
|
465
|
+
value
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
code: "a",
|
|
471
|
+
name: "tool_result",
|
|
472
|
+
parse: (value) => {
|
|
473
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("result" in value)) throw new Error("\"tool_result\" parts expect an object with a \"toolCallId\" and a \"result\" property.");
|
|
474
|
+
return {
|
|
475
|
+
type: "tool_result",
|
|
476
|
+
value
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
code: "b",
|
|
482
|
+
name: "tool_call_streaming_start",
|
|
483
|
+
parse: (value) => {
|
|
484
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("toolName" in value) || typeof value.toolName !== "string") throw new Error("\"tool_call_streaming_start\" parts expect an object with a \"toolCallId\" and \"toolName\" property.");
|
|
485
|
+
return {
|
|
486
|
+
type: "tool_call_streaming_start",
|
|
487
|
+
value
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
code: "c",
|
|
493
|
+
name: "tool_call_delta",
|
|
494
|
+
parse: (value) => {
|
|
495
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("argsTextDelta" in value) || typeof value.argsTextDelta !== "string") throw new Error("\"tool_call_delta\" parts expect an object with a \"toolCallId\" and \"argsTextDelta\" property.");
|
|
496
|
+
return {
|
|
497
|
+
type: "tool_call_delta",
|
|
498
|
+
value
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
code: "d",
|
|
504
|
+
name: "finish_message",
|
|
505
|
+
parse: (value) => {
|
|
506
|
+
if (value == null || typeof value !== "object" || !("finishReason" in value) || typeof value.finishReason !== "string") throw new Error("\"finish_message\" parts expect an object with a \"finishReason\" property.");
|
|
507
|
+
const result = { finishReason: value.finishReason };
|
|
508
|
+
if ("usage" in value && value.usage != null && typeof value.usage === "object" && "promptTokens" in value.usage && "completionTokens" in value.usage) result.usage = {
|
|
509
|
+
promptTokens: typeof value.usage.promptTokens === "number" ? value.usage.promptTokens : NaN,
|
|
510
|
+
completionTokens: typeof value.usage.completionTokens === "number" ? value.usage.completionTokens : NaN
|
|
511
|
+
};
|
|
512
|
+
return {
|
|
513
|
+
type: "finish_message",
|
|
514
|
+
value: result
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
code: "e",
|
|
520
|
+
name: "finish_step",
|
|
521
|
+
parse: (value) => {
|
|
522
|
+
if (value == null || typeof value !== "object" || !("finishReason" in value) || typeof value.finishReason !== "string") throw new Error("\"finish_step\" parts expect an object with a \"finishReason\" property.");
|
|
523
|
+
const result = {
|
|
524
|
+
finishReason: value.finishReason,
|
|
525
|
+
isContinued: false
|
|
526
|
+
};
|
|
527
|
+
if ("usage" in value && value.usage != null && typeof value.usage === "object" && "promptTokens" in value.usage && "completionTokens" in value.usage) result.usage = {
|
|
528
|
+
promptTokens: typeof value.usage.promptTokens === "number" ? value.usage.promptTokens : NaN,
|
|
529
|
+
completionTokens: typeof value.usage.completionTokens === "number" ? value.usage.completionTokens : NaN
|
|
530
|
+
};
|
|
531
|
+
if ("isContinued" in value && typeof value.isContinued === "boolean") result.isContinued = value.isContinued;
|
|
532
|
+
return {
|
|
533
|
+
type: "finish_step",
|
|
534
|
+
value: result
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
code: "f",
|
|
540
|
+
name: "start_step",
|
|
541
|
+
parse: (value) => {
|
|
542
|
+
if (value == null || typeof value !== "object" || !("messageId" in value) || typeof value.messageId !== "string") throw new Error("\"start_step\" parts expect an object with an \"id\" property.");
|
|
543
|
+
return {
|
|
544
|
+
type: "start_step",
|
|
545
|
+
value: { messageId: value.messageId }
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
code: "g",
|
|
551
|
+
name: "reasoning",
|
|
552
|
+
parse: (value) => {
|
|
553
|
+
if (typeof value !== "string") throw new Error("\"reasoning\" parts expect a string value.");
|
|
554
|
+
return {
|
|
555
|
+
type: "reasoning",
|
|
556
|
+
value
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
code: "h",
|
|
562
|
+
name: "source",
|
|
563
|
+
parse: (value) => {
|
|
564
|
+
if (value == null || typeof value !== "object") throw new Error("\"source\" parts expect a Source object.");
|
|
565
|
+
return {
|
|
566
|
+
type: "source",
|
|
567
|
+
value
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
code: "i",
|
|
573
|
+
name: "redacted_reasoning",
|
|
574
|
+
parse: (value) => {
|
|
575
|
+
if (value == null || typeof value !== "object" || !("data" in value) || typeof value.data !== "string") throw new Error("\"redacted_reasoning\" parts expect an object with a \"data\" property.");
|
|
576
|
+
return {
|
|
577
|
+
type: "redacted_reasoning",
|
|
578
|
+
value: { data: value.data }
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
code: "j",
|
|
584
|
+
name: "reasoning_signature",
|
|
585
|
+
parse: (value) => {
|
|
586
|
+
if (value == null || typeof value !== "object" || !("signature" in value) || typeof value.signature !== "string") throw new Error("\"reasoning_signature\" parts expect an object with a \"signature\" property.");
|
|
587
|
+
return {
|
|
588
|
+
type: "reasoning_signature",
|
|
589
|
+
value: { signature: value.signature }
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
code: "k",
|
|
595
|
+
name: "file",
|
|
596
|
+
parse: (value) => {
|
|
597
|
+
if (value == null || typeof value !== "object" || !("data" in value) || typeof value.data !== "string" || !("mimeType" in value) || typeof value.mimeType !== "string") throw new Error("\"file\" parts expect an object with a \"data\" and \"mimeType\" property.");
|
|
598
|
+
return {
|
|
599
|
+
type: "file",
|
|
600
|
+
value
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
];
|
|
605
|
+
const dataStreamPartsByCode = Object.fromEntries(dataStreamParts.map((part) => [part.code, part]));
|
|
606
|
+
Object.fromEntries(dataStreamParts.map((part) => [part.name, part.code]));
|
|
607
|
+
const validCodes = dataStreamParts.map((part) => part.code);
|
|
608
|
+
/**
|
|
609
|
+
Parses a stream part from a string.
|
|
610
|
+
|
|
611
|
+
@param line The string to parse.
|
|
612
|
+
@returns The parsed stream part.
|
|
613
|
+
@throws An error if the string cannot be parsed.
|
|
614
|
+
*/
|
|
615
|
+
const parseDataStreamPart = (line) => {
|
|
616
|
+
const firstSeparatorIndex = line.indexOf(":");
|
|
617
|
+
if (firstSeparatorIndex === -1) throw new Error("Failed to parse stream string. No separator found.");
|
|
618
|
+
const prefix = line.slice(0, firstSeparatorIndex);
|
|
619
|
+
if (!validCodes.includes(prefix)) throw new Error(`Failed to parse stream string. Invalid code ${prefix}.`);
|
|
620
|
+
const code = prefix;
|
|
621
|
+
const textValue = line.slice(firstSeparatorIndex + 1);
|
|
622
|
+
const jsonValue = JSON.parse(textValue);
|
|
623
|
+
return dataStreamPartsByCode[code].parse(jsonValue);
|
|
624
|
+
};
|
|
625
|
+
//#endregion
|
|
626
|
+
//#region src/utils/ai-sdk-v4/fix-json.ts
|
|
627
|
+
function fixJson(input) {
|
|
628
|
+
const stack = ["ROOT"];
|
|
629
|
+
let lastValidIndex = -1;
|
|
630
|
+
let literalStart = null;
|
|
631
|
+
function processValueStart(char, i, swapState) {
|
|
632
|
+
switch (char) {
|
|
633
|
+
case "\"":
|
|
634
|
+
lastValidIndex = i;
|
|
635
|
+
stack.pop();
|
|
636
|
+
stack.push(swapState);
|
|
637
|
+
stack.push("INSIDE_STRING");
|
|
638
|
+
break;
|
|
639
|
+
case "f":
|
|
640
|
+
case "t":
|
|
641
|
+
case "n":
|
|
642
|
+
lastValidIndex = i;
|
|
643
|
+
literalStart = i;
|
|
644
|
+
stack.pop();
|
|
645
|
+
stack.push(swapState);
|
|
646
|
+
stack.push("INSIDE_LITERAL");
|
|
647
|
+
break;
|
|
648
|
+
case "-":
|
|
649
|
+
stack.pop();
|
|
650
|
+
stack.push(swapState);
|
|
651
|
+
stack.push("INSIDE_NUMBER");
|
|
652
|
+
break;
|
|
653
|
+
case "0":
|
|
654
|
+
case "1":
|
|
655
|
+
case "2":
|
|
656
|
+
case "3":
|
|
657
|
+
case "4":
|
|
658
|
+
case "5":
|
|
659
|
+
case "6":
|
|
660
|
+
case "7":
|
|
661
|
+
case "8":
|
|
662
|
+
case "9":
|
|
663
|
+
lastValidIndex = i;
|
|
664
|
+
stack.pop();
|
|
665
|
+
stack.push(swapState);
|
|
666
|
+
stack.push("INSIDE_NUMBER");
|
|
667
|
+
break;
|
|
668
|
+
case "{":
|
|
669
|
+
lastValidIndex = i;
|
|
670
|
+
stack.pop();
|
|
671
|
+
stack.push(swapState);
|
|
672
|
+
stack.push("INSIDE_OBJECT_START");
|
|
673
|
+
break;
|
|
674
|
+
case "[":
|
|
675
|
+
lastValidIndex = i;
|
|
676
|
+
stack.pop();
|
|
677
|
+
stack.push(swapState);
|
|
678
|
+
stack.push("INSIDE_ARRAY_START");
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
function processAfterObjectValue(char, i) {
|
|
683
|
+
switch (char) {
|
|
684
|
+
case ",":
|
|
685
|
+
stack.pop();
|
|
686
|
+
stack.push("INSIDE_OBJECT_AFTER_COMMA");
|
|
687
|
+
break;
|
|
688
|
+
case "}":
|
|
689
|
+
lastValidIndex = i;
|
|
690
|
+
stack.pop();
|
|
691
|
+
break;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
function processAfterArrayValue(char, i) {
|
|
695
|
+
switch (char) {
|
|
696
|
+
case ",":
|
|
697
|
+
stack.pop();
|
|
698
|
+
stack.push("INSIDE_ARRAY_AFTER_COMMA");
|
|
699
|
+
break;
|
|
700
|
+
case "]":
|
|
701
|
+
lastValidIndex = i;
|
|
702
|
+
stack.pop();
|
|
703
|
+
break;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
for (let i = 0; i < input.length; i++) {
|
|
707
|
+
const char = input[i];
|
|
708
|
+
switch (stack[stack.length - 1]) {
|
|
709
|
+
case "ROOT":
|
|
710
|
+
processValueStart(char, i, "FINISH");
|
|
711
|
+
break;
|
|
712
|
+
case "INSIDE_OBJECT_START":
|
|
713
|
+
switch (char) {
|
|
714
|
+
case "\"":
|
|
715
|
+
stack.pop();
|
|
716
|
+
stack.push("INSIDE_OBJECT_KEY");
|
|
717
|
+
break;
|
|
718
|
+
case "}":
|
|
719
|
+
lastValidIndex = i;
|
|
720
|
+
stack.pop();
|
|
721
|
+
break;
|
|
722
|
+
}
|
|
723
|
+
break;
|
|
724
|
+
case "INSIDE_OBJECT_AFTER_COMMA":
|
|
725
|
+
switch (char) {
|
|
726
|
+
case "\"":
|
|
727
|
+
stack.pop();
|
|
728
|
+
stack.push("INSIDE_OBJECT_KEY");
|
|
729
|
+
break;
|
|
730
|
+
}
|
|
731
|
+
break;
|
|
732
|
+
case "INSIDE_OBJECT_KEY":
|
|
733
|
+
switch (char) {
|
|
734
|
+
case "\"":
|
|
735
|
+
stack.pop();
|
|
736
|
+
stack.push("INSIDE_OBJECT_AFTER_KEY");
|
|
737
|
+
break;
|
|
738
|
+
}
|
|
739
|
+
break;
|
|
740
|
+
case "INSIDE_OBJECT_AFTER_KEY":
|
|
741
|
+
switch (char) {
|
|
742
|
+
case ":":
|
|
743
|
+
stack.pop();
|
|
744
|
+
stack.push("INSIDE_OBJECT_BEFORE_VALUE");
|
|
745
|
+
break;
|
|
746
|
+
}
|
|
747
|
+
break;
|
|
748
|
+
case "INSIDE_OBJECT_BEFORE_VALUE":
|
|
749
|
+
processValueStart(char, i, "INSIDE_OBJECT_AFTER_VALUE");
|
|
750
|
+
break;
|
|
751
|
+
case "INSIDE_OBJECT_AFTER_VALUE":
|
|
752
|
+
processAfterObjectValue(char, i);
|
|
753
|
+
break;
|
|
754
|
+
case "INSIDE_STRING":
|
|
755
|
+
switch (char) {
|
|
756
|
+
case "\"":
|
|
757
|
+
stack.pop();
|
|
758
|
+
lastValidIndex = i;
|
|
759
|
+
break;
|
|
760
|
+
case "\\":
|
|
761
|
+
stack.push("INSIDE_STRING_ESCAPE");
|
|
762
|
+
break;
|
|
763
|
+
default: lastValidIndex = i;
|
|
764
|
+
}
|
|
765
|
+
break;
|
|
766
|
+
case "INSIDE_ARRAY_START":
|
|
767
|
+
switch (char) {
|
|
768
|
+
case "]":
|
|
769
|
+
lastValidIndex = i;
|
|
770
|
+
stack.pop();
|
|
771
|
+
break;
|
|
772
|
+
default:
|
|
773
|
+
lastValidIndex = i;
|
|
774
|
+
processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
|
|
775
|
+
break;
|
|
776
|
+
}
|
|
777
|
+
break;
|
|
778
|
+
case "INSIDE_ARRAY_AFTER_VALUE":
|
|
779
|
+
switch (char) {
|
|
780
|
+
case ",":
|
|
781
|
+
stack.pop();
|
|
782
|
+
stack.push("INSIDE_ARRAY_AFTER_COMMA");
|
|
783
|
+
break;
|
|
784
|
+
case "]":
|
|
785
|
+
lastValidIndex = i;
|
|
786
|
+
stack.pop();
|
|
787
|
+
break;
|
|
788
|
+
default:
|
|
789
|
+
lastValidIndex = i;
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
break;
|
|
793
|
+
case "INSIDE_ARRAY_AFTER_COMMA":
|
|
794
|
+
processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
|
|
795
|
+
break;
|
|
796
|
+
case "INSIDE_STRING_ESCAPE":
|
|
797
|
+
stack.pop();
|
|
798
|
+
lastValidIndex = i;
|
|
799
|
+
break;
|
|
800
|
+
case "INSIDE_NUMBER":
|
|
801
|
+
switch (char) {
|
|
802
|
+
case "0":
|
|
803
|
+
case "1":
|
|
804
|
+
case "2":
|
|
805
|
+
case "3":
|
|
806
|
+
case "4":
|
|
807
|
+
case "5":
|
|
808
|
+
case "6":
|
|
809
|
+
case "7":
|
|
810
|
+
case "8":
|
|
811
|
+
case "9":
|
|
812
|
+
lastValidIndex = i;
|
|
813
|
+
break;
|
|
814
|
+
case "e":
|
|
815
|
+
case "E":
|
|
816
|
+
case "-":
|
|
817
|
+
case ".": break;
|
|
818
|
+
case ",":
|
|
819
|
+
stack.pop();
|
|
820
|
+
if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
|
|
821
|
+
if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
|
|
822
|
+
break;
|
|
823
|
+
case "}":
|
|
824
|
+
stack.pop();
|
|
825
|
+
if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
|
|
826
|
+
break;
|
|
827
|
+
case "]":
|
|
828
|
+
stack.pop();
|
|
829
|
+
if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
|
|
830
|
+
break;
|
|
831
|
+
default:
|
|
832
|
+
stack.pop();
|
|
833
|
+
break;
|
|
834
|
+
}
|
|
835
|
+
break;
|
|
836
|
+
case "INSIDE_LITERAL": {
|
|
837
|
+
const partialLiteral = input.substring(literalStart, i + 1);
|
|
838
|
+
if (!"false".startsWith(partialLiteral) && !"true".startsWith(partialLiteral) && !"null".startsWith(partialLiteral)) {
|
|
839
|
+
stack.pop();
|
|
840
|
+
if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
|
|
841
|
+
else if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
|
|
842
|
+
} else lastValidIndex = i;
|
|
843
|
+
break;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
let result = input.slice(0, lastValidIndex + 1);
|
|
848
|
+
for (let i = stack.length - 1; i >= 0; i--) switch (stack[i]) {
|
|
849
|
+
case "INSIDE_STRING":
|
|
850
|
+
result += "\"";
|
|
851
|
+
break;
|
|
852
|
+
case "INSIDE_OBJECT_KEY":
|
|
853
|
+
case "INSIDE_OBJECT_AFTER_KEY":
|
|
854
|
+
case "INSIDE_OBJECT_AFTER_COMMA":
|
|
855
|
+
case "INSIDE_OBJECT_START":
|
|
856
|
+
case "INSIDE_OBJECT_BEFORE_VALUE":
|
|
857
|
+
case "INSIDE_OBJECT_AFTER_VALUE":
|
|
858
|
+
result += "}";
|
|
859
|
+
break;
|
|
860
|
+
case "INSIDE_ARRAY_START":
|
|
861
|
+
case "INSIDE_ARRAY_AFTER_COMMA":
|
|
862
|
+
case "INSIDE_ARRAY_AFTER_VALUE":
|
|
863
|
+
result += "]";
|
|
864
|
+
break;
|
|
865
|
+
case "INSIDE_LITERAL": {
|
|
866
|
+
const partialLiteral = input.substring(literalStart, input.length);
|
|
867
|
+
if ("true".startsWith(partialLiteral)) result += "true".slice(partialLiteral.length);
|
|
868
|
+
else if ("false".startsWith(partialLiteral)) result += "false".slice(partialLiteral.length);
|
|
869
|
+
else if ("null".startsWith(partialLiteral)) result += "null".slice(partialLiteral.length);
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
return result;
|
|
873
|
+
}
|
|
874
|
+
//#endregion
|
|
875
|
+
//#region src/utils/ai-sdk-v4/parse-partial-json.ts
|
|
876
|
+
function tryParse(text) {
|
|
877
|
+
try {
|
|
878
|
+
return {
|
|
879
|
+
success: true,
|
|
880
|
+
value: JSON.parse(text)
|
|
881
|
+
};
|
|
882
|
+
} catch {
|
|
883
|
+
return { success: false };
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
function parsePartialJson(jsonText) {
|
|
887
|
+
if (jsonText === void 0) return {
|
|
888
|
+
value: void 0,
|
|
889
|
+
state: "undefined-input"
|
|
890
|
+
};
|
|
891
|
+
let result = tryParse(jsonText);
|
|
892
|
+
if (result.success) return {
|
|
893
|
+
value: result.value,
|
|
894
|
+
state: "successful-parse"
|
|
895
|
+
};
|
|
896
|
+
result = tryParse(fixJson(jsonText));
|
|
897
|
+
if (result.success) return {
|
|
898
|
+
value: result.value,
|
|
899
|
+
state: "repaired-parse"
|
|
900
|
+
};
|
|
901
|
+
return {
|
|
902
|
+
value: void 0,
|
|
903
|
+
state: "failed-parse"
|
|
904
|
+
};
|
|
905
|
+
}
|
|
906
|
+
//#endregion
|
|
907
|
+
//#region src/utils/ai-sdk-v4/process-data-stream.ts
|
|
908
|
+
const NEWLINE = "\n".charCodeAt(0);
|
|
909
|
+
function concatChunks(chunks, totalLength) {
|
|
910
|
+
const concatenatedChunks = new Uint8Array(totalLength);
|
|
911
|
+
let offset = 0;
|
|
912
|
+
for (const chunk of chunks) {
|
|
913
|
+
concatenatedChunks.set(chunk, offset);
|
|
914
|
+
offset += chunk.length;
|
|
915
|
+
}
|
|
916
|
+
chunks.length = 0;
|
|
917
|
+
return concatenatedChunks;
|
|
918
|
+
}
|
|
919
|
+
async function processDataStream({ stream, onTextPart, onReasoningPart, onReasoningSignaturePart, onRedactedReasoningPart, onSourcePart, onFilePart, onDataPart, onErrorPart, onToolCallStreamingStartPart, onToolCallDeltaPart, onToolCallPart, onToolResultPart, onMessageAnnotationsPart, onFinishMessagePart, onFinishStepPart, onStartStepPart }) {
|
|
920
|
+
const reader = stream.getReader();
|
|
921
|
+
const decoder = new TextDecoder();
|
|
922
|
+
const chunks = [];
|
|
923
|
+
let totalLength = 0;
|
|
924
|
+
while (true) {
|
|
925
|
+
const { value } = await reader.read();
|
|
926
|
+
if (value) {
|
|
927
|
+
chunks.push(value);
|
|
928
|
+
totalLength += value.length;
|
|
929
|
+
if (value[value.length - 1] !== NEWLINE) continue;
|
|
930
|
+
}
|
|
931
|
+
if (chunks.length === 0) break;
|
|
932
|
+
const concatenatedChunks = concatChunks(chunks, totalLength);
|
|
933
|
+
totalLength = 0;
|
|
934
|
+
const streamParts = decoder.decode(concatenatedChunks, { stream: true }).split("\n").filter((line) => line !== "").map(parseDataStreamPart);
|
|
935
|
+
for (const { type, value } of streamParts) switch (type) {
|
|
936
|
+
case "text":
|
|
937
|
+
await onTextPart?.(value);
|
|
938
|
+
break;
|
|
939
|
+
case "reasoning":
|
|
940
|
+
await onReasoningPart?.(value);
|
|
941
|
+
break;
|
|
942
|
+
case "reasoning_signature":
|
|
943
|
+
await onReasoningSignaturePart?.(value);
|
|
944
|
+
break;
|
|
945
|
+
case "redacted_reasoning":
|
|
946
|
+
await onRedactedReasoningPart?.(value);
|
|
947
|
+
break;
|
|
948
|
+
case "file":
|
|
949
|
+
await onFilePart?.(value);
|
|
950
|
+
break;
|
|
951
|
+
case "source":
|
|
952
|
+
await onSourcePart?.(value);
|
|
953
|
+
break;
|
|
954
|
+
case "data":
|
|
955
|
+
await onDataPart?.(value);
|
|
956
|
+
break;
|
|
957
|
+
case "error":
|
|
958
|
+
await onErrorPart?.(value);
|
|
959
|
+
break;
|
|
960
|
+
case "message_annotations":
|
|
961
|
+
await onMessageAnnotationsPart?.(value);
|
|
962
|
+
break;
|
|
963
|
+
case "tool_call_streaming_start":
|
|
964
|
+
await onToolCallStreamingStartPart?.(value);
|
|
965
|
+
break;
|
|
966
|
+
case "tool_call_delta":
|
|
967
|
+
await onToolCallDeltaPart?.(value);
|
|
968
|
+
break;
|
|
969
|
+
case "tool_call":
|
|
970
|
+
await onToolCallPart?.(value);
|
|
971
|
+
break;
|
|
972
|
+
case "tool_result":
|
|
973
|
+
await onToolResultPart?.(value);
|
|
974
|
+
break;
|
|
975
|
+
case "finish_message":
|
|
976
|
+
await onFinishMessagePart?.(value);
|
|
977
|
+
break;
|
|
978
|
+
case "finish_step":
|
|
979
|
+
await onFinishStepPart?.(value);
|
|
980
|
+
break;
|
|
981
|
+
case "start_step":
|
|
982
|
+
await onStartStepPart?.(value);
|
|
983
|
+
break;
|
|
984
|
+
default: throw new Error(`Unknown stream part type: ${type}`);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
//#endregion
|
|
413
989
|
//#region src/utils/client-tool-model-output.ts
|
|
414
990
|
/**
|
|
415
991
|
* Normalize modelOutput from toModelOutput() to the AI SDK V2 tool result
|
|
@@ -1543,7 +2119,7 @@ var Agent = class extends BaseResource {
|
|
|
1543
2119
|
replaceLastMessage
|
|
1544
2120
|
});
|
|
1545
2121
|
}
|
|
1546
|
-
await
|
|
2122
|
+
await processDataStream({
|
|
1547
2123
|
stream,
|
|
1548
2124
|
onTextPart(value) {
|
|
1549
2125
|
if (currentTextPart == null) {
|
|
@@ -1634,7 +2210,7 @@ var Agent = class extends BaseResource {
|
|
|
1634
2210
|
onToolCallDeltaPart(value) {
|
|
1635
2211
|
const partialToolCall = partialToolCalls[value.toolCallId];
|
|
1636
2212
|
partialToolCall.text += value.argsTextDelta;
|
|
1637
|
-
const { value: partialArgs } =
|
|
2213
|
+
const { value: partialArgs } = parsePartialJson(partialToolCall.text);
|
|
1638
2214
|
const invocation = {
|
|
1639
2215
|
state: "partial-call",
|
|
1640
2216
|
step: partialToolCall.step,
|
|
@@ -1649,7 +2225,7 @@ var Agent = class extends BaseResource {
|
|
|
1649
2225
|
},
|
|
1650
2226
|
async onToolCallPart(value) {
|
|
1651
2227
|
const partialToolCall = partialToolCalls[value.toolCallId];
|
|
1652
|
-
const streamedArgs = partialToolCall?.text ?
|
|
2228
|
+
const streamedArgs = partialToolCall?.text ? parsePartialJson(partialToolCall.text).value : void 0;
|
|
1653
2229
|
const toolCall = streamedArgs === void 0 ? value : {
|
|
1654
2230
|
...value,
|
|
1655
2231
|
args: streamedArgs
|
|
@@ -1764,7 +2340,7 @@ var Agent = class extends BaseResource {
|
|
|
1764
2340
|
headers: response.headers
|
|
1765
2341
|
});
|
|
1766
2342
|
streamResponse.processDataStream = async (options = {}) => {
|
|
1767
|
-
await
|
|
2343
|
+
await processDataStream({
|
|
1768
2344
|
stream: streamResponse.body,
|
|
1769
2345
|
...options
|
|
1770
2346
|
});
|
|
@@ -1888,7 +2464,7 @@ var Agent = class extends BaseResource {
|
|
|
1888
2464
|
break;
|
|
1889
2465
|
case "tool-call": {
|
|
1890
2466
|
const partialToolCall = partialToolCalls[chunk.payload.toolCallId];
|
|
1891
|
-
const streamedArgs = partialToolCall?.text ?
|
|
2467
|
+
const streamedArgs = partialToolCall?.text ? parsePartialJson(partialToolCall.text).value : void 0;
|
|
1892
2468
|
const toolCall = streamedArgs === void 0 ? chunk.payload : {
|
|
1893
2469
|
...chunk.payload,
|
|
1894
2470
|
args: streamedArgs
|
|
@@ -1947,7 +2523,7 @@ var Agent = class extends BaseResource {
|
|
|
1947
2523
|
case "tool-call-delta": {
|
|
1948
2524
|
const partialToolCall = partialToolCalls[chunk.payload.toolCallId];
|
|
1949
2525
|
partialToolCall.text += chunk.payload.argsTextDelta;
|
|
1950
|
-
const { value: partialArgs } =
|
|
2526
|
+
const { value: partialArgs } = parsePartialJson(partialToolCall.text);
|
|
1951
2527
|
const invocation = {
|
|
1952
2528
|
state: "partial-call",
|
|
1953
2529
|
step: partialToolCall.step,
|
|
@@ -6430,6 +7006,7 @@ var AgentControllerSession = class extends BaseResource {
|
|
|
6430
7006
|
body: {
|
|
6431
7007
|
toolCallId,
|
|
6432
7008
|
approved,
|
|
7009
|
+
...options?.alwaysAllowCategory ? { alwaysAllowCategory: true } : {},
|
|
6433
7010
|
...requestContext ? { requestContext } : {}
|
|
6434
7011
|
}
|
|
6435
7012
|
});
|