@mastra/server 1.38.0-alpha.3 → 1.38.0-alpha.5

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 (180) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/dist/{api-schema-manifest-DV7H6SLV.cjs → api-schema-manifest-M5LNZB6W.cjs} +4 -4
  3. package/dist/{api-schema-manifest-DV7H6SLV.cjs.map → api-schema-manifest-M5LNZB6W.cjs.map} +1 -1
  4. package/dist/{api-schema-manifest-2HZM3JT7.js → api-schema-manifest-OSBQZE4D.js} +3 -3
  5. package/dist/{api-schema-manifest-2HZM3JT7.js.map → api-schema-manifest-OSBQZE4D.js.map} +1 -1
  6. package/dist/{chunk-FYMY45UE.cjs → chunk-2XLWAZII.cjs} +15 -15
  7. package/dist/{chunk-FYMY45UE.cjs.map → chunk-2XLWAZII.cjs.map} +1 -1
  8. package/dist/{chunk-VJHJY3AS.js → chunk-3NQHD75J.js} +136 -32
  9. package/dist/chunk-3NQHD75J.js.map +1 -0
  10. package/dist/{chunk-E7UDPLDF.cjs → chunk-3QTG4V4W.cjs} +10 -2
  11. package/dist/chunk-3QTG4V4W.cjs.map +1 -0
  12. package/dist/{chunk-YUTVYY3X.js → chunk-5FPJ4RT4.js} +3 -3
  13. package/dist/{chunk-YUTVYY3X.js.map → chunk-5FPJ4RT4.js.map} +1 -1
  14. package/dist/{chunk-R6CMAAEQ.js → chunk-5PCUNLFX.js} +3 -3
  15. package/dist/{chunk-R6CMAAEQ.js.map → chunk-5PCUNLFX.js.map} +1 -1
  16. package/dist/{chunk-3SSPJA4Y.js → chunk-5RHJCZ4D.js} +3 -3
  17. package/dist/{chunk-3SSPJA4Y.js.map → chunk-5RHJCZ4D.js.map} +1 -1
  18. package/dist/{chunk-VI7ODS36.js → chunk-6E5HDZRB.js} +3 -3
  19. package/dist/{chunk-VI7ODS36.js.map → chunk-6E5HDZRB.js.map} +1 -1
  20. package/dist/{chunk-X5NKEO7W.cjs → chunk-6YVC5NUR.cjs} +5 -5
  21. package/dist/{chunk-X5NKEO7W.cjs.map → chunk-6YVC5NUR.cjs.map} +1 -1
  22. package/dist/{chunk-4PB6LUYQ.js → chunk-7ZW76TJN.js} +10 -3
  23. package/dist/chunk-7ZW76TJN.js.map +1 -0
  24. package/dist/{chunk-FLBKRRNC.js → chunk-AAU6UVJA.js} +4 -4
  25. package/dist/{chunk-FLBKRRNC.js.map → chunk-AAU6UVJA.js.map} +1 -1
  26. package/dist/{chunk-YF6SK4WY.cjs → chunk-AFNQIYGU.cjs} +149 -44
  27. package/dist/chunk-AFNQIYGU.cjs.map +1 -0
  28. package/dist/{chunk-FIHBL47F.cjs → chunk-AWWFF4BH.cjs} +7 -7
  29. package/dist/{chunk-FIHBL47F.cjs.map → chunk-AWWFF4BH.cjs.map} +1 -1
  30. package/dist/{chunk-QBMOXGFZ.js → chunk-B7BEYL4D.js} +17 -5
  31. package/dist/chunk-B7BEYL4D.js.map +1 -0
  32. package/dist/chunk-BCOYXSY2.cjs +658 -0
  33. package/dist/chunk-BCOYXSY2.cjs.map +1 -0
  34. package/dist/{chunk-ICYY6O53.cjs → chunk-ESWNWJOF.cjs} +4 -4
  35. package/dist/{chunk-ICYY6O53.cjs.map → chunk-ESWNWJOF.cjs.map} +1 -1
  36. package/dist/chunk-EUFT3MIX.js +213 -0
  37. package/dist/chunk-EUFT3MIX.js.map +1 -0
  38. package/dist/{chunk-N42WTSJL.cjs → chunk-GTF3WRLL.cjs} +151 -140
  39. package/dist/chunk-GTF3WRLL.cjs.map +1 -0
  40. package/dist/chunk-H7KDCXLQ.cjs +243 -0
  41. package/dist/chunk-H7KDCXLQ.cjs.map +1 -0
  42. package/dist/{chunk-TDAAXXUA.cjs → chunk-HGN36EQS.cjs} +109 -97
  43. package/dist/chunk-HGN36EQS.cjs.map +1 -0
  44. package/dist/{chunk-NTXMKBCU.js → chunk-HRMRQFJW.js} +3 -3
  45. package/dist/{chunk-NTXMKBCU.js.map → chunk-HRMRQFJW.js.map} +1 -1
  46. package/dist/{chunk-FQIFYDKU.js → chunk-IKDK3Q2A.js} +8 -5
  47. package/dist/chunk-IKDK3Q2A.js.map +1 -0
  48. package/dist/{chunk-2WUP6QIZ.cjs → chunk-IZZRKJQK.cjs} +5 -5
  49. package/dist/{chunk-2WUP6QIZ.cjs.map → chunk-IZZRKJQK.cjs.map} +1 -1
  50. package/dist/{chunk-PN3LDOLZ.js → chunk-J6OD53OV.js} +17 -3
  51. package/dist/chunk-J6OD53OV.js.map +1 -0
  52. package/dist/{chunk-GII2QWIN.cjs → chunk-JS263Z2W.cjs} +17 -17
  53. package/dist/{chunk-GII2QWIN.cjs.map → chunk-JS263Z2W.cjs.map} +1 -1
  54. package/dist/{chunk-6GNMUI4P.js → chunk-L5NNYUOJ.js} +3 -3
  55. package/dist/{chunk-6GNMUI4P.js.map → chunk-L5NNYUOJ.js.map} +1 -1
  56. package/dist/{chunk-HNPFUM7G.js → chunk-LW3QBZHN.js} +29 -18
  57. package/dist/chunk-LW3QBZHN.js.map +1 -0
  58. package/dist/{chunk-3E2YDRGM.js → chunk-M7HLT2GO.js} +3 -3
  59. package/dist/{chunk-3E2YDRGM.js.map → chunk-M7HLT2GO.js.map} +1 -1
  60. package/dist/{chunk-HAT56AXO.cjs → chunk-MFYZWOKE.cjs} +5 -5
  61. package/dist/{chunk-HAT56AXO.cjs.map → chunk-MFYZWOKE.cjs.map} +1 -1
  62. package/dist/{chunk-7N5OFQB3.cjs → chunk-MTFF2YS5.cjs} +14 -14
  63. package/dist/{chunk-7N5OFQB3.cjs.map → chunk-MTFF2YS5.cjs.map} +1 -1
  64. package/dist/{chunk-ZQZDPWLU.js → chunk-MU5XYKOI.js} +3 -3
  65. package/dist/{chunk-ZQZDPWLU.js.map → chunk-MU5XYKOI.js.map} +1 -1
  66. package/dist/{chunk-OJ2LSGSK.js → chunk-OMUSGHI5.js} +3 -3
  67. package/dist/{chunk-OJ2LSGSK.js.map → chunk-OMUSGHI5.js.map} +1 -1
  68. package/dist/{chunk-XBXNMMSC.js → chunk-OPS3GWJN.js} +4 -4
  69. package/dist/{chunk-XBXNMMSC.js.map → chunk-OPS3GWJN.js.map} +1 -1
  70. package/dist/{chunk-HEFYNGLM.js → chunk-PZJ3AQSO.js} +12 -3
  71. package/dist/chunk-PZJ3AQSO.js.map +1 -0
  72. package/dist/{chunk-3MCPTOLN.cjs → chunk-Q2GIORD4.cjs} +4 -4
  73. package/dist/{chunk-3MCPTOLN.cjs.map → chunk-Q2GIORD4.cjs.map} +1 -1
  74. package/dist/{chunk-LPB5BN2D.js → chunk-S3FJKEF5.js} +3 -3
  75. package/dist/{chunk-LPB5BN2D.js.map → chunk-S3FJKEF5.js.map} +1 -1
  76. package/dist/{chunk-QWT4ON3B.cjs → chunk-T2FBYRYD.cjs} +18 -2
  77. package/dist/chunk-T2FBYRYD.cjs.map +1 -0
  78. package/dist/chunk-TFAJYRT3.js +644 -0
  79. package/dist/chunk-TFAJYRT3.js.map +1 -0
  80. package/dist/{chunk-WQMMOPJQ.cjs → chunk-TLMAHJTC.cjs} +16 -16
  81. package/dist/{chunk-WQMMOPJQ.cjs.map → chunk-TLMAHJTC.cjs.map} +1 -1
  82. package/dist/{chunk-4FHOUNUN.js → chunk-TUIZTMGY.js} +3 -3
  83. package/dist/{chunk-4FHOUNUN.js.map → chunk-TUIZTMGY.js.map} +1 -1
  84. package/dist/{chunk-XHPUK2PC.cjs → chunk-UNSBVIVX.cjs} +20 -20
  85. package/dist/{chunk-XHPUK2PC.cjs.map → chunk-UNSBVIVX.cjs.map} +1 -1
  86. package/dist/{chunk-TJ7OH3RN.cjs → chunk-USUWP563.cjs} +10 -7
  87. package/dist/chunk-USUWP563.cjs.map +1 -0
  88. package/dist/{chunk-MWJ6ISO7.cjs → chunk-UUDPQDYF.cjs} +4 -4
  89. package/dist/{chunk-MWJ6ISO7.cjs.map → chunk-UUDPQDYF.cjs.map} +1 -1
  90. package/dist/{chunk-ARL3PR23.cjs → chunk-UZLWBQEU.cjs} +25 -25
  91. package/dist/{chunk-ARL3PR23.cjs.map → chunk-UZLWBQEU.cjs.map} +1 -1
  92. package/dist/{chunk-C3E5C74L.cjs → chunk-WXJSYUBX.cjs} +4 -4
  93. package/dist/{chunk-C3E5C74L.cjs.map → chunk-WXJSYUBX.cjs.map} +1 -1
  94. package/dist/{chunk-EFMN6TTT.js → chunk-XKE4GK7M.js} +3 -3
  95. package/dist/{chunk-EFMN6TTT.js.map → chunk-XKE4GK7M.js.map} +1 -1
  96. package/dist/{chunk-R77QBP2Q.cjs → chunk-YBXJMN7O.cjs} +12 -3
  97. package/dist/chunk-YBXJMN7O.cjs.map +1 -0
  98. package/dist/docs/SKILL.md +1 -1
  99. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  100. package/dist/server/handlers/a2a.cjs +14 -14
  101. package/dist/server/handlers/a2a.js +1 -1
  102. package/dist/server/handlers/agent-builder.cjs +17 -17
  103. package/dist/server/handlers/agent-builder.js +1 -1
  104. package/dist/server/handlers/agent-versions.cjs +8 -8
  105. package/dist/server/handlers/agent-versions.js +1 -1
  106. package/dist/server/handlers/agents.cjs +43 -43
  107. package/dist/server/handlers/agents.d.ts +198 -1
  108. package/dist/server/handlers/agents.d.ts.map +1 -1
  109. package/dist/server/handlers/agents.js +1 -1
  110. package/dist/server/handlers/conversations.cjs +5 -5
  111. package/dist/server/handlers/conversations.js +1 -1
  112. package/dist/server/handlers/responses.cjs +4 -4
  113. package/dist/server/handlers/responses.js +1 -1
  114. package/dist/server/handlers/scorer-versions.cjs +8 -8
  115. package/dist/server/handlers/scorer-versions.js +1 -1
  116. package/dist/server/handlers/scores.cjs +7 -7
  117. package/dist/server/handlers/scores.js +1 -1
  118. package/dist/server/handlers/stored-agent-favorites.cjs +3 -3
  119. package/dist/server/handlers/stored-agent-favorites.js +1 -1
  120. package/dist/server/handlers/stored-agents.cjs +11 -7
  121. package/dist/server/handlers/stored-agents.d.ts +8001 -140
  122. package/dist/server/handlers/stored-agents.d.ts.map +1 -1
  123. package/dist/server/handlers/stored-agents.js +1 -1
  124. package/dist/server/handlers/stored-scorers.cjs +6 -6
  125. package/dist/server/handlers/stored-scorers.js +1 -1
  126. package/dist/server/handlers/system.cjs +3 -3
  127. package/dist/server/handlers/system.d.ts +5 -0
  128. package/dist/server/handlers/system.d.ts.map +1 -1
  129. package/dist/server/handlers/system.js +1 -1
  130. package/dist/server/handlers/tool-providers.cjs +41 -5
  131. package/dist/server/handlers/tool-providers.d.ts +301 -4
  132. package/dist/server/handlers/tool-providers.d.ts.map +1 -1
  133. package/dist/server/handlers/tool-providers.js +1 -1
  134. package/dist/server/handlers/tools.cjs +6 -6
  135. package/dist/server/handlers/tools.js +1 -1
  136. package/dist/server/handlers/workflows.cjs +27 -27
  137. package/dist/server/handlers/workflows.js +1 -1
  138. package/dist/server/handlers.cjs +16 -16
  139. package/dist/server/handlers.js +8 -8
  140. package/dist/server/schemas/agents.d.ts +30 -0
  141. package/dist/server/schemas/agents.d.ts.map +1 -1
  142. package/dist/server/schemas/index.cjs +245 -145
  143. package/dist/server/schemas/index.js +7 -7
  144. package/dist/server/schemas/stored-agents.d.ts +4771 -99
  145. package/dist/server/schemas/stored-agents.d.ts.map +1 -1
  146. package/dist/server/schemas/system.d.ts +8 -0
  147. package/dist/server/schemas/system.d.ts.map +1 -1
  148. package/dist/server/schemas/tool-providers.d.ts +214 -0
  149. package/dist/server/schemas/tool-providers.d.ts.map +1 -1
  150. package/dist/server/server-adapter/index.cjs +13 -13
  151. package/dist/server/server-adapter/index.js +2 -2
  152. package/dist/server/server-adapter/routes/stored-agents.d.ts +2 -1
  153. package/dist/server/server-adapter/routes/stored-agents.d.ts.map +1 -1
  154. package/dist/server/server-adapter/routes/system.d.ts +5 -0
  155. package/dist/server/server-adapter/routes/system.d.ts.map +1 -1
  156. package/dist/server/server-adapter/routes/tool-providers.d.ts +248 -1
  157. package/dist/server/server-adapter/routes/tool-providers.d.ts.map +1 -1
  158. package/package.json +6 -6
  159. package/dist/chunk-37G66LYP.cjs +0 -65
  160. package/dist/chunk-37G66LYP.cjs.map +0 -1
  161. package/dist/chunk-4PB6LUYQ.js.map +0 -1
  162. package/dist/chunk-ACESWSVL.cjs +0 -131
  163. package/dist/chunk-ACESWSVL.cjs.map +0 -1
  164. package/dist/chunk-E7UDPLDF.cjs.map +0 -1
  165. package/dist/chunk-FQIFYDKU.js.map +0 -1
  166. package/dist/chunk-HEFYNGLM.js.map +0 -1
  167. package/dist/chunk-HNPFUM7G.js.map +0 -1
  168. package/dist/chunk-MXUQJDLY.js +0 -126
  169. package/dist/chunk-MXUQJDLY.js.map +0 -1
  170. package/dist/chunk-N42WTSJL.cjs.map +0 -1
  171. package/dist/chunk-NIKW5NHG.js +0 -57
  172. package/dist/chunk-NIKW5NHG.js.map +0 -1
  173. package/dist/chunk-PN3LDOLZ.js.map +0 -1
  174. package/dist/chunk-QBMOXGFZ.js.map +0 -1
  175. package/dist/chunk-QWT4ON3B.cjs.map +0 -1
  176. package/dist/chunk-R77QBP2Q.cjs.map +0 -1
  177. package/dist/chunk-TDAAXXUA.cjs.map +0 -1
  178. package/dist/chunk-TJ7OH3RN.cjs.map +0 -1
  179. package/dist/chunk-VJHJY3AS.js.map +0 -1
  180. package/dist/chunk-YF6SK4WY.cjs.map +0 -1
