@mastra/client-js 1.56.0-alpha.6 → 1.56.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { v4 } from "@lukeed/uuid";
2
2
  import { getErrorFromUnknown } from "@mastra/core/error";
3
- import { standardSchemaToJSONSchema, toStandardSchema } from "@mastra/schema-compat/schema";
4
3
  import { RequestContext, RequestContext as RequestContext$1 } from "@mastra/core/request-context";
4
+ import { standardSchemaToJSONSchema, toStandardSchema } from "@mastra/schema-compat/schema";
5
5
  import { zodToJsonSchema } from "@mastra/schema-compat/zod-to-json";
6
6
  import { MastraA2AError } from "@mastra/core/a2a/client";
7
7
  import { AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigsRequest, ListTaskPushNotificationConfigsResponse, ListTasksRequest, ListTasksResponse, SendMessageRequest, SendMessageResponse, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from "@mastra/core/a2a/v1";
@@ -2620,6 +2620,7 @@ var Agent = class extends BaseResource {
2620
2620
  try {
2621
2621
  let messages = [];
2622
2622
  let streamRunId = processedParams.runId;
2623
+ let finishedHistory;
2623
2624
  const [streamForController, streamForProcessing] = response.body.tee();
2624
2625
  const decoder = new TextDecoder();
2625
2626
  let pendingText = "";
@@ -2627,6 +2628,13 @@ var Agent = class extends BaseResource {
2627
2628
  pendingText += text;
2628
2629
  const lines = pendingText.split("\n\n");
2629
2630
  pendingText = isFinal ? "" : lines.pop() ?? "";
2631
+ for (const line of lines) {
2632
+ if (!line.startsWith("data: ") || !line.includes("\"type\":\"finish\"")) continue;
2633
+ try {
2634
+ const all = JSON.parse(line.slice(6))?.payload?.messages?.all;
2635
+ if (Array.isArray(all)) finishedHistory = all;
2636
+ } catch {}
2637
+ }
2630
2638
  const readableLines = lines.filter((line) => line.trim() !== "[DONE]" && line.trim() !== "data: [DONE]").join("\n\n");
2631
2639
  if (readableLines) safeEnqueue(new TextEncoder().encode(`${readableLines}\n\n`));
2632
2640
  };
@@ -2780,12 +2788,12 @@ var Agent = class extends BaseResource {
2780
2788
  role: "tool",
2781
2789
  content: toolResultContents
2782
2790
  };
2783
- const updatedMessages = threadId ? [toolResultMessage] : [
2791
+ const updatedMessages = threadId ? [toolResultMessage] : (route === "resume-stream" || route === "approve-tool-call" || route === "decline-tool-call") && finishedHistory ? [...finishedHistory, toolResultMessage] : [
2784
2792
  ...Array.isArray(processedParams.messages) ? processedParams.messages : [],
2785
2793
  ...messages,
2786
2794
  toolResultMessage
2787
2795
  ];
2788
- const recursionRoute = route === "resume-stream" ? "stream" : route === "resume-stream-until-idle" ? "stream-until-idle" : route;
2796
+ const recursionRoute = route === "resume-stream" || route === "approve-tool-call" || route === "decline-tool-call" ? "stream" : route === "resume-stream-until-idle" ? "stream-until-idle" : route;
2789
2797
  if (isAborted()) return;
2790
2798
  try {
2791
2799
  await this.processStreamResponse({
@@ -2986,7 +2994,8 @@ var Agent = class extends BaseResource {
2986
2994
  const { requestContext, ...rest } = params;
2987
2995
  const processedParams = {
2988
2996
  ...rest,
2989
- requestContext: parseClientRequestContext(requestContext)
2997
+ requestContext: parseClientRequestContext(requestContext),
2998
+ clientTools: processClientTools(params.clientToolsResolver?.() ?? params.clientTools)
2990
2999
  };
2991
3000
  const { readable, controller: readableController, signal } = this.createCancellableStream(params.abortSignal);
2992
3001
  const response = await this.processStreamResponse(processedParams, readableController, "approve-tool-call", signal);
@@ -3017,7 +3026,8 @@ var Agent = class extends BaseResource {
3017
3026
  const { requestContext, ...rest } = params;
3018
3027
  const processedParams = {
3019
3028
  ...rest,
3020
- requestContext: parseClientRequestContext(requestContext)
3029
+ requestContext: parseClientRequestContext(requestContext),
3030
+ clientTools: processClientTools(params.clientToolsResolver?.() ?? params.clientTools)
3021
3031
  };
3022
3032
  const { readable, controller: readableController, signal } = this.createCancellableStream(params.abortSignal);
3023
3033
  const response = await this.processStreamResponse(processedParams, readableController, "decline-tool-call", signal);
@@ -3174,28 +3184,70 @@ var Agent = class extends BaseResource {
3174
3184
  * Used when `requireToolApproval` is enabled with generate() to allow the agent to proceed.
3175
3185
  */
3176
3186
  async approveToolCallGenerate(params) {
3177
- const { requestContext, ...rest } = params;
3178
- return this.request(`/agents/${this.agentId}/approve-tool-call-generate`, {
3187
+ const { requestContext, clientTools, clientToolsResolver, memory, ...rest } = params;
3188
+ const response = await this.request(`/agents/${this.agentId}/approve-tool-call-generate`, {
3179
3189
  method: "POST",
3180
3190
  body: {
3181
3191
  ...rest,
3182
- requestContext: parseClientRequestContext(requestContext)
3192
+ requestContext: parseClientRequestContext(requestContext),
3193
+ clientTools: processClientTools(clientToolsResolver?.() ?? clientTools)
3183
3194
  }
3184
3195
  });
3196
+ return this.continueResumedGenerate(response, {
3197
+ requestContext,
3198
+ clientTools,
3199
+ clientToolsResolver,
3200
+ memory
3201
+ });
3185
3202
  }
3186
3203
  /**
3187
3204
  * Declines a pending tool call and returns the complete response (non-streaming).
3188
3205
  * Used when `requireToolApproval` is enabled with generate() to prevent tool execution.
3189
3206
  */
3190
3207
  async declineToolCallGenerate(params) {
3191
- const { requestContext, ...rest } = params;
3192
- return this.request(`/agents/${this.agentId}/decline-tool-call-generate`, {
3208
+ const { requestContext, clientTools, clientToolsResolver, memory, ...rest } = params;
3209
+ const response = await this.request(`/agents/${this.agentId}/decline-tool-call-generate`, {
3193
3210
  method: "POST",
3194
3211
  body: {
3195
3212
  ...rest,
3196
- requestContext: parseClientRequestContext(requestContext)
3213
+ requestContext: parseClientRequestContext(requestContext),
3214
+ clientTools: processClientTools(clientToolsResolver?.() ?? clientTools)
3197
3215
  }
3198
3216
  });
3217
+ return this.continueResumedGenerate(response, {
3218
+ requestContext,
3219
+ clientTools,
3220
+ clientToolsResolver,
3221
+ memory
3222
+ });
3223
+ }
3224
+ /**
3225
+ * Runs executable client tools the model called after an approval decision and continues on
3226
+ * /generate, like generate() does. With memory the continuation sends only the new messages to the
3227
+ * thread. Without memory it re-sends the conversation up to the last user turn, because the resume
3228
+ * routes keep the earlier history server-side and drop it once the run finishes.
3229
+ */
3230
+ async continueResumedGenerate(response, { requestContext, clientTools, clientToolsResolver, memory }) {
3231
+ if (response.finishReason !== "tool-calls") return response;
3232
+ const context = requestContext === void 0 || requestContext instanceof RequestContext$1 ? requestContext : new RequestContext$1(Object.entries(requestContext));
3233
+ const threadId = typeof memory?.thread === "string" ? memory.thread : memory?.thread?.id;
3234
+ const history = response.messages ?? [];
3235
+ const priorTurns = history.slice(0, history.findLastIndex((message) => message.role === "user") + 1);
3236
+ return executeToolCallAndRespond({
3237
+ response,
3238
+ params: {
3239
+ messages: threadId ? [] : priorTurns,
3240
+ clientTools: clientToolsResolver?.() ?? clientTools,
3241
+ clientToolsResolver,
3242
+ requestContext: context,
3243
+ memory
3244
+ },
3245
+ agentId: this.agentId,
3246
+ resourceId: memory?.resource,
3247
+ threadId,
3248
+ requestContext: context,
3249
+ respondFn: (messages, options) => this.generate(messages, options)
3250
+ });
3199
3251
  }
3200
3252
  /**
3201
3253
  * Processes the stream response and handles tool calls