@mastra/client-js 1.56.0 → 1.57.0-alpha.1

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 (36) hide show
  1. package/dist/client.d.ts +7 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/docs/SKILL.md +5 -3
  4. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  5. package/dist/docs/references/docs-connections-a2a.md +1 -1
  6. package/dist/docs/references/docs-harness-agent-controller.md +7 -7
  7. package/dist/docs/references/docs-harness-schedules.md +5 -5
  8. package/dist/docs/references/docs-server-mastra-client.md +1 -1
  9. package/dist/docs/references/docs-signals-notifications.md +233 -0
  10. package/dist/docs/references/docs-signals-sending-signals.md +166 -0
  11. package/dist/docs/references/docs-signals-thread-streams.md +94 -0
  12. package/dist/docs/references/docs-studio-editor.md +39 -23
  13. package/dist/docs/references/reference-client-js-agent-controller.md +2 -2
  14. package/dist/docs/references/reference-client-js-agents.md +18 -2
  15. package/dist/docs/references/reference-client-js-datasets.md +1 -1
  16. package/dist/docs/references/reference-client-js-observability.md +26 -1
  17. package/dist/docs/references/reference-observability-tracing-advanced-queries.md +92 -11
  18. package/dist/index.cjs +148 -22
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +148 -22
  23. package/dist/index.js.map +1 -1
  24. package/dist/resources/agent.d.ts +10 -3
  25. package/dist/resources/agent.d.ts.map +1 -1
  26. package/dist/resources/observability-route-types.d.ts +2 -0
  27. package/dist/resources/observability-route-types.d.ts.map +1 -1
  28. package/dist/resources/observability.d.ts +7 -1
  29. package/dist/resources/observability.d.ts.map +1 -1
  30. package/dist/route-types.generated.d.ts +437 -359
  31. package/dist/route-types.generated.d.ts.map +1 -1
  32. package/dist/utils/process-mastra-stream.d.ts.map +1 -1
  33. package/dist/utils/sse-event-splitter.d.ts +3 -0
  34. package/dist/utils/sse-event-splitter.d.ts.map +1 -0
  35. package/package.json +8 -8
  36. package/dist/docs/references/docs-harness-signals.md +0 -546
package/dist/index.d.ts CHANGED
@@ -11,6 +11,6 @@ export type { ObservabilityCollector } from './observability/types.js';
11
11
  export type { QuerySpansInput, QuerySpansResult, QueryTraceThreadsInput, QueryTraceThreadsResult, QueryTracesInput, QueryTracesDeltaInput, QueryTracesKeysetInput, QueryTracesPaginatedInput, } from './resources/observability.js';
12
12
  export type { UIMessageWithMetadata } from '@mastra/core/agent';
13
13
  export type { GetMetricTimeSeriesResponse } from './types.js';
14
- export type { AggregateTracesArgs, AggregateTracesResponse, TraceAggregateDiscovery, GetTraceQueryFieldsArgs, GetTraceQueryFieldsResponse, GetTraceQueryValuesArgs, GetTraceQueryValuesResponse, TraceQueryCanonicalFieldDescriptor, TraceQueryGroupResponse, TraceQueryKeysetTraceResponse, TraceQueryObservedFieldDescriptor, TraceQueryOperator, TraceQueryPredicateScope, TraceQueryResponse, TraceQueryTraceResponse, TraceQueryValueKind, } from './resources/observability-route-types.js';
14
+ export type { AggregateTracesArgs, AggregateTracesResponse, AggregateSpansArgs, AggregateSpansResponse, TraceAggregateDiscovery, GetTraceQueryFieldsArgs, GetTraceQueryFieldsResponse, GetTraceQueryValuesArgs, GetTraceQueryValuesResponse, TraceQueryCanonicalFieldDescriptor, TraceQueryGroupResponse, TraceQueryKeysetTraceResponse, TraceQueryObservedFieldDescriptor, TraceQueryOperator, TraceQueryPredicateScope, TraceQueryResponse, TraceQueryTraceResponse, TraceQueryValueKind, } from './resources/observability-route-types.js';
15
15
  export type { Body, Client, ClientMethod, ClientPath, ClientRequest, ClientResponse, ClientResponseKind, ClientRoute, PathParams, QueryParams, RouteKey, RouteRequest, RouteResponse, RouteResponseType, RouteTypes, } from './route-types.generated.js';
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,kCAAkC,EAClC,wBAAwB,EACxB,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AACvG,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,sCAAsC,EACtC,2BAA2B,EAC3B,UAAU,EACV,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,kCAAkC,EAClC,uBAAuB,EACvB,6BAA6B,EAC7B,iCAAiC,EACjC,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,UAAU,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,UAAU,GACX,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,kCAAkC,EAClC,wBAAwB,EACxB,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AACvG,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,sCAAsC,EACtC,2BAA2B,EAC3B,UAAU,EACV,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,kCAAkC,EAClC,uBAAuB,EACvB,6BAA6B,EAC7B,iCAAiC,EACjC,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,UAAU,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,UAAU,GACX,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -1056,11 +1056,51 @@ function processClientTools(clientTools) {
1056
1056
  }));
