@mastra/client-js 1.55.1-alpha.0 → 1.56.0-alpha.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.
Files changed (34) hide show
  1. package/dist/client.d.ts.map +1 -1
  2. package/dist/docs/SKILL.md +1 -1
  3. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  4. package/dist/docs/references/reference-client-js-observability.md +44 -0
  5. package/dist/docs/references/reference-observability-metrics-queries.md +1 -0
  6. package/dist/index.cjs +593 -7
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +587 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/resources/agent.d.ts +2 -2
  11. package/dist/resources/agent.d.ts.map +1 -1
  12. package/dist/route-types.generated.d.ts +59 -15
  13. package/dist/route-types.generated.d.ts.map +1 -1
  14. package/dist/types.d.ts +2 -2
  15. package/dist/types.d.ts.map +1 -1
  16. package/dist/utils/ai-sdk-v4/data-stream-parts.d.ts +89 -0
  17. package/dist/utils/ai-sdk-v4/data-stream-parts.d.ts.map +1 -0
  18. package/dist/utils/ai-sdk-v4/fix-json.d.ts +2 -0
  19. package/dist/utils/ai-sdk-v4/fix-json.d.ts.map +1 -0
  20. package/dist/utils/ai-sdk-v4/index.d.ts +5 -0
  21. package/dist/utils/ai-sdk-v4/index.d.ts.map +1 -0
  22. package/dist/utils/ai-sdk-v4/parse-partial-json.d.ts +6 -0
  23. package/dist/utils/ai-sdk-v4/parse-partial-json.d.ts.map +1 -0
  24. package/dist/utils/ai-sdk-v4/process-data-stream.d.ts +53 -0
  25. package/dist/utils/ai-sdk-v4/process-data-stream.d.ts.map +1 -0
  26. package/dist/utils/ai-sdk-v4/types.d.ts +93 -0
  27. package/dist/utils/ai-sdk-v4/types.d.ts.map +1 -0
  28. package/package.json +3 -4
  29. package/dist/_types/@ai-sdk_provider/dist/index.d.ts +0 -1587
  30. package/dist/_types/@ai-sdk_provider/package.json +0 -1
  31. package/dist/_types/@ai-sdk_provider-utils/dist/index.d.ts +0 -379
  32. package/dist/_types/@ai-sdk_provider-utils/package.json +0 -1
  33. package/dist/_types/@ai-sdk_ui-utils/dist/index.d.ts +0 -820
  34. package/dist/_types/@ai-sdk_ui-utils/package.json +0 -1
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import { parsePartialJson, processDataStream } from "@ai-sdk/ui-utils";
2
1
  import { v4 } from "@lukeed/uuid";
3
2
  import { getErrorFromUnknown } from "@mastra/core/error";
4
3
  import { standardSchemaToJSONSchema, toStandardSchema } from "@mastra/schema-compat/schema";
@@ -386,6 +385,583 @@ function isTerminalReconnectError(error) {
386
385
  return isTerminalHttpError(error) && status !== 408 && status !== 429;
387
386
  }
388
387
  //#endregion