@@ -0,0 +1,644 @@
1
+ import { hasAdminBypass } from './chunk-7U7OWTR2.js';
2
+ import { listToolProvidersResponseSchema, listToolProviderToolkitsResponseSchema, toolProviderIdPathParams, listToolProviderToolsResponseSchema, listToolProviderToolsQuerySchema, getToolProviderToolSchemaResponseSchema, toolSlugPathParams, authorizeToolProviderResponseSchema, authorizeToolProviderBodySchema, authStatusToolProviderResponseSchema, toolProviderAuthStatusPathParams, connectionStatusToolProviderResponseSchema, connectionStatusToolProviderBodySchema, listConnectionsResponseSchema, listConnectionsQuerySchema, listConnectionFieldsResponseSchema, listConnectionFieldsQuerySchema, disconnectConnectionResponseSchema, disconnectConnectionQuerySchema, toolProviderConnectionPathParams, updateConnectionResponseSchema, updateConnectionBodySchema, connectionUsageResponseSchema, connectionUsageQuerySchema, toolProviderHealthResponseSchema } from './chunk-EUFT3MIX.js';
3
+ import { handleError } from './chunk-RJ5ZIUGX.js';
4
+ import { createRoute } from './chunk-YQL3TXSD.js';
5
+ import { HTTPException } from './chunk-6QWQZI4Q.js';
6
+ import { MASTRA_USER_KEY } from './chunk-23S37FLK.js';
7
+ import { MASTRA_RESOURCE_ID_KEY } from '@mastra/core/request-context';
8
+
9
+ var TOOL_PROVIDERS_RESOURCE = "tool-providers";
10
+ var SHARED_BUCKET_ID = "shared";
11
+ var _toolProviderModule;
12
+ async function loadToolProviderModule() {
13
+ if (!_toolProviderModule) {
14
+ _toolProviderModule = await import('@mastra/core/tool-provider');
15
+ }
16
+ return _toolProviderModule;
17
+ }
18
+ function requireEditor(editor) {
19
+ if (!editor) {
20
+ throw new HTTPException(500, { message: "Editor is not configured" });
21
+ }
22
+ return editor;
23
+ }
24
+ async function resolveProvider(editor, providerId) {
25
+ try {
26
+ return editor.getToolProviderOrThrow(providerId);
27
+ } catch (error) {
28
+ const { UnknownToolProviderError } = await loadToolProviderModule();
29
+ if (error instanceof UnknownToolProviderError) {
30
+ throw new HTTPException(404, { message: error.message });
31
+ }
32
+ throw error;
33
+ }
34
+ }
35
+ var defaultBucketWarned = false;
36
+ function warnDefaultBucketFallback(logger) {
37
+ if (defaultBucketWarned) return;
38
+ defaultBucketWarned = true;
39
+ logger?.warn(
40
+ '[tool-providers] caller-supplied scope falling back to shared "default" bucket \u2014 wire mapUserToResourceId or set MASTRA_USER_KEY to avoid cross-tenant OAuth sharing'
41
+ );
42
+ }
43
+ function resolveOwnerId(requestContext, logger) {
44
+ const resourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);
45
+ if (typeof resourceId === "string" && resourceId.length > 0) {
46
+ return resourceId;
47
+ }
48
+ const user = requestContext?.get(MASTRA_USER_KEY);
49
+ if (user && typeof user === "object" && "id" in user) {
50
+ const id = user.id;
51
+ if (typeof id === "string" && id.length > 0) {
52
+ return id;
53
+ }
54
+ }
55
+ warnDefaultBucketFallback(logger);
56
+ return "default";
57
+ }
58
+ var LIST_TOOL_PROVIDERS_ROUTE = createRoute({
59
+ method: "GET",
60
+ path: "/tool-providers",
61
+ responseType: "json",
62
+ responseSchema: listToolProvidersResponseSchema,
63
+ summary: "List tool providers",
64
+ description: "Returns a list of all registered tool providers with their info and capabilities",
65
+ tags: ["Tool Providers"],
66
+ requiresAuth: true,
67
+ handler: async ({ mastra }) => {
68
+ try {
69
+ const editor = requireEditor(mastra.getEditor());
70
+ const providers = editor.getToolProviders();
71
+ return {
72
+ providers: Object.values(providers).map((provider) => ({
73
+ ...provider.info,
74
+ ...provider.displayName ? { displayName: provider.displayName } : {},
75
+ ...provider.capabilities ? { capabilities: provider.capabilities } : {}
76
+ }))
77
+ };
78
+ } catch (error) {
79
+ return handleError(error, "Error listing tool providers");
80
+ }
81
+ }
82
+ });
83
+ var LIST_TOOL_PROVIDER_TOOLKITS_ROUTE = createRoute({
84
+ method: "GET",
85
+ path: "/tool-providers/:providerId/toolkits",
86
+ responseType: "json",
87
+ pathParamSchema: toolProviderIdPathParams,
88
+ responseSchema: listToolProviderToolkitsResponseSchema,
89
+ summary: "List tool provider toolkits",
90
+ description: "Returns the toolkits available from a specific tool provider",
91
+ tags: ["Tool Providers"],
92
+ requiresAuth: true,
93
+ handler: async ({ mastra, providerId }) => {
94
+ try {
95
+ const editor = requireEditor(mastra.getEditor());
96
+ const provider = await resolveProvider(editor, providerId);
97
+ if (provider.listToolkitsVNext) {
98
+ return await provider.listToolkitsVNext();
99
+ }
100
+ if (provider.listToolkits) {
101
+ return await provider.listToolkits();
102
+ }
103
+ return { data: [] };
104
+ } catch (error) {
105
+ return handleError(error, "Error listing tool provider toolkits");
106
+ }
107
+ }
108
+ });
109
+ var LIST_TOOL_PROVIDER_TOOLS_ROUTE = createRoute({
110
+ method: "GET",
111
+ path: "/tool-providers/:providerId/tools",
112
+ responseType: "json",
113
+ pathParamSchema: toolProviderIdPathParams,
114
+ queryParamSchema: listToolProviderToolsQuerySchema,
115
+ responseSchema: listToolProviderToolsResponseSchema,
116
+ summary: "List tool provider tools",
117
+ description: "Returns the tools available from a specific tool provider, with optional filtering",
118
+ tags: ["Tool Providers"],
119
+ requiresAuth: true,
120
+ handler: async ({ mastra, providerId, toolkit, search, page, perPage }) => {
121
+ try {
122
+ const editor = requireEditor(mastra.getEditor());
123
+ const provider = await resolveProvider(editor, providerId);
124
+ const opts = {};
125
+ if (toolkit !== void 0) opts.toolkit = toolkit;
126
+ if (search !== void 0) opts.search = search;
127
+ if (page !== void 0) opts.page = page;
128
+ if (perPage !== void 0) opts.perPage = perPage;
129
+ if (provider.listToolsVNext) {
130
+ return await provider.listToolsVNext(Object.keys(opts).length > 0 ? opts : void 0);
131
+ }
132
+ return await provider.listTools(Object.keys(opts).length > 0 ? opts : void 0);
133
+ } catch (error) {
134
+ return handleError(error, "Error listing tool provider tools");
135
+ }
136
+ }
137
+ });
138
+ var GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE = createRoute({
139
+ method: "GET",
140
+ path: "/tool-providers/:providerId/tools/:toolSlug/schema",
141
+ responseType: "json",
142
+ pathParamSchema: toolSlugPathParams,
143
+ responseSchema: getToolProviderToolSchemaResponseSchema,
144
+ summary: "Get tool provider tool schema",
145
+ description: "Returns the schema for a specific tool from a tool provider",
146
+ tags: ["Tool Providers"],
147
+ requiresAuth: true,
148
+ handler: async ({ mastra, providerId, toolSlug }) => {
149
+ try {
150
+ const editor = requireEditor(mastra.getEditor());
151
+ const provider = await resolveProvider(editor, providerId);
152
+ if (!provider.getToolSchema) {
153
+ throw new HTTPException(404, { message: `Tool provider ${providerId} does not support getToolSchema` });
154
+ }
155
+ const schema = await provider.getToolSchema(toolSlug);
156
+ if (!schema) {
157
+ throw new HTTPException(404, { message: `Schema for tool ${toolSlug} not found in provider ${providerId}` });
158
+ }
159
+ return schema;
160
+ } catch (error) {
161
+ return handleError(error, "Error getting tool provider tool schema");
162
+ }
163
+ }
164
+ });
165
+ var AUTHORIZE_TOOL_PROVIDER_ROUTE = createRoute({
166
+ method: "POST",
167
+ path: "/tool-providers/:providerId/authorize",
168
+ responseType: "json",
169
+ pathParamSchema: toolProviderIdPathParams,
170
+ bodySchema: authorizeToolProviderBodySchema,
171
+ responseSchema: authorizeToolProviderResponseSchema,
172
+ summary: "Authorize tool provider connection",
173
+ description: "Starts an OAuth flow and returns a redirect URL + opaque auth handle",
174
+ tags: ["Tool Providers"],
175
+ requiresAuth: true,
176
+ handler: async ({ mastra, providerId, toolkit, connectionId, toolName, config, label, scope, requestContext }) => {
177
+ try {
178
+ const editor = requireEditor(mastra.getEditor());
179
+ const provider = await resolveProvider(editor, providerId);
180
+ if (!provider.authorize) {
181
+ throw new HTTPException(400, { message: `Tool provider ${providerId} does not support authorize` });
182
+ }
183
+ const effectiveScope = scope === "shared" || scope === "caller-supplied" ? scope : "per-author";
184
+ const callerResourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY);
185
+ if (effectiveScope === "caller-supplied") {
186
+ if (typeof callerResourceId !== "string" || callerResourceId.length === 0) {
187
+ throw new HTTPException(400, {
188
+ message: `Cannot authorize caller-supplied connection: request context has no '${MASTRA_RESOURCE_ID_KEY}'. Set requestContext.set('${MASTRA_RESOURCE_ID_KEY}', <userId>) before calling /authorize.`
189
+ });
190
+ }
191
+ }
192
+ const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());
193
+ const ownerAuthorId = effectiveScope === "shared" ? SHARED_BUCKET_ID : effectiveScope === "caller-supplied" ? callerResourceId : callerAuthorId;
194
+ const bucket = connectionId && connectionId.length > 0 ? connectionId : ownerAuthorId;
195
+ const result = await provider.authorize({ toolkit, connectionId: bucket, toolName, config });
196
+ const persistedConnectionId = connectionId && connectionId.length > 0 ? connectionId : result.authId;
197
+ try {
198
+ const storage = mastra.getStorage();
199
+ const store = await storage?.getStore("toolProviderConnections");
200
+ if (store && persistedConnectionId) {
201
+ await store.upsertConnection({
202
+ authorId: ownerAuthorId,
203
+ providerId: provider.info.id,
204
+ toolkit,
205
+ connectionId: persistedConnectionId,
206
+ label: typeof label === "string" && label.length > 0 ? label : null,
207
+ scope: effectiveScope
208
+ });
209
+ }
210
+ } catch (upsertError) {
211
+ mastra.getLogger?.()?.warn?.("[tool-providers] failed to upsert tool_provider_connections label", {
212
+ error: upsertError instanceof Error ? upsertError.message : String(upsertError),
213
+ providerId,
214
+ toolkit,
215
+ connectionId: persistedConnectionId
216
+ });
217
+ }
218
+ return result;
219
+ } catch (error) {
220
+ return handleError(error, "Error authorizing tool provider");
221
+ }
222
+ }
223
+ });
224
+ var GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE = createRoute({
225
+ method: "GET",
226
+ path: "/tool-providers/:providerId/auth-status/:authId",
227
+ responseType: "json",
228
+ pathParamSchema: toolProviderAuthStatusPathParams,
229
+ responseSchema: authStatusToolProviderResponseSchema,
230
+ summary: "Get tool provider auth status",
231
+ description: "Polls the OAuth flow status for an outstanding authorize call",
232
+ tags: ["Tool Providers"],
233
+ requiresAuth: true,
234
+ handler: async ({ mastra, providerId, authId }) => {
235
+ try {
236
+ const editor = requireEditor(mastra.getEditor());
237
+ const provider = await resolveProvider(editor, providerId);
238
+ if (!provider.getAuthStatus) {
239
+ throw new HTTPException(400, { message: `Tool provider ${providerId} does not support getAuthStatus` });
240
+ }
241
+ const status = await provider.getAuthStatus(authId);
242
+ return { status };
243
+ } catch (error) {
244
+ return handleError(error, "Error getting tool provider auth status");
245
+ }
246
+ }
247
+ });
248
+ var TOOL_PROVIDER_CONNECTION_STATUS_ROUTE = createRoute({
249
+ method: "POST",
250
+ path: "/tool-providers/:providerId/connection-status",
251
+ responseType: "json",
252
+ pathParamSchema: toolProviderIdPathParams,
253
+ bodySchema: connectionStatusToolProviderBodySchema,
254
+ responseSchema: connectionStatusToolProviderResponseSchema,
255
+ summary: "Get connection status for a provider",
256
+ description: "Batch-checks whether a set of (connectionId, toolkit) tuples are still connected",
257
+ tags: ["Tool Providers"],
258
+ requiresAuth: true,
259
+ handler: async ({ mastra, providerId, items }) => {
260
+ try {
261
+ const editor = requireEditor(mastra.getEditor());
262
+ const provider = await resolveProvider(editor, providerId);
263
+ if (!provider.getConnectionStatus) {
264
+ throw new HTTPException(400, { message: `Tool provider ${providerId} does not support getConnectionStatus` });
265
+ }
266
+ const result = await provider.getConnectionStatus({ items });
267
+ return { items: result };
268
+ } catch (error) {
269
+ return handleError(error, "Error getting connection status");
270
+ }
271
+ }
272
+ });
273
+ var LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE = createRoute({
274
+ method: "GET",
275
+ path: "/tool-providers/:providerId/connections",
276
+ responseType: "json",
277
+ pathParamSchema: toolProviderIdPathParams,
278
+ queryParamSchema: listConnectionsQuerySchema,
279
+ responseSchema: listConnectionsResponseSchema,
280
+ summary: "List existing connections",
281
+ description: "Returns existing provider connections on a toolkit, so the picker can offer them for pinning without re-running OAuth",
282
+ tags: ["Tool Providers"],
283
+ requiresAuth: true,
284
+ handler: async ({
285
+ mastra,
286
+ providerId,
287
+ toolkit,
288
+ authorId: queryAuthorId,
289
+ scope: queryScope,
290
+ page,
291
+ perPage,
292
+ requestContext
293
+ }) => {
294
+ try {
295
+ const editor = requireEditor(mastra.getEditor());
296
+ const provider = await resolveProvider(editor, providerId);
297
+ if (!provider.listConnections) {
298
+ throw new HTTPException(400, { message: `Tool provider ${providerId} does not support listConnections` });
299
+ }
300
+ const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());
301
+ const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;
302
+ const requestedAuthorId = isAdmin && typeof queryAuthorId === "string" && queryAuthorId.length > 0 ? queryAuthorId : void 0;
303
+ const effectiveAuthorId = isAdmin ? requestedAuthorId : callerAuthorId;
304
+ const storage = mastra.getStorage();
305
+ const store = await storage?.getStore("toolProviderConnections");
306
+ let labelRows = [];
307
+ if (store) {
308
+ try {
309
+ const rows = await store.listConnectionsByAuthor({
310
+ providerId: provider.info.id,
311
+ toolkit
312
+ });
313
+ labelRows = rows.map((r) => ({
314
+ authorId: r.authorId,
315
+ connectionId: r.connectionId,
316
+ label: r.label,
317
+ scope: r.scope ?? "per-author"
318
+ }));
319
+ } catch (joinError) {
320
+ mastra.getLogger?.()?.warn?.("[tool-providers] failed to join tool_provider_connections labels", {
321
+ error: joinError instanceof Error ? joinError.message : String(joinError),
322
+ providerId,
323
+ toolkit
324
+ });
325
+ }
326
+ }
327
+ const userIdSet = /* @__PURE__ */ new Set();
328
+ const wantShared = !queryScope || queryScope === "shared";
329
+ const wantPerAuthor = !queryScope || queryScope === "per-author";
330
+ const wantCallerSupplied = !queryScope || queryScope === "caller-supplied";
331
+ const hasSharedRow = labelRows.some((r) => r.scope === "shared");
332
+ if (isAdmin && effectiveAuthorId === void 0) {
333
+ for (const r of labelRows) {
334
+ if (r.scope === "shared" && wantShared) userIdSet.add(r.authorId);
335
+ if (r.scope === "per-author" && wantPerAuthor) userIdSet.add(r.authorId);
336
+ if (r.scope === "caller-supplied" && wantCallerSupplied) userIdSet.add(r.authorId);
337
+ }
338
+ } else if (isAdmin && effectiveAuthorId) {
339
+ if (wantPerAuthor || wantCallerSupplied) userIdSet.add(effectiveAuthorId);
340
+ if (wantShared && hasSharedRow) userIdSet.add(SHARED_BUCKET_ID);
341
+ } else {
342
+ if (wantPerAuthor) userIdSet.add(callerAuthorId);
343
+ if (wantShared && hasSharedRow) userIdSet.add(SHARED_BUCKET_ID);
344
+ }
345
+ const userIds = Array.from(userIdSet);
346
+ if (userIds.length === 0) {
347
+ return {
348
+ items: [],
349
+ pagination: { page: page ?? 1, perPage, hasMore: false }
350
+ };
351
+ }
352
+ const adapterResult = await provider.listConnections({
353
+ toolkit,
354
+ userIds,
355
+ ...typeof page === "number" ? { page } : {},
356
+ ...typeof perPage === "number" ? { perPage } : {}
357
+ });
358
+ const rowByConnId = new Map(labelRows.map((r) => [r.connectionId, r]));
359
+ const visibleItems = adapterResult.items.filter((item) => {
360
+ if (!queryScope) return true;
361
+ const scope = rowByConnId.get(item.connectionId)?.scope ?? "per-author";
362
+ return scope === queryScope;
363
+ });
364
+ return {
365
+ items: visibleItems.map((item) => {
366
+ const row = rowByConnId.get(item.connectionId);
367
+ return {
368
+ ...item,
369
+ label: row?.label ?? null,
370
+ ...row?.scope ? { scope: row.scope } : {}
371
+ };
372
+ }),
373
+ pagination: adapterResult.pagination
374
+ };
375
+ } catch (error) {
376
+ return handleError(error, "Error listing tool provider connections");
377
+ }
378
+ }
379
+ });
380
+ var LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE = createRoute({
381
+ method: "GET",
382
+ path: "/tool-providers/:providerId/connection-fields",
383
+ responseType: "json",
384
+ pathParamSchema: toolProviderIdPathParams,
385
+ queryParamSchema: listConnectionFieldsQuerySchema,
386
+ responseSchema: listConnectionFieldsResponseSchema,
387
+ summary: "List connection field schema",
388
+ description: "Returns a list of provider-specific fields the UI should collect before initiating an authorize call",
389
+ tags: ["Tool Providers"],
390
+ requiresAuth: true,
391
+ handler: async ({ mastra, providerId, toolkit }) => {
392
+ try {
393
+ const editor = requireEditor(mastra.getEditor());
394
+ const provider = await resolveProvider(editor, providerId);
395
+ if (!provider.listConnectionFields) {
396
+ return { fields: [] };
397
+ }
398
+ const fields = await provider.listConnectionFields({ toolkit });
399
+ return { fields };
400
+ } catch (error) {
401
+ return handleError(error, "Error listing tool provider connection fields");
402
+ }
403
+ }
404
+ });
405
+ var DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE = createRoute({
406
+ method: "DELETE",
407
+ path: "/tool-providers/:providerId/connections/:connectionId",
408
+ responseType: "json",
409
+ pathParamSchema: toolProviderConnectionPathParams,
410
+ queryParamSchema: disconnectConnectionQuerySchema,
411
+ responseSchema: disconnectConnectionResponseSchema,
412
+ summary: "Disconnect a connection",
413
+ description: "Revokes the provider-side connection (if supported) and removes the persisted tool_provider_connections row. Use `?force=true` to bypass usage checks.",
414
+ tags: ["Tool Providers"],
415
+ requiresAuth: true,
416
+ handler: async ({ mastra, providerId, connectionId, force, requestContext }) => {
417
+ try {
418
+ const editor = requireEditor(mastra.getEditor());
419
+ const provider = await resolveProvider(editor, providerId);
420
+ const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());
421
+ const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;
422
+ const isForce = force === true || force === "true";
423
+ const storage = mastra.getStorage();
424
+ const store = await storage?.getStore("toolProviderConnections");
425
+ let ownerAuthorId;
426
+ let ownerScope;
427
+ let matched = false;
428
+ if (store) {
429
+ const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });
430
+ const match = rows.find((r) => r.connectionId === connectionId);
431
+ if (match) {
432
+ matched = true;
433
+ ownerAuthorId = match.authorId;
434
+ ownerScope = match.scope;
435
+ }
436
+ }
437
+ if (store && !matched && !isAdmin) {
438
+ throw new HTTPException(403, {
439
+ message: "You do not have permission to disconnect this connection"
440
+ });
441
+ }
442
+ const effectiveOwner = ownerAuthorId ?? callerAuthorId;
443
+ const isShared = ownerScope === "shared";
444
+ if (!isShared && effectiveOwner !== callerAuthorId && !isAdmin) {
445
+ throw new HTTPException(403, {
446
+ message: "You do not have permission to disconnect this connection"
447
+ });
448
+ }
449
+ if (!isForce) {
450
+ const usage = await countConnectionUsage(mastra, connectionId);
451
+ if (usage > 0) {
452
+ throw new HTTPException(409, {
453
+ message: `Connection ${connectionId} is still pinned by ${usage} agent(s). Pass ?force=true to disconnect anyway.`
454
+ });
455
+ }
456
+ }
457
+ let revoked = false;
458
+ if (provider.capabilities?.supportsRevoke && typeof provider.revokeConnection === "function") {
459
+ await provider.revokeConnection(connectionId);
460
+ revoked = true;
461
+ }
462
+ if (store) {
463
+ await store.deleteConnection({
464
+ authorId: effectiveOwner,
465
+ providerId: provider.info.id,
466
+ connectionId
467
+ });
468
+ }
469
+ return { ok: true, revoked };
470
+ } catch (error) {
471
+ return handleError(error, "Error disconnecting tool provider connection");
472
+ }
473
+ }
474
+ });
475
+ var UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE = createRoute({
476
+ method: "PATCH",
477
+ path: "/tool-providers/:providerId/connections/:connectionId",
478
+ responseType: "json",
479
+ pathParamSchema: toolProviderConnectionPathParams,
480
+ bodySchema: updateConnectionBodySchema,
481
+ responseSchema: updateConnectionResponseSchema,
482
+ summary: "Update a connection label",
483
+ description: "Updates the persisted display label on tool_provider_connections. Returns 403 when caller is neither the owner nor admin (and the row is not shared), 404 when the row does not exist.",
484
+ tags: ["Tool Providers"],
485
+ requiresAuth: true,
486
+ handler: async ({ mastra, providerId, connectionId, label, requestContext }) => {
487
+ try {
488
+ const editor = requireEditor(mastra.getEditor());
489
+ const provider = await resolveProvider(editor, providerId);
490
+ const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());
491
+ const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;
492
+ const storage = mastra.getStorage();
493
+ const store = await storage?.getStore("toolProviderConnections");
494
+ if (!store) {
495
+ throw new HTTPException(500, {
496
+ message: "Tool provider connections storage is not configured"
497
+ });
498
+ }
499
+ const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });
500
+ const match = rows.find((r) => r.connectionId === connectionId);
501
+ if (!match) {
502
+ throw new HTTPException(404, {
503
+ message: `Connection ${connectionId} not found for provider ${providerId}`
504
+ });
505
+ }
506
+ const isShared = match.scope === "shared";
507
+ if (!isShared && match.authorId !== callerAuthorId && !isAdmin) {
508
+ throw new HTTPException(403, {
509
+ message: "You do not have permission to update this connection"
510
+ });
511
+ }
512
+ const nextLabel = typeof label === "string" && label.trim().length > 0 ? label.trim() : null;
513
+ await store.upsertConnection({
514
+ authorId: match.authorId,
515
+ providerId: provider.info.id,
516
+ toolkit: match.toolkit,
517
+ connectionId,
518
+ label: nextLabel,
519
+ scope: match.scope
520
+ });
521
+ return { ok: true, label: nextLabel };
522
+ } catch (error) {
523
+ return handleError(error, "Error updating tool provider connection");
524
+ }
525
+ }
526
+ });
527
+ var GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE = createRoute({
528
+ method: "GET",
529
+ path: "/tool-providers/:providerId/connections/:connectionId/usage",
530
+ responseType: "json",
531
+ pathParamSchema: toolProviderConnectionPathParams,
532
+ queryParamSchema: connectionUsageQuerySchema,
533
+ responseSchema: connectionUsageResponseSchema,
534
+ summary: "List agents using a connection",
535
+ description: "Returns the agents that pin this connection in their toolProviders config",
536
+ tags: ["Tool Providers"],
537
+ requiresAuth: true,
538
+ handler: async ({ mastra, providerId, connectionId, toolkit, requestContext }) => {
539
+ try {
540
+ const editor = requireEditor(mastra.getEditor());
541
+ const provider = await resolveProvider(editor, providerId);
542
+ const callerAuthorId = resolveOwnerId(requestContext, mastra.getLogger());
543
+ const isAdmin = requestContext ? hasAdminBypass(requestContext, TOOL_PROVIDERS_RESOURCE) : false;
544
+ const storage = mastra.getStorage();
545
+ const store = await storage?.getStore("toolProviderConnections");
546
+ let ownerAuthorId;
547
+ let ownerScope;
548
+ let matched = false;
549
+ if (store) {
550
+ const rows = await store.listConnectionsByAuthor({ providerId: provider.info.id });
551
+ const match = rows.find((r) => r.connectionId === connectionId);
552
+ if (match) {
553
+ matched = true;
554
+ ownerAuthorId = match.authorId;
555
+ ownerScope = match.scope;
556
+ }
557
+ }
558
+ if (store && !matched && !isAdmin) {
559
+ throw new HTTPException(403, {
560
+ message: "You do not have permission to view usage for this connection"
561
+ });
562
+ }
563
+ const effectiveOwner = ownerAuthorId ?? callerAuthorId;
564
+ const isShared = ownerScope === "shared";
565
+ if (!isShared && effectiveOwner !== callerAuthorId && !isAdmin) {
566
+ throw new HTTPException(403, {
567
+ message: "You do not have permission to view usage for this connection"
568
+ });
569
+ }
570
+ const agents = await scanConnectionUsage(mastra, { providerId: provider.info.id, connectionId, toolkit });
571
+ return { agents };
572
+ } catch (error) {
573
+ return handleError(error, "Error listing tool provider connection usage");
574
+ }
575
+ }
576
+ });
577
+ var GET_TOOL_PROVIDER_HEALTH_ROUTE = createRoute({
578
+ method: "GET",
579
+ path: "/tool-providers/:providerId/health",
580
+ responseType: "json",
581
+ pathParamSchema: toolProviderIdPathParams,
582
+ responseSchema: toolProviderHealthResponseSchema,
583
+ summary: "Get tool provider health",
584
+ description: "Returns provider-level health (config, reachability, etc.)",
585
+ tags: ["Tool Providers"],
586
+ requiresAuth: true,
587
+ handler: async ({ mastra, providerId }) => {
588
+ try {
589
+ const editor = requireEditor(mastra.getEditor());
590
+ const provider = await resolveProvider(editor, providerId);
591
+ if (!provider.getHealth) {
592
+ return { ok: true };
593
+ }
594
+ return await provider.getHealth();
595
+ } catch (error) {
596
+ return handleError(error, "Error getting tool provider health");
597
+ }
598
+ }
599
+ });
600
+ async function scanConnectionUsage(mastra, args) {
601
+ const storage = mastra.getStorage();
602
+ const agentsStore = await storage?.getStore("agents");
603
+ if (!agentsStore) return [];
604
+ const { agents } = await agentsStore.listResolved({ perPage: false });
605
+ const out = [];
606
+ for (const agent of agents) {
607
+ const config = agent?.toolProviders?.[args.providerId];
608
+ if (!config?.connections) continue;
609
+ for (const [toolkit, connections] of Object.entries(config.connections)) {
610
+ if (args.toolkit && toolkit !== args.toolkit) continue;
611
+ const match = connections.some((c) => c.connectionId === args.connectionId);
612
+ if (match) {
613
+ out.push({ id: agent.id, name: agent.name ?? agent.id });
614
+ break;
615
+ }
616
+ }
617
+ }
618
+ return out;
619
+ }
620
+ async function countConnectionUsage(mastra, connectionId) {
621
+ const storage = mastra.getStorage();
622
+ const agentsStore = await storage?.getStore("agents");
623
+ if (!agentsStore) return 0;
624
+ const { agents } = await agentsStore.listResolved({ perPage: false });
625
+ let count = 0;
626
+ for (const agent of agents) {
627
+ const tp = agent?.toolProviders;
628
+ if (!tp) continue;
629
+ for (const config of Object.values(tp)) {
630
+ const pinned = Object.values(config?.connections ?? {}).some(
631
+ (arr) => arr.some((c) => c.connectionId === connectionId)
632
+ );
633
+ if (pinned) {
634
+ count += 1;
635
+ break;
636
+ }
637
+ }
638
+ }
639
+ return count;
640
+ }
641
+
642
+ export { AUTHORIZE_TOOL_PROVIDER_ROUTE, DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE, GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE, GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE, GET_TOOL_PROVIDER_HEALTH_ROUTE, GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE, LIST_TOOL_PROVIDERS_ROUTE, LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE, LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE, LIST_TOOL_PROVIDER_TOOLKITS_ROUTE, LIST_TOOL_PROVIDER_TOOLS_ROUTE, TOOL_PROVIDER_CONNECTION_STATUS_ROUTE, UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE };
643
+ //# sourceMappingURL=chunk-TFAJYRT3.js.map
644
+ //# sourceMappingURL=chunk-TFAJYRT3.js.map