@mastra/server 1.73.0-alpha.0 → 1.73.0

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 (39) hide show
  1. package/dist/{a2a-rSyYjbA3.cjs → a2a-B6oAqhYI.cjs} +2 -2
  2. package/dist/a2a-B6oAqhYI.cjs.map +1 -0
  3. package/dist/{a2a-Dyd6lbnr.js → a2a-CfJMDEvo.js} +2 -2
  4. package/dist/a2a-CfJMDEvo.js.map +1 -0
  5. package/dist/{api-schema-manifest-azbFW2gh.cjs → api-schema-manifest-Blh5-4VH.cjs} +2 -2
  6. package/dist/{api-schema-manifest-azbFW2gh.cjs.map → api-schema-manifest-Blh5-4VH.cjs.map} +1 -1
  7. package/dist/{api-schema-manifest-btfn_x2G.js → api-schema-manifest-BmraF-WX.js} +2 -2
  8. package/dist/{api-schema-manifest-btfn_x2G.js.map → api-schema-manifest-BmraF-WX.js.map} +1 -1
  9. package/dist/docs/SKILL.md +1 -1
  10. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  11. package/dist/{routes-BqoNkLiT.js → routes-Boe1UThy.js} +2 -2
  12. package/dist/{routes-BqoNkLiT.js.map → routes-Boe1UThy.js.map} +1 -1
  13. package/dist/{routes-BaQVELB2.cjs → routes-CcjyQojv.cjs} +2 -2
  14. package/dist/{routes-BaQVELB2.cjs.map → routes-CcjyQojv.cjs.map} +1 -1
  15. package/dist/schema-e0VHpMt0-BS9KHnuT.cjs.map +1 -1
  16. package/dist/schema-e0VHpMt0-CvPvLS06.js.map +1 -1
  17. package/dist/server/handlers/a2a.cjs +1 -1
  18. package/dist/server/handlers/a2a.d.ts.map +1 -1
  19. package/dist/server/handlers/a2a.js +1 -1
  20. package/dist/server/handlers/agent-controller.cjs +66 -23
  21. package/dist/server/handlers/agent-controller.cjs.map +1 -1
  22. package/dist/server/handlers/agent-controller.d.ts +14 -0
  23. package/dist/server/handlers/agent-controller.d.ts.map +1 -1
  24. package/dist/server/handlers/agent-controller.js +66 -23
  25. package/dist/server/handlers/agent-controller.js.map +1 -1
  26. package/dist/server/handlers/agents.cjs +69 -34
  27. package/dist/server/handlers/agents.cjs.map +1 -1
  28. package/dist/server/handlers/agents.d.ts.map +1 -1
  29. package/dist/server/handlers/agents.js +70 -35
  30. package/dist/server/handlers/agents.js.map +1 -1
  31. package/dist/server/handlers/system.cjs +1 -1
  32. package/dist/server/handlers/system.js +1 -1
  33. package/dist/server/handlers.cjs +1 -1
  34. package/dist/server/handlers.js +1 -1
  35. package/dist/server/server-adapter/index.cjs +1 -1
  36. package/dist/server/server-adapter/index.js +1 -1
  37. package/package.json +9 -9
  38. package/dist/a2a-Dyd6lbnr.js.map +0 -1
  39. package/dist/a2a-rSyYjbA3.cjs.map +0 -1
@@ -141,7 +141,7 @@ const toolApprovalBodySchema = z.object({
141
141
  requestContext: bodyRequestContextSchema
142
142
  });
143
143
  const toolSuspensionBodySchema = z.object({
144
- toolCallId: z.string(),
144
+ toolCallId: z.string().min(1),
145
145
  resumeData: z.unknown(),
146
146
  requestContext: bodyRequestContextSchema
147
147
  });
@@ -232,6 +232,15 @@ const createSessionResponseSchema = z.object({
232
232
  threadId: z.string().optional()
233
233
  });
234
234
  const ackResponseSchema = z.object({ ok: z.boolean() });