1057
1057
  }
1058
1058
  //#endregion
1059
+ //#region src/utils/sse-event-splitter.ts
1060
+ /** Split SSE events without rescanning or copying an unfinished event on each read. */
1061
+ function createSseEventSplitter() {
1062
+ let parts = [];
1063
+ let pendingNewline = false;
1064
+ return (text, isFinal = false) => {
1065
+ const events = [];
1066
+ let start = 0;
1067
+ if (text) {
1068
+ if (pendingNewline) {
1069
+ if (text.startsWith("\n")) {
1070
+ events.push(parts.join(""));
1071
+ parts = [];
1072
+ start = 1;
1073
+ } else parts.push("\n");
1074
+ pendingNewline = false;
1075
+ }
1076
+ let separator;
1077
+ while ((separator = text.indexOf("\n\n", start)) !== -1) {
1078
+ parts.push(text.slice(start, separator));
1079
+ events.push(parts.join(""));
1080
+ parts = [];
1081
+ start = separator + 2;
1082
+ }
1083
+ if (start < text.length) {
1084
+ pendingNewline = text.endsWith("\n");
1085
+ const end = pendingNewline ? text.length - 1 : text.length;
1086
+ if (start < end) parts.push(text.slice(start, end));
1087
+ }
1088
+ }
1089
+ if (isFinal) {
1090
+ if (pendingNewline) parts.push("\n");
1091
+ events.push(parts.join(""));
1092
+ parts = [];
1093
+ pendingNewline = false;
1094
+ }
1095
+ return events;
1096
+ };
1097
+ }
1098
+ //#endregion
1059
1099
  //#region src/utils/process-mastra-stream.ts