388
+ //#region src/utils/ai-sdk-v4/data-stream-parts.ts
389
+ const dataStreamParts = [
390
+ {
391
+ code: "0",
392
+ name: "text",
393
+ parse: (value) => {
394
+ if (typeof value !== "string") throw new Error("\"text\" parts expect a string value.");
395
+ return {
396
+ type: "text",
397
+ value
398
+ };
399
+ }
400
+ },
401
+ {
402
+ code: "2",
403
+ name: "data",
404
+ parse: (value) => {
405
+ if (!Array.isArray(value)) throw new Error("\"data\" parts expect an array value.");
406
+ return {
407
+ type: "data",
408
+ value
409
+ };
410
+ }
411
+ },
412
+ {
413
+ code: "3",
414
+ name: "error",
415
+ parse: (value) => {
416
+ if (typeof value !== "string") throw new Error("\"error\" parts expect a string value.");
417
+ return {
418
+ type: "error",
419
+ value
420
+ };
421
+ }
422
+ },
423
+ {
424
+ code: "8",
425
+ name: "message_annotations",
426
+ parse: (value) => {
427
+ if (!Array.isArray(value)) throw new Error("\"message_annotations\" parts expect an array value.");
428
+ return {
429
+ type: "message_annotations",
430
+ value
431
+ };
432
+ }
433
+ },
434
+ {
435
+ code: "9",
436
+ name: "tool_call",
437
+ parse: (value) => {
438
+ 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.");
439
+ return {
440
+ type: "tool_call",
441
+ value
442
+ };
443
+ }
444
+ },
445
+ {
446
+ code: "a",
447
+ name: "tool_result",
448
+ parse: (value) => {
449
+ 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.");
450
+ return {
451
+ type: "tool_result",
452
+ value
453
+ };
454
+ }
455
+ },
456
+ {
457
+ code: "b",
458
+ name: "tool_call_streaming_start",
459
+ parse: (value) => {
460
+ 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.");
461
+ return {
462
+ type: "tool_call_streaming_start",
463
+ value
464
+ };
465
+ }
466
+ },
467
+ {
468
+ code: "c",
469
+ name: "tool_call_delta",
470
+ parse: (value) => {
471
+ 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.");
472
+ return {
473
+ type: "tool_call_delta",
474
+ value
475
+ };
476
+ }
477
+ },
478
+ {
479
+ code: "d",
480
+ name: "finish_message",
481
+ parse: (value) => {
482
+ 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.");
483
+ const result = { finishReason: value.finishReason };
484
+ if ("usage" in value && value.usage != null && typeof value.usage === "object" && "promptTokens" in value.usage && "completionTokens" in value.usage) result.usage = {
485
+ promptTokens: typeof value.usage.promptTokens === "number" ? value.usage.promptTokens : NaN,
486
+ completionTokens: typeof value.usage.completionTokens === "number" ? value.usage.completionTokens : NaN
487
+ };
488
+ return {
489
+ type: "finish_message",
490
+ value: result
491
+ };
492
+ }
493
+ },
494
+ {
495
+ code: "e",
496
+ name: "finish_step",
497
+ parse: (value) => {
498
+ 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.");
499
+ const result = {
500
+ finishReason: value.finishReason,
501
+ isContinued: false
502
+ };
503
+ if ("usage" in value && value.usage != null && typeof value.usage === "object" && "promptTokens" in value.usage && "completionTokens" in value.usage) result.usage = {
504
+ promptTokens: typeof value.usage.promptTokens === "number" ? value.usage.promptTokens : NaN,
505
+ completionTokens: typeof value.usage.completionTokens === "number" ? value.usage.completionTokens : NaN
506
+ };
507
+ if ("isContinued" in value && typeof value.isContinued === "boolean") result.isContinued = value.isContinued;
508
+ return {
509
+ type: "finish_step",
510
+ value: result
511
+ };
512
+ }
513
+ },
514
+ {
515
+ code: "f",
516
+ name: "start_step",
517
+ parse: (value) => {
518
+ 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.");
519
+ return {
520
+ type: "start_step",
521
+ value: { messageId: value.messageId }
522
+ };
523
+ }
524
+ },
525
+ {
526
+ code: "g",
527
+ name: "reasoning",
528
+ parse: (value) => {
529
+ if (typeof value !== "string") throw new Error("\"reasoning\" parts expect a string value.");
530
+ return {
531
+ type: "reasoning",
532
+ value
533
+ };
534
+ }
535
+ },
536
+ {
537
+ code: "h",
538
+ name: "source",
539
+ parse: (value) => {
540
+ if (value == null || typeof value !== "object") throw new Error("\"source\" parts expect a Source object.");
541
+ return {
542
+ type: "source",
543
+ value
544
+ };
545
+ }
546
+ },
547
+ {
548
+ code: "i",
549
+ name: "redacted_reasoning",
550
+ parse: (value) => {
551
+ 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.");
552
+ return {
553
+ type: "redacted_reasoning",
554
+ value: { data: value.data }
555
+ };
556
+ }
557
+ },
558
+ {
559
+ code: "j",
560
+ name: "reasoning_signature",
561
+ parse: (value) => {
562
+ 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.");
563
+ return {
564
+ type: "reasoning_signature",
565
+ value: { signature: value.signature }
566
+ };
567
+ }
568
+ },
569
+ {
570
+ code: "k",
571
+ name: "file",
572
+ parse: (value) => {
573
+ 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.");
574
+ return {
575
+ type: "file",
576
+ value
577
+ };
578
+ }
579
+ }
580
+ ];
581
+ const dataStreamPartsByCode = Object.fromEntries(dataStreamParts.map((part) => [part.code, part]));
582
+ Object.fromEntries(dataStreamParts.map((part) => [part.name, part.code]));
583
+ const validCodes = dataStreamParts.map((part) => part.code);
584
+ /**
585
+ Parses a stream part from a string.
586
+
587
+ @param line The string to parse.
588
+ @returns The parsed stream part.
589
+ @throws An error if the string cannot be parsed.
590
+ */
591
+ const parseDataStreamPart = (line) => {
592
+ const firstSeparatorIndex = line.indexOf(":");
593
+ if (firstSeparatorIndex === -1) throw new Error("Failed to parse stream string. No separator found.");
594
+ const prefix = line.slice(0, firstSeparatorIndex);
595
+ if (!validCodes.includes(prefix)) throw new Error(`Failed to parse stream string. Invalid code ${prefix}.`);
596
+ const code = prefix;
597
+ const textValue = line.slice(firstSeparatorIndex + 1);
598
+ const jsonValue = JSON.parse(textValue);
599
+ return dataStreamPartsByCode[code].parse(jsonValue);
600
+ };
601
+ //#endregion
602
+ //#region src/utils/ai-sdk-v4/fix-json.ts
603
+ function fixJson(input) {
604
+ const stack = ["ROOT"];
605
+ let lastValidIndex = -1;
606
+ let literalStart = null;
607
+ function processValueStart(char, i, swapState) {
608
+ switch (char) {
609
+ case "\"":
610
+ lastValidIndex = i;
611
+ stack.pop();
612
+ stack.push(swapState);
613
+ stack.push("INSIDE_STRING");
614
+ break;
615
+ case "f":
616
+ case "t":
617
+ case "n":
618
+ lastValidIndex = i;
619
+ literalStart = i;
620
+ stack.pop();
621
+ stack.push(swapState);
622
+ stack.push("INSIDE_LITERAL");
623
+ break;
624
+ case "-":
625
+ stack.pop();
626
+ stack.push(swapState);
627
+ stack.push("INSIDE_NUMBER");
628
+ break;
629
+ case "0":
630
+ case "1":
631
+ case "2":
632
+ case "3":
633
+ case "4":
634
+ case "5":
635
+ case "6":
636
+ case "7":
637
+ case "8":
638
+ case "9":
639
+ lastValidIndex = i;
640
+ stack.pop();
641
+ stack.push(swapState);
642
+ stack.push("INSIDE_NUMBER");
643
+ break;
644
+ case "{":
645
+ lastValidIndex = i;
646
+ stack.pop();
647
+ stack.push(swapState);
648
+ stack.push("INSIDE_OBJECT_START");
649
+ break;
650
+ case "[":
651
+ lastValidIndex = i;
652
+ stack.pop();
653
+ stack.push(swapState);
654
+ stack.push("INSIDE_ARRAY_START");
655
+ break;
656
+ }
657
+ }
658
+ function processAfterObjectValue(char, i) {
659
+ switch (char) {
660
+ case ",":
661
+ stack.pop();
662
+ stack.push("INSIDE_OBJECT_AFTER_COMMA");
663
+ break;
664
+ case "}":
665
+ lastValidIndex = i;
666
+ stack.pop();
667
+ break;
668
+ }
669
+ }
670
+ function processAfterArrayValue(char, i) {
671
+ switch (char) {
672
+ case ",":
673
+ stack.pop();
674
+ stack.push("INSIDE_ARRAY_AFTER_COMMA");
675
+ break;
676
+ case "]":
677
+ lastValidIndex = i;
678
+ stack.pop();
679
+ break;
680
+ }
681
+ }
682
+ for (let i = 0; i < input.length; i++) {
683
+ const char = input[i];
684
+ switch (stack[stack.length - 1]) {
685
+ case "ROOT":
686
+ processValueStart(char, i, "FINISH");
687
+ break;
688
+ case "INSIDE_OBJECT_START":
689
+ switch (char) {
690
+ case "\"":
691
+ stack.pop();
692
+ stack.push("INSIDE_OBJECT_KEY");
693
+ break;
694
+ case "}":
695
+ lastValidIndex = i;
696
+ stack.pop();
697
+ break;
698
+ }
699
+ break;
700
+ case "INSIDE_OBJECT_AFTER_COMMA":
701
+ switch (char) {
702
+ case "\"":
703
+ stack.pop();
704
+ stack.push("INSIDE_OBJECT_KEY");
705
+ break;
706
+ }
707
+ break;
708
+ case "INSIDE_OBJECT_KEY":
709
+ switch (char) {
710
+ case "\"":
711
+ stack.pop();
712
+ stack.push("INSIDE_OBJECT_AFTER_KEY");
713
+ break;
714
+ }
715
+ break;
716
+ case "INSIDE_OBJECT_AFTER_KEY":
717
+ switch (char) {
718
+ case ":":
719
+ stack.pop();
720
+ stack.push("INSIDE_OBJECT_BEFORE_VALUE");
721
+ break;
722
+ }
723
+ break;
724
+ case "INSIDE_OBJECT_BEFORE_VALUE":
725
+ processValueStart(char, i, "INSIDE_OBJECT_AFTER_VALUE");
726
+ break;
727
+ case "INSIDE_OBJECT_AFTER_VALUE":
728
+ processAfterObjectValue(char, i);
729
+ break;
730
+ case "INSIDE_STRING":
731
+ switch (char) {
732
+ case "\"":
733
+ stack.pop();
734
+ lastValidIndex = i;
735
+ break;
736
+ case "\\":
737
+ stack.push("INSIDE_STRING_ESCAPE");
738
+ break;
739
+ default: lastValidIndex = i;
740
+ }
741
+ break;
742
+ case "INSIDE_ARRAY_START":
743
+ switch (char) {
744
+ case "]":
745
+ lastValidIndex = i;
746
+ stack.pop();
747
+ break;
748
+ default:
749
+ lastValidIndex = i;
750
+ processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
751
+ break;
752
+ }
753
+ break;
754
+ case "INSIDE_ARRAY_AFTER_VALUE":
755
+ switch (char) {
756
+ case ",":
757
+ stack.pop();
758
+ stack.push("INSIDE_ARRAY_AFTER_COMMA");
759
+ break;
760
+ case "]":
761
+ lastValidIndex = i;
762
+ stack.pop();
763
+ break;
764
+ default:
765
+ lastValidIndex = i;
766
+ break;
767
+ }
768
+ break;
769
+ case "INSIDE_ARRAY_AFTER_COMMA":
770
+ processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
771
+ break;
772
+ case "INSIDE_STRING_ESCAPE":
773
+ stack.pop();
774
+ lastValidIndex = i;
775
+ break;
776
+ case "INSIDE_NUMBER":
777
+ switch (char) {
778
+ case "0":
779
+ case "1":
780
+ case "2":
781
+ case "3":
782
+ case "4":
783
+ case "5":
784
+ case "6":
785
+ case "7":
786
+ case "8":
787
+ case "9":
788
+ lastValidIndex = i;
789
+ break;
790
+ case "e":
791
+ case "E":
792
+ case "-":
793
+ case ".": break;
794
+ case ",":
795
+ stack.pop();
796
+ if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
797
+ if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
798
+ break;
799
+ case "}":
800
+ stack.pop();
801
+ if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
802
+ break;
803
+ case "]":
804
+ stack.pop();
805
+ if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
806
+ break;
807
+ default:
808
+ stack.pop();
809
+ break;
810
+ }
811
+ break;
812
+ case "INSIDE_LITERAL": {
813
+ const partialLiteral = input.substring(literalStart, i + 1);
814
+ if (!"false".startsWith(partialLiteral) && !"true".startsWith(partialLiteral) && !"null".startsWith(partialLiteral)) {
815
+ stack.pop();
816
+ if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
817
+ else if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
818
+ } else lastValidIndex = i;
819
+ break;
820
+ }
821
+ }
822
+ }
823
+ let result = input.slice(0, lastValidIndex + 1);
824
+ for (let i = stack.length - 1; i >= 0; i--) switch (stack[i]) {
825
+ case "INSIDE_STRING":
826
+ result += "\"";
827
+ break;
828
+ case "INSIDE_OBJECT_KEY":
829
+ case "INSIDE_OBJECT_AFTER_KEY":
830
+ case "INSIDE_OBJECT_AFTER_COMMA":
831
+ case "INSIDE_OBJECT_START":
832
+ case "INSIDE_OBJECT_BEFORE_VALUE":
833
+ case "INSIDE_OBJECT_AFTER_VALUE":
834
+ result += "}";
835
+ break;
836
+ case "INSIDE_ARRAY_START":
837
+ case "INSIDE_ARRAY_AFTER_COMMA":
838
+ case "INSIDE_ARRAY_AFTER_VALUE":
839
+ result += "]";
840
+ break;
841
+ case "INSIDE_LITERAL": {
842
+ const partialLiteral = input.substring(literalStart, input.length);
843
+ if ("true".startsWith(partialLiteral)) result += "true".slice(partialLiteral.length);
844
+ else if ("false".startsWith(partialLiteral)) result += "false".slice(partialLiteral.length);
845
+ else if ("null".startsWith(partialLiteral)) result += "null".slice(partialLiteral.length);
846
+ }
847
+ }
848
+ return result;
849
+ }
850
+ //#endregion
851
+ //#region src/utils/ai-sdk-v4/parse-partial-json.ts
852
+ function tryParse(text) {
853
+ try {
854
+ return {
855
+ success: true,
856
+ value: JSON.parse(text)
857
+ };
858
+ } catch {
859
+ return { success: false };
860
+ }
861
+ }
862
+ function parsePartialJson(jsonText) {
863
+ if (jsonText === void 0) return {
864
+ value: void 0,
865
+ state: "undefined-input"
866
+ };
867
+ let result = tryParse(jsonText);
868
+ if (result.success) return {
869
+ value: result.value,
870
+ state: "successful-parse"
871
+ };
872
+ result = tryParse(fixJson(jsonText));
873
+ if (result.success) return {
874
+ value: result.value,
875
+ state: "repaired-parse"
876
+ };
877
+ return {
878
+ value: void 0,
879
+ state: "failed-parse"
880
+ };
881
+ }
882
+ //#endregion
883
+ //#region src/utils/ai-sdk-v4/process-data-stream.ts
884
+ const NEWLINE = "\n".charCodeAt(0);
885
+ function concatChunks(chunks, totalLength) {
886
+ const concatenatedChunks = new Uint8Array(totalLength);
887
+ let offset = 0;
888
+ for (const chunk of chunks) {
889
+ concatenatedChunks.set(chunk, offset);
890
+ offset += chunk.length;
891
+ }
892
+ chunks.length = 0;
893
+ return concatenatedChunks;
894
+ }
895
+ async function processDataStream({ stream, onTextPart, onReasoningPart, onReasoningSignaturePart, onRedactedReasoningPart, onSourcePart, onFilePart, onDataPart, onErrorPart, onToolCallStreamingStartPart, onToolCallDeltaPart, onToolCallPart, onToolResultPart, onMessageAnnotationsPart, onFinishMessagePart, onFinishStepPart, onStartStepPart }) {
896
+ const reader = stream.getReader();
897
+ const decoder = new TextDecoder();
898
+ const chunks = [];
899
+ let totalLength = 0;
900
+ while (true) {
901
+ const { value } = await reader.read();
902
+ if (value) {
903
+ chunks.push(value);
904
+ totalLength += value.length;
905
+ if (value[value.length - 1] !== NEWLINE) continue;
906
+ }
907
+ if (chunks.length === 0) break;
908
+ const concatenatedChunks = concatChunks(chunks, totalLength);
909
+ totalLength = 0;
910
+ const streamParts = decoder.decode(concatenatedChunks, { stream: true }).split("\n").filter((line) => line !== "").map(parseDataStreamPart);
911
+ for (const { type, value } of streamParts) switch (type) {
912
+ case "text":
913
+ await onTextPart?.(value);
914
+ break;
915
+ case "reasoning":
916
+ await onReasoningPart?.(value);
917
+ break;
918
+ case "reasoning_signature":
919
+ await onReasoningSignaturePart?.(value);
920
+ break;
921
+ case "redacted_reasoning":
922
+ await onRedactedReasoningPart?.(value);
923
+ break;
924
+ case "file":
925
+ await onFilePart?.(value);
926
+ break;
927
+ case "source":
928
+ await onSourcePart?.(value);
929
+ break;
930
+ case "data":
931
+ await onDataPart?.(value);
932
+ break;
933
+ case "error":
934
+ await onErrorPart?.(value);
935
+ break;
936
+ case "message_annotations":
937
+ await onMessageAnnotationsPart?.(value);
938
+ break;
939
+ case "tool_call_streaming_start":
940
+ await onToolCallStreamingStartPart?.(value);
941
+ break;
942
+ case "tool_call_delta":
943
+ await onToolCallDeltaPart?.(value);
944
+ break;
945
+ case "tool_call":
946
+ await onToolCallPart?.(value);
947
+ break;
948
+ case "tool_result":
949
+ await onToolResultPart?.(value);
950
+ break;
951
+ case "finish_message":
952
+ await onFinishMessagePart?.(value);
953
+ break;
954
+ case "finish_step":
955
+ await onFinishStepPart?.(value);
956
+ break;
957
+ case "start_step":
958
+ await onStartStepPart?.(value);
959
+ break;
960
+ default: throw new Error(`Unknown stream part type: ${type}`);
961
+ }
962
+ }
963
+ }
964
+ //#endregion
389
965
  //#region src/utils/client-tool-model-output.ts