235
+ const toolCommandAckResponseSchema = z.object({
236
+ ok: z.boolean(),
237
+ reason: z.enum([
238
+ "not_pending",
239
+ "stale_tool_call",
240
+ "aborting",
241
+ "no_pending_suspension"
242
+ ]).optional()
243
+ });
235
244
  /**
236
245
  * Status-line relevant slice of the session's observational-memory progress.
237
246
  * Mirrors the TUI status line: `msg pending/threshold ↓removal` (the active
@@ -605,7 +614,7 @@ const AGENT_CONTROLLER_TOOL_APPROVAL_ROUTE = createRoute({
605
614
  pathParamSchema: sessionPathParams,
606
615
  queryParamSchema: sessionScopeQuerySchema,
607
616
  bodySchema: toolApprovalBodySchema,
608
- responseSchema: ackResponseSchema,
617
+ responseSchema: toolCommandAckResponseSchema,
609
618
  summary: "Respond to a controller tool approval",
610
619
  description: "Approves or declines a pending tool call surfaced by the session.",
611
620
  tags: ["AgentController"],
@@ -614,21 +623,36 @@ const AGENT_CONTROLLER_TOOL_APPROVAL_ROUTE = createRoute({
614
623
  handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, approved, requestContext }) => {
615
624
  try {
616
625
  const session = await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext);
617
- if ((toolCallId ? session.approval.isArmed({ toolCallId }) : session.approval.isArmed()) || !toolCallId) session.respondToToolApproval({
618
- toolCallId,
619
- decision: approved ? "approve" : "decline",
620
- requestContext
621
- });
622
- else ackBackgroundSessionWork({
623
- work: session.respondToPersistedToolApproval({
626
+ if ((toolCallId ? session.approval.isArmed({ toolCallId }) : session.approval.isArmed()) || !toolCallId) {
627
+ const result = session.respondToToolApproval({
624
628
  toolCallId,
625
- approved,
629
+ decision: approved ? "approve" : "decline",
626
630
  requestContext
627
- }),
628
- session,
629
- mastra,
630
- operation: "respondToPersistedToolApproval"
631
- });
631
+ });
632
+ if (!result.accepted) return {
633
+ ok: false,
634
+ reason: result.reason
635
+ };
636
+ } else {
637
+ if (!await session.hasPersistedToolApproval(toolCallId)) return {
638
+ ok: false,
639
+ reason: session.approval.isArmed() ? "stale_tool_call" : "not_pending"
640
+ };
641
+ if (!session.claimToolResponse(toolCallId)) return {
642
+ ok: false,
643
+ reason: "not_pending"
644
+ };
645
+ ackBackgroundSessionWork({
646
+ work: session.respondToPersistedToolApproval({
647
+ toolCallId,
648
+ approved,
649
+ requestContext
650
+ }).finally(() => session.releaseToolResponse(toolCallId)),
651
+ session,
652
+ mastra,
653
+ operation: "respondToPersistedToolApproval"
654
+ });
655
+ }
632
656
  return { ok: true };
633
657
  } catch (error) {
634
658
  return handleError(error, "error responding to controller tool approval");
@@ -642,7 +666,7 @@ const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({
642
666
  pathParamSchema: sessionPathParams,
643
667
  queryParamSchema: sessionScopeQuerySchema,
644
668
  bodySchema: toolSuspensionBodySchema,
645
- responseSchema: ackResponseSchema,
669
+ responseSchema: toolCommandAckResponseSchema,
646
670
  summary: "Respond to a suspended controller tool",
647
671
  description: "Resumes a suspended interactive tool (ask_user, request_access, submit_plan) with the provided resume data.",
648
672
  tags: ["AgentController"],
@@ -651,12 +675,18 @@ const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({
651
675
  handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {
652
676
  try {
653
677
  const session = await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext);
678
+ const claim = session.claimToolSuspension(toolCallId);
679
+ if (!claim.accepted) return {
680
+ ok: false,
681
+ reason: claim.reason
682
+ };
683
+ const claimedToolCallId = claim.toolCallId;
654
684
  ackBackgroundSessionWork({
655
685
  work: session.respondToToolSuspension({
656
686
  toolCallId,
657
687
  resumeData,
658
688
  requestContext
659
- }),
689
+ }).finally(() => session.releaseToolResponse(claimedToolCallId)),
660
690
  session,
661
691
  mastra,
662
692
  operation: "respondToToolSuspension"
@@ -762,7 +792,10 @@ const SWITCH_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({
762
792
  handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {
763
793
  try {
764
794
  const session = await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext);
765
- if (session.thread.getId() !== threadId) await session.thread.switch({ threadId });
795
+ if (session.thread.getId() !== threadId) await session.thread.switch({
796
+ threadId,
797
+ requestContext
798
+ });
766
799
  return { ok: true };
767
800
  } catch (error) {
768
801
  return handleError(error, "error switching controller thread");
@@ -972,7 +1005,7 @@ const SEND_AGENT_CONTROLLER_NOTIFICATION_ROUTE = createRoute({
972
1005
  coalesceKey,
973
1006
  attributes,
974
1007
  metadata
975
- });
1008
+ }, { requestContext });
976
1009
  return {
977
1010
  accepted: result.accepted !== void 0,
978
1011
  notificationId: result.record?.id,
@@ -999,7 +1032,10 @@ const CREATE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({
999
1032
  requiresPermission: "agent-controller:execute",
1000
1033
  handler: async ({ mastra, controllerId, resourceId, sessionScope, title, requestContext }) => {
1001
1034
  try {
1002
- const thread = await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).thread.create({ title });
1035
+ const thread = await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).thread.create({
1036
+ title,
1037
+ requestContext
1038
+ });
1003
1039
  return {
1004
1040
  id: thread.id,
1005
1041
  title: thread.title,
@@ -1026,7 +1062,10 @@ const DELETE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({
1026
1062
  requiresPermission: "agent-controller:execute",
1027
1063
  handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {
1028
1064
  try {
1029
- await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).thread.delete({ threadId });
1065
+ await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).thread.delete({
1066
+ threadId,
1067
+ requestContext
1068
+ });
1030
1069
  return { ok: true };
1031
1070
  } catch (error) {
1032
1071
  return handleError(error, "error deleting controller thread");
@@ -1049,7 +1088,10 @@ const RENAME_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({
1049
1088
  handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, title, requestContext }) => {
1050
1089
  try {
1051
1090
  const session = await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext);
1052
- if (session.thread.getId() !== threadId) await session.thread.switch({ threadId });
1091
+ if (session.thread.getId() !== threadId) await session.thread.switch({
1092
+ threadId,
1093
+ requestContext
1094
+ });
1053
1095
  await session.thread.rename({ title });
1054
1096
  return { ok: true };
1055
1097
  } catch (error) {
@@ -1074,7 +1116,8 @@ const CLONE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({
1074
1116
  try {
1075
1117
  const thread = await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).thread.clone({
1076
1118
  sourceThreadId,
1077
- title
1119
+ title,
1120
+ requestContext
1078
1121
  });
1079
1122
  return {
1080
1123
  id: thread.id,