1060
1100
  async function sharedProcessMastraStream({ stream, onChunk, signal }) {
1061
1101
  const reader = stream.getReader();
1062
1102
  const decoder = new TextDecoder();
1063
- let buffer = "";
1103
+ const splitEvents = createSseEventSplitter();
1064
1104
  const abort = () => void reader.cancel();
1065
1105
  if (signal?.aborted) abort();
1066
1106
  else signal?.addEventListener("abort", abort, { once: true });
@@ -1068,9 +1108,7 @@ async function sharedProcessMastraStream({ stream, onChunk, signal }) {
1068
1108
  while (true) {
1069
1109
  const { done, value } = await reader.read();
1070
1110
  if (done) break;
1071
- buffer += decoder.decode(value, { stream: true });
1072
- const lines = buffer.split("\n\n");
1073
- buffer = lines.pop() || "";
1111
+ const lines = splitEvents(decoder.decode(value, { stream: true }));
1074
1112
  for (const line of lines) if (line.startsWith("data: ")) {
1075
1113
  const data = line.slice(6);
1076
1114
  if (data === "[DONE]") return;
@@ -1870,10 +1908,18 @@ var Agent = class extends BaseResource {
1870
1908
  };
1871
1909
  return streamResponse;
1872
1910
  }
1873
- async abortThread(params) {
1911
+ /** Stops execution of a run, including runs without a memory thread. */
1912
+ async abortRun(runId, options) {
1913
+ return this.request(`/agents/${this.agentId}/runs/${encodeURIComponent(runId)}/abort`, {
1914
+ method: "POST",
1915
+ signal: options?.signal
1916
+ });
1917
+ }
1918
+ async abortThread(params, options) {
1874
1919
  const { resourceId, threadId, clearPendingSignals, expectedRunId } = params;
1875
1920
  return this.request(`/agents/${this.agentId}/threads/abort`, {
1876
1921
  method: "POST",
1922
+ signal: options?.signal,
1877
1923
  body: {
1878
1924
  resourceId,
1879
1925
  threadId,
@@ -2607,10 +2653,11 @@ var Agent = class extends BaseResource {
2607
2653
  }
2608
2654
  /**
2609
2655
  * Creates the consumer-facing stream for the streaming methods. Cancelling the
2610
- * returned stream (or aborting `externalSignal`) aborts the underlying request
2611
- * and stops any client-tool continuations.
2656
+ * returned stream or the client-wide signal detaches the HTTP observer and
2657
+ * stops any client-tool continuations. Per-call execution cancellation is
2658
+ * handled separately by processStreamResponse.
2612
2659
  */
2613
- createCancellableStream(externalSignal) {
2660
+ createCancellableStream() {
2614
2661
  const abortController = new AbortController();
2615
2662
  let readableController;
2616
2663
  return {
@@ -2623,10 +2670,63 @@ var Agent = class extends BaseResource {
2623
2670
  }
2624
2671
  }),
2625
2672
  controller: readableController,
2626
- signal: mergeAbortSignals(abortController.signal, externalSignal, this.options.abortSignal)
2673
+ signal: mergeAbortSignals(abortController.signal, this.options.abortSignal)
2627
2674
  };
2628
2675
  }
2629
2676
  async processStreamResponse(processedParams, controller, route = "stream", signal) {
2677
+ const suppliedRunId = processedParams.runId;
2678
+ processedParams = {
2679
+ ...processedParams,
2680
+ runId: processedParams.runId ?? v4()
2681
+ };
2682
+ const callerSignal = processedParams.abortSignal;
2683
+ callerSignal?.throwIfAborted();
2684
+ const transportAbort = new AbortController();
2685
+ const cancellationAbort = new AbortController();
2686
+ const detachSignal = signal;
2687
+ signal = mergeAbortSignals(detachSignal, transportAbort.signal);
2688
+ let cancellationTimer;
2689
+ const stopCancellation = () => cancellationAbort.abort();
2690
+ const cancelExecution = () => {
2691
+ cancellationTimer = setTimeout(() => cancellationAbort.abort(/* @__PURE__ */ new Error("Agent run cancellation was not acknowledged")), 1e4);
2692
+ (async () => {
2693
+ try {
2694
+ while (true) {
2695
+ cancellationAbort.signal.throwIfAborted();
2696
+ if ((await this.abortRun(processedParams.runId, { signal: cancellationAbort.signal })).aborted) return;
2697
+ await new Promise((resolve, reject) => {
2698
+ const onAbort = () => {
2699
+ clearTimeout(timer);
2700
+ reject(cancellationAbort.signal.reason);
2701
+ };
2702
+ const timer = setTimeout(() => {
2703
+ cancellationAbort.signal.removeEventListener("abort", onAbort);
2704
+ resolve();
2705
+ }, 100);
2706
+ cancellationAbort.signal.addEventListener("abort", onAbort, { once: true });
2707
+ if (cancellationAbort.signal.aborted) onAbort();
2708
+ });
2709
+ }
2710
+ } catch (error) {
2711
+ if (!cancellationAbort.signal.aborted && !(error instanceof Error && "status" in error && (error.status === 404 || error.status === 501))) try {
2712
+ controller.error(error);
2713
+ } catch {}
2714
+ } finally {
2715
+ clearTimeout(cancellationTimer);
2716
+ transportAbort.abort(callerSignal?.reason);
2717
+ }
2718
+ })();
2719
+ };
2720
+ const cleanupCancellation = () => {
2721
+ callerSignal?.removeEventListener("abort", cancelExecution);
2722
+ detachSignal?.removeEventListener("abort", stopCancellation);
2723
+ clearTimeout(cancellationTimer);
2724
+ stopCancellation();
2725
+ };
2726
+ detachSignal?.addEventListener("abort", stopCancellation, { once: true });
2727
+ if (detachSignal?.aborted) stopCancellation();
2728
+ callerSignal?.addEventListener("abort", cancelExecution, { once: true });
2729
+ if (callerSignal?.aborted) cancelExecution();
2630
2730
  const { memory } = processedParams ?? {};
2631
2731
  const { resource, thread } = memory ?? {};
2632
2732
  const threadId = processedParams.threadId ?? (typeof thread === "string" ? thread : thread?.id);
@@ -2643,9 +2743,15 @@ var Agent = class extends BaseResource {
2643
2743
  body: requestBody,
2644
2744
  stream: true,
2645
2745
  signal
2746
+ }).catch((error) => {
2747
+ cleanupCancellation();
2748
+ throw error;
2646
2749
  });
2647
- if (!response.body) throw new Error("No response body");
2648
- const isAborted = () => Boolean(signal?.aborted);
2750
+ if (!response.body) {
2751
+ cleanupCancellation();
2752
+ throw new Error("No response body");
2753
+ }
2754
+ const isAborted = () => Boolean(signal?.aborted || callerSignal?.aborted);
2649
2755
  const isAbortError = (error) => isAborted() || error?.name === "AbortError";
2650
2756
  const safeClose = () => {
2651
2757
  try {
@@ -2658,18 +2764,16 @@ var Agent = class extends BaseResource {
2658
2764
  };
2659
2765
  try {
2660
2766
  let messages = [];
2661
- let streamRunId = processedParams.runId;
2767
+ let streamRunId = suppliedRunId;
2662
2768
  let finishedHistory;
2663
2769
  let suspended = false;
2664
2770
  const resumedToolCallIds = /* @__PURE__ */ new Set();
2665
2771
  const releaseOpenStream = streamRunId ? this.trackOpenStream(streamRunId) : () => {};
2666
2772
  const [streamForController, streamForProcessing] = response.body.tee();
2667
2773
  const decoder = new TextDecoder();
2668
- let pendingText = "";
2774
+ const splitEvents = createSseEventSplitter();
2669
2775
  const enqueueReadableText = (text, isFinal = false) => {
2670
- pendingText += text;
2671
- const lines = pendingText.split("\n\n");
2672
- pendingText = isFinal ? "" : lines.pop() ?? "";
2776
+ const lines = splitEvents(text, isFinal);
2673
2777
  for (const line of lines) {
2674
2778
  if (!line.startsWith("data: ") || !line.includes("\"type\":\"finish\"")) continue;
2675
2779
  try {
@@ -2775,6 +2879,7 @@ var Agent = class extends BaseResource {
2775
2879
  payload: {
2776
2880
  toolCallId: toolCall.toolCallId,
2777
2881
  toolName: toolCall.toolName,
2882
+ args: toolCall.args,
2778
2883
  result,
2779
2884
  isError: false,
2780
2885
  providerExecuted: false
@@ -2875,10 +2980,12 @@ var Agent = class extends BaseResource {
2875
2980
  } catch {}
2876
2981
  safeClose();
2877
2982
  }).finally(() => {
2983
+ cleanupCancellation();
2878
2984
  signal?.removeEventListener("abort", onAbort);
2879
2985
  releaseOpenStream();
2880
2986
  });
2881
2987
  } catch (error) {
2988
+ cleanupCancellation();
2882
2989
  if (!isAbortError(error)) console.error("Error processing stream response:", error);
2883
2990
  }
2884
2991
  return response;
@@ -2976,7 +3083,7 @@ var Agent = class extends BaseResource {
2976
3083
  clientTools: processClientTools(params.clientToolsResolver?.() ?? params.clientTools),
2977
3084
  structuredOutput
2978
3085
  };
2979
- const { readable, controller: readableController, signal } = this.createCancellableStream(params.abortSignal);
3086
+ const { readable, controller: readableController, signal } = this.createCancellableStream();
2980
3087
  const response = await this.processStreamResponse(processedParams, readableController, "stream", signal);
2981
3088
  const streamResponse = new Response(readable, {
2982
3089
  status: response.status,
@@ -3007,7 +3114,7 @@ var Agent = class extends BaseResource {
3007
3114
  clientTools: processClientTools(params.clientToolsResolver?.() ?? params.clientTools),
3008
3115
  structuredOutput
3009
3116
  };
3010
- const { readable, controller: readableController, signal } = this.createCancellableStream(params.abortSignal);
3117
+ const { readable, controller: readableController, signal } = this.createCancellableStream();
3011
3118
  const response = await this.processStreamResponse(processedParams, readableController, "stream-until-idle", signal);
3012
3119
  const streamResponse = new Response(readable, {
3013
3120
  status: response.status,
@@ -3051,7 +3158,7 @@ var Agent = class extends BaseResource {
3051
3158
  requestContext: parseClientRequestContext(requestContext),
3052
3159
  clientTools: processClientTools(executableClientTools)
3053
3160
  };
3054
- const { readable, controller: readableController, signal } = this.createCancellableStream(params.abortSignal);
3161
+ const { readable, controller: readableController, signal } = this.createCancellableStream();
3055
3162
  const response = await this.processStreamResponse(processedParams, readableController, "approve-tool-call", signal).catch((error) => {
3056
3163
  releaseHold({ force: true });
3057
3164
  throw error;
@@ -3088,7 +3195,7 @@ var Agent = class extends BaseResource {
3088
3195
  requestContext: parseClientRequestContext(requestContext),
3089
3196
  clientTools: processClientTools(executableClientTools)
3090
3197
  };
3091
- const { readable, controller: readableController, signal } = this.createCancellableStream(params.abortSignal);
3198
+ const { readable, controller: readableController, signal } = this.createCancellableStream();
3092
3199
  const response = await this.processStreamResponse(processedParams, readableController, "decline-tool-call", signal).catch((error) => {
3093
3200
  releaseHold({ force: true });
3094
3201
  throw error;
@@ -3164,7 +3271,7 @@ var Agent = class extends BaseResource {
3164
3271
  schema: standardSchemaToJSONSchema(toStandardSchema(options.structuredOutput.schema))
3165
3272
  } : void 0
3166
3273
  };
3167
- const { readable, controller: readableController, signal } = this.createCancellableStream(options.abortSignal);
3274
+ const { readable, controller: readableController, signal } = this.createCancellableStream();
3168
3275
  const response = await this.processStreamResponse(processedParams, readableController, "resume-stream", signal).catch((error) => {
3169
3276
  releaseHold({ force: true });
3170
3277
  throw error;
@@ -3233,7 +3340,7 @@ var Agent = class extends BaseResource {
3233
3340
  schema: standardSchemaToJSONSchema(toStandardSchema(options.structuredOutput.schema))
3234
3341
  } : void 0
3235
3342
  };
3236
- const { readable, controller: readableController, signal } = this.createCancellableStream(options.abortSignal);
3343
+ const { readable, controller: readableController, signal } = this.createCancellableStream();
3237
3344
  const response = await this.processStreamResponse(processedParams, readableController, "resume-stream-until-idle", signal).catch((error) => {
3238
3345
  releaseHold({ force: true });
3239
3346
  throw error;
@@ -5266,6 +5373,17 @@ var Observability = class extends BaseResource {
5266
5373
  body: params
5267
5374
  });
5268
5375
  }
5376
+ /**
5377
+ * Groups and measures individual completed spans selected by a time range and optional span-query predicate.
5378
+ * Token and cost measures count usage recorded on each span itself. Check `capabilities.spanAggregate` from
5379
+ * `getObservabilityCapabilities()` first; servers without it return 404 or 501.
5380
+ */
5381
+ aggregateSpans(params) {
5382
+ return this.request("/observability/spans/aggregate", {
5383
+ method: "POST",
5384
+ body: params
5385
+ });
5386
+ }
5269
5387
  /** Returns canonical and observed fields available to the advanced trace-query grammar. */
5270
5388
  getTraceQueryFields(params, options) {
5271
5389
  return this.request("/observability/traces/query/fields", {
@@ -8130,6 +8248,14 @@ var MastraClient = class extends BaseResource {
8130
8248
  aggregateTraces(params) {
8131
8249
  return this.observability.aggregateTraces(params);
8132
8250
  }
8251
+ /**
8252
+ * Groups and measures individual completed spans selected by a time range and optional span-query predicate.
8253
+ * Token and cost measures count usage recorded on each span itself. Check `capabilities.spanAggregate` from
8254
+ * `getObservabilityCapabilities()` first; servers without it return 404 or 501.
8255
+ */
8256
+ aggregateSpans(params) {
8257
+ return this.observability.aggregateSpans(params);
8258
+ }
8133
8259
  /** Returns canonical and observed fields available to the advanced trace-query grammar. */
8134
8260
  getTraceQueryFields(params, options) {
8135
8261
  return this.observability.getTraceQueryFields(params, options);