390
966
  /**
391
967
  * Normalize modelOutput from toModelOutput() to the AI SDK V2 tool result
@@ -7851,11 +8427,21 @@ var MastraClient = class extends BaseResource {
7851
8427
  * Lists all datasets with optional pagination
7852
8428
  */
7853
8429
  listDatasets(params) {
8430
+ if (params?.datasetIds?.length === 0) return Promise.resolve({
8431
+ datasets: [],
8432
+ pagination: {
8433
+ total: 0,
8434
+ page: 0,
8435
+ perPage: false,
8436
+ hasMore: false
8437
+ }
8438
+ });
7854
8439
  const searchParams = new URLSearchParams();
7855
8440
  if (params?.page !== void 0) searchParams.set("page", String(params.page));
7856
8441
  if (params?.perPage !== void 0) searchParams.set("perPage", String(params.perPage));
7857
8442
  if (params?.targetType !== void 0) searchParams.set("targetType", params.targetType);
7858
8443
  for (const id of params?.targetIds ?? []) searchParams.append("targetIds", id);
8444
+ for (const id of params?.datasetIds ?? []) searchParams.append("datasetIds", id);
7859
8445
  if (params?.orderBy) {
7860
8446
  searchParams.set("orderBy[field]", params.orderBy.field);
7861
8447
  searchParams.set("orderBy[direction]", params.orderBy.direction);