@mastra/client-js 0.0.0-trigger-playground-ui-package-20250506151043 → 0.0.0-update-scorers-api-20250801170445

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 (83) hide show
  1. package/CHANGELOG.md +1110 -2
  2. package/LICENSE.md +11 -42
  3. package/README.md +2 -1
  4. package/dist/adapters/agui.d.ts +23 -0
  5. package/dist/adapters/agui.d.ts.map +1 -0
  6. package/dist/client.d.ts +265 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/example.d.ts +2 -0
  9. package/dist/example.d.ts.map +1 -0
  10. package/dist/index.cjs +1403 -131
  11. package/dist/index.cjs.map +1 -0
  12. package/dist/index.d.ts +4 -730
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +1401 -133
  15. package/dist/index.js.map +1 -0
  16. package/dist/resources/a2a.d.ts +44 -0
  17. package/dist/resources/a2a.d.ts.map +1 -0
  18. package/dist/resources/agent.d.ts +112 -0
  19. package/dist/resources/agent.d.ts.map +1 -0
  20. package/dist/resources/base.d.ts +13 -0
  21. package/dist/resources/base.d.ts.map +1 -0
  22. package/dist/resources/index.d.ts +11 -0
  23. package/dist/resources/index.d.ts.map +1 -0
  24. package/dist/resources/legacy-workflow.d.ts +87 -0
  25. package/dist/resources/legacy-workflow.d.ts.map +1 -0
  26. package/dist/resources/mcp-tool.d.ts +27 -0
  27. package/dist/resources/mcp-tool.d.ts.map +1 -0
  28. package/dist/resources/memory-thread.d.ts +53 -0
  29. package/dist/resources/memory-thread.d.ts.map +1 -0
  30. package/dist/resources/network-memory-thread.d.ts +47 -0
  31. package/dist/resources/network-memory-thread.d.ts.map +1 -0
  32. package/dist/resources/network.d.ts +30 -0
  33. package/dist/resources/network.d.ts.map +1 -0
  34. package/dist/resources/tool.d.ts +23 -0
  35. package/dist/resources/tool.d.ts.map +1 -0
  36. package/dist/resources/vNextNetwork.d.ts +42 -0
  37. package/dist/resources/vNextNetwork.d.ts.map +1 -0
  38. package/dist/resources/vector.d.ts +48 -0
  39. package/dist/resources/vector.d.ts.map +1 -0
  40. package/dist/resources/workflow.d.ts +154 -0
  41. package/dist/resources/workflow.d.ts.map +1 -0
  42. package/dist/types.d.ts +422 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/utils/index.d.ts +3 -0
  45. package/dist/utils/index.d.ts.map +1 -0
  46. package/dist/utils/process-client-tools.d.ts +3 -0
  47. package/dist/utils/process-client-tools.d.ts.map +1 -0
  48. package/dist/utils/zod-to-json-schema.d.ts +105 -0
  49. package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
  50. package/integration-tests/agui-adapter.test.ts +122 -0
  51. package/integration-tests/package.json +18 -0
  52. package/integration-tests/src/mastra/index.ts +35 -0
  53. package/integration-tests/vitest.config.ts +9 -0
  54. package/package.json +28 -19
  55. package/src/adapters/agui.test.ts +164 -9
  56. package/src/adapters/agui.ts +31 -11
  57. package/src/client.ts +386 -22
  58. package/src/example.ts +59 -29
  59. package/src/index.test.ts +522 -6
  60. package/src/index.ts +1 -0
  61. package/src/resources/a2a.ts +88 -0
  62. package/src/resources/agent.ts +629 -48
  63. package/src/resources/base.ts +7 -1
  64. package/src/resources/index.ts +4 -2
  65. package/src/resources/{vnext-workflow.ts → legacy-workflow.ts} +124 -139
  66. package/src/resources/mcp-tool.ts +48 -0
  67. package/src/resources/memory-thread.test.ts +285 -0
  68. package/src/resources/memory-thread.ts +49 -3
  69. package/src/resources/network-memory-thread.test.ts +269 -0
  70. package/src/resources/network-memory-thread.ts +81 -0
  71. package/src/resources/network.ts +10 -16
  72. package/src/resources/tool.ts +9 -2
  73. package/src/resources/vNextNetwork.ts +194 -0
  74. package/src/resources/workflow.ts +255 -96
  75. package/src/types.ts +265 -25
  76. package/src/utils/index.ts +11 -0
  77. package/src/utils/process-client-tools.ts +32 -0
  78. package/src/utils/zod-to-json-schema.ts +10 -0
  79. package/src/v2-messages.test.ts +180 -0
  80. package/tsconfig.build.json +9 -0
  81. package/tsconfig.json +1 -1
  82. package/tsup.config.ts +22 -0
  83. package/dist/index.d.cts +0 -730
@@ -21,14 +21,20 @@ export class BaseResource {
21
21
 
22
22
  for (let attempt = 0; attempt <= retries; attempt++) {
23
23
  try {
24
- const response = await fetch(`${baseUrl}${path}`, {
24
+ const response = await fetch(`${baseUrl.replace(/\/$/, '')}${path}`, {
25
25
  ...options,
26
26
  headers: {
27
+ ...(options.body &&
28
+ !(options.body instanceof FormData) &&
29
+ (options.method === 'POST' || options.method === 'PUT')
30
+ ? { 'content-type': 'application/json' }
31
+ : {}),
27
32
  ...headers,
28
33
  ...options.headers,
29
34
  // TODO: Bring this back once we figure out what we/users need to do to make this work with cross-origin requests
30
35
  // 'x-mastra-client-type': 'js',
31
36
  },
37
+ signal: this.options.abortSignal,
32
38
  body:
33
39
  options.body instanceof FormData ? options.body : options.body ? JSON.stringify(options.body) : undefined,
34
40
  });
@@ -2,7 +2,9 @@ export * from './agent';
2
2
  export * from './network';
3
3
  export * from './memory-thread';
4
4
  export * from './vector';
5
- export * from './workflow';
5
+ export * from './legacy-workflow';
6
6
  export * from './tool';
7
7
  export * from './base';
8
- export * from './vnext-workflow';
8
+ export * from './workflow';
9
+ export * from './a2a';
10
+ export * from './mcp-tool';
@@ -1,18 +1,16 @@
1
- import type { RuntimeContext } from '@mastra/core/runtime-context';
2
1
  import type {
3
2
  ClientOptions,
4
- GetVNextWorkflowResponse,
3
+ LegacyWorkflowRunResult,
4
+ GetLegacyWorkflowRunsResponse,
5
5
  GetWorkflowRunsParams,
6
- GetWorkflowRunsResponse,
7
- VNextWorkflowRunResult,
8
- VNextWorkflowWatchResult,
6
+ GetLegacyWorkflowResponse,
9
7
  } from '../types';
10
8
 
11
9
  import { BaseResource } from './base';
12
10
 
13
11
  const RECORD_SEPARATOR = '\x1E';
14
12
 
15
- export class VNextWorkflow extends BaseResource {
13
+ export class LegacyWorkflow extends BaseResource {
16
14
  constructor(
17
15
  options: ClientOptions,
18
16
  private workflowId: string,
@@ -21,90 +19,19 @@ export class VNextWorkflow extends BaseResource {
21
19
  }
22
20
 
23
21
  /**
24
- * Creates an async generator that processes a readable stream and yields vNext workflow records
25
- * separated by the Record Separator character (\x1E)
26
- *
27
- * @param stream - The readable stream to process
28
- * @returns An async generator that yields parsed records
22
+ * Retrieves details about the legacy workflow
23
+ * @returns Promise containing legacy workflow details including steps and graphs
29
24
  */
30
- private async *streamProcessor(stream: ReadableStream): AsyncGenerator<VNextWorkflowWatchResult, void, unknown> {
31
- const reader = stream.getReader();
32
-
33
- // Track if we've finished reading from the stream
34
- let doneReading = false;
35
- // Buffer to accumulate partial chunks
36
- let buffer = '';
37
-
38
- try {
39
- while (!doneReading) {
40
- // Read the next chunk from the stream
41
- const { done, value } = await reader.read();
42
- doneReading = done;
43
-
44
- // Skip processing if we're done and there's no value
45
- if (done && !value) continue;
46
-
47
- try {
48
- // Decode binary data to text
49
- const decoded = value ? new TextDecoder().decode(value) : '';
50
-
51
- // Split the combined buffer and new data by record separator
52
- const chunks = (buffer + decoded).split(RECORD_SEPARATOR);
53
-
54
- // The last chunk might be incomplete, so save it for the next iteration
55
- buffer = chunks.pop() || '';
56
-
57
- // Process complete chunks
58
- for (const chunk of chunks) {
59
- if (chunk) {
60
- // Only process non-empty chunks
61
- if (typeof chunk === 'string') {
62
- try {
63
- const parsedChunk = JSON.parse(chunk);
64
- yield parsedChunk;
65
- } catch {
66
- // Silently ignore parsing errors to maintain stream processing
67
- // This allows the stream to continue even if one record is malformed
68
- }
69
- }
70
- }
71
- }
72
- } catch {
73
- // Silently ignore parsing errors to maintain stream processing
74
- // This allows the stream to continue even if one record is malformed
75
- }
76
- }
77
-
78
- // Process any remaining data in the buffer after stream is done
79
- if (buffer) {
80
- try {
81
- yield JSON.parse(buffer);
82
- } catch {
83
- // Ignore parsing error for final chunk
84
- }
85
- }
86
- } finally {
87
- // Always ensure we clean up the reader
88
- reader.cancel().catch(() => {
89
- // Ignore cancel errors
90
- });
91
- }
92
- }
93
-
94
- /**
95
- * Retrieves details about the vNext workflow
96
- * @returns Promise containing vNext workflow details including steps and graphs
97
- */
98
- details(): Promise<GetVNextWorkflowResponse> {
99
- return this.request(`/api/workflows/v-next/${this.workflowId}`);
25
+ details(): Promise<GetLegacyWorkflowResponse> {
26
+ return this.request(`/api/workflows/legacy/${this.workflowId}`);
100
27
  }
101
28
 
102
29
  /**
103
- * Retrieves all runs for a vNext workflow
30
+ * Retrieves all runs for a legacy workflow
104
31
  * @param params - Parameters for filtering runs
105
- * @returns Promise containing vNext workflow runs array
32
+ * @returns Promise containing legacy workflow runs array
106
33
  */
107
- runs(params?: GetWorkflowRunsParams): Promise<GetWorkflowRunsResponse> {
34
+ runs(params?: GetWorkflowRunsParams): Promise<GetLegacyWorkflowRunsResponse> {
108
35
  const searchParams = new URLSearchParams();
109
36
  if (params?.fromDate) {
110
37
  searchParams.set('fromDate', params.fromDate.toISOString());
@@ -123,16 +50,15 @@ export class VNextWorkflow extends BaseResource {
123
50
  }
124
51
 
125
52
  if (searchParams.size) {
126
- return this.request(`/api/workflows/v-next/${this.workflowId}/runs?${searchParams}`);
53
+ return this.request(`/api/workflows/legacy/${this.workflowId}/runs?${searchParams}`);
127
54
  } else {
128
- return this.request(`/api/workflows/v-next/${this.workflowId}/runs`);
55
+ return this.request(`/api/workflows/legacy/${this.workflowId}/runs`);
129
56
  }
130
57
  }
131
58
 
132
59
  /**
133
- * Creates a new vNext workflow run
134
- * @param params - Optional object containing the optional runId
135
- * @returns Promise containing the runId of the created run
60
+ * Creates a new legacy workflow run
61
+ * @returns Promise containing the generated run ID
136
62
  */
137
63
  createRun(params?: { runId?: string }): Promise<{ runId: string }> {
138
64
  const searchParams = new URLSearchParams();
@@ -141,109 +67,168 @@ export class VNextWorkflow extends BaseResource {
141
67
  searchParams.set('runId', params.runId);
142
68
  }
143
69
 
144
- return this.request(`/api/workflows/v-next/${this.workflowId}/create-run?${searchParams.toString()}`, {
70
+ return this.request(`/api/workflows/legacy/${this.workflowId}/create-run?${searchParams.toString()}`, {
145
71
  method: 'POST',
146
72
  });
147
73
  }
148
74
 
149
75
  /**
150
- * Starts a vNext workflow run synchronously without waiting for the workflow to complete
151
- * @param params - Object containing the runId, inputData and runtimeContext
76
+ * Starts a legacy workflow run synchronously without waiting for the workflow to complete
77
+ * @param params - Object containing the runId and triggerData
152
78
  * @returns Promise containing success message
153
79
  */
154
- start(params: {
155
- runId: string;
156
- inputData: Record<string, any>;
157
- runtimeContext?: RuntimeContext;
158
- }): Promise<{ message: string }> {
159
- return this.request(`/api/workflows/v-next/${this.workflowId}/start?runId=${params.runId}`, {
80
+ start(params: { runId: string; triggerData: Record<string, any> }): Promise<{ message: string }> {
81
+ return this.request(`/api/workflows/legacy/${this.workflowId}/start?runId=${params.runId}`, {
160
82
  method: 'POST',
161
- body: { inputData: params?.inputData, runtimeContext: params.runtimeContext },
83
+ body: params?.triggerData,
162
84
  });
163
85
  }
164
86
 
165
87
  /**
166
- * Resumes a suspended vNext workflow step synchronously without waiting for the vNext workflow to complete
167
- * @param params - Object containing the runId, step, resumeData and runtimeContext
168
- * @returns Promise containing success message
88
+ * Resumes a suspended legacy workflow step synchronously without waiting for the workflow to complete
89
+ * @param stepId - ID of the step to resume
90
+ * @param runId - ID of the legacy workflow run
91
+ * @param context - Context to resume the legacy workflow with
92
+ * @returns Promise containing the legacy workflow resume results
169
93
  */
170
94
  resume({
171
- step,
95
+ stepId,
172
96
  runId,
173
- resumeData,
174
- runtimeContext,
97
+ context,
175
98
  }: {
176
- step: string | string[];
99
+ stepId: string;
177
100
  runId: string;
178
- resumeData?: Record<string, any>;
179
- runtimeContext?: RuntimeContext;
101
+ context: Record<string, any>;
180
102
  }): Promise<{ message: string }> {
181
- return this.request(`/api/workflows/v-next/${this.workflowId}/resume?runId=${runId}`, {
103
+ return this.request(`/api/workflows/legacy/${this.workflowId}/resume?runId=${runId}`, {
182
104
  method: 'POST',
183
- stream: true,
184
105
  body: {
185
- step,
186
- resumeData,
187
- runtimeContext,
106
+ stepId,
107
+ context,
188
108
  },
189
109
  });
190
110
  }
191
111
 
192
112
  /**
193
- * Starts a vNext workflow run asynchronously and returns a promise that resolves when the vNext workflow is complete
194
- * @param params - Object containing the optional runId, inputData and runtimeContext
195
- * @returns Promise containing the vNext workflow execution results
113
+ * Starts a workflow run asynchronously and returns a promise that resolves when the workflow is complete
114
+ * @param params - Object containing the optional runId and triggerData
115
+ * @returns Promise containing the workflow execution results
196
116
  */
197
- startAsync(params: {
198
- runId?: string;
199
- inputData: Record<string, any>;
200
- runtimeContext?: RuntimeContext;
201
- }): Promise<VNextWorkflowRunResult> {
117
+ startAsync(params: { runId?: string; triggerData: Record<string, any> }): Promise<LegacyWorkflowRunResult> {
202
118
  const searchParams = new URLSearchParams();
203
119
 
204
120
  if (!!params?.runId) {
205
121
  searchParams.set('runId', params.runId);
206
122
  }
207
123
 
208
- return this.request(`/api/workflows/v-next/${this.workflowId}/start-async?${searchParams.toString()}`, {
124
+ return this.request(`/api/workflows/legacy/${this.workflowId}/start-async?${searchParams.toString()}`, {
209
125
  method: 'POST',
210
- body: { inputData: params.inputData, runtimeContext: params.runtimeContext },
126
+ body: params?.triggerData,
211
127
  });
212
128
  }
213
129
 
214
130
  /**
215
- * Resumes a suspended vNext workflow step asynchronously and returns a promise that resolves when the vNext workflow is complete
216
- * @param params - Object containing the runId, step, resumeData and runtimeContext
217
- * @returns Promise containing the vNext workflow resume results
131
+ * Resumes a suspended legacy workflow step asynchronously and returns a promise that resolves when the workflow is complete
132
+ * @param params - Object containing the runId, stepId, and context
133
+ * @returns Promise containing the workflow resume results
218
134
  */
219
135
  resumeAsync(params: {
220
136
  runId: string;
221
- step: string | string[];
222
- resumeData?: Record<string, any>;
223
- runtimeContext?: RuntimeContext;
224
- }): Promise<VNextWorkflowRunResult> {
225
- return this.request(`/api/workflows/v-next/${this.workflowId}/resume-async?runId=${params.runId}`, {
137
+ stepId: string;
138
+ context: Record<string, any>;
139
+ }): Promise<LegacyWorkflowRunResult> {
140
+ return this.request(`/api/workflows/legacy/${this.workflowId}/resume-async?runId=${params.runId}`, {
226
141
  method: 'POST',
227
142
  body: {
228
- step: params.step,
229
- resumeData: params.resumeData,
230
- runtimeContext: params.runtimeContext,
143
+ stepId: params.stepId,
144
+ context: params.context,
231
145
  },
232
146
  });
233
147
  }
234
148
 
235
149
  /**
236
- * Watches vNext workflow transitions in real-time
150
+ * Creates an async generator that processes a readable stream and yields records
151
+ * separated by the Record Separator character (\x1E)
152
+ *
153
+ * @param stream - The readable stream to process
154
+ * @returns An async generator that yields parsed records
155
+ */
156
+ private async *streamProcessor(stream: ReadableStream): AsyncGenerator<LegacyWorkflowRunResult, void, unknown> {
157
+ const reader = stream.getReader();
158
+
159
+ // Track if we've finished reading from the stream
160
+ let doneReading = false;
161
+ // Buffer to accumulate partial chunks
162
+ let buffer = '';
163
+
164
+ try {
165
+ while (!doneReading) {
166
+ // Read the next chunk from the stream
167
+ const { done, value } = await reader.read();
168
+ doneReading = done;
169
+
170
+ // Skip processing if we're done and there's no value
171
+ if (done && !value) continue;
172
+
173
+ try {
174
+ // Decode binary data to text
175
+ const decoded = value ? new TextDecoder().decode(value) : '';
176
+
177
+ // Split the combined buffer and new data by record separator
178
+ const chunks = (buffer + decoded).split(RECORD_SEPARATOR);
179
+
180
+ // The last chunk might be incomplete, so save it for the next iteration
181
+ buffer = chunks.pop() || '';
182
+
183
+ // Process complete chunks
184
+ for (const chunk of chunks) {
185
+ if (chunk) {
186
+ // Only process non-empty chunks
187
+ if (typeof chunk === 'string') {
188
+ try {
189
+ const parsedChunk = JSON.parse(chunk);
190
+ yield parsedChunk;
191
+ } catch {
192
+ // Silently ignore parsing errors to maintain stream processing
193
+ // This allows the stream to continue even if one record is malformed
194
+ }
195
+ }
196
+ }
197
+ }
198
+ } catch {
199
+ // Silently ignore parsing errors to maintain stream processing
200
+ // This allows the stream to continue even if one record is malformed
201
+ }
202
+ }
203
+
204
+ // Process any remaining data in the buffer after stream is done
205
+ if (buffer) {
206
+ try {
207
+ yield JSON.parse(buffer);
208
+ } catch {
209
+ // Ignore parsing error for final chunk
210
+ }
211
+ }
212
+ } finally {
213
+ // Always ensure we clean up the reader
214
+ reader.cancel().catch(() => {
215
+ // Ignore cancel errors
216
+ });
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Watches legacy workflow transitions in real-time
237
222
  * @param runId - Optional run ID to filter the watch stream
238
- * @returns AsyncGenerator that yields parsed records from the vNext workflow watch stream
223
+ * @returns AsyncGenerator that yields parsed records from the legacy workflow watch stream
239
224
  */
240
- async watch({ runId }: { runId?: string }, onRecord: (record: VNextWorkflowWatchResult) => void) {
241
- const response: Response = await this.request(`/api/workflows/v-next/${this.workflowId}/watch?runId=${runId}`, {
225
+ async watch({ runId }: { runId?: string }, onRecord: (record: LegacyWorkflowRunResult) => void) {
226
+ const response: Response = await this.request(`/api/workflows/legacy/${this.workflowId}/watch?runId=${runId}`, {
242
227
  stream: true,
243
228
  });
244
229
 
245
230
  if (!response.ok) {
246
- throw new Error(`Failed to watch vNext workflow: ${response.statusText}`);
231
+ throw new Error(`Failed to watch legacy workflow: ${response.statusText}`);
247
232
  }
248
233
 
249
234
  if (!response.body) {
@@ -0,0 +1,48 @@
1
+ import type { RuntimeContext } from '@mastra/core/runtime-context';
2
+ import type { ClientOptions, McpToolInfo } from '../types';
3
+ import { BaseResource } from './base';
4
+
5
+ /**
6
+ * Represents a specific tool available on a specific MCP server.
7
+ * Provides methods to get details and execute the tool.
8
+ */
9
+ export class MCPTool extends BaseResource {
10
+ private serverId: string;
11
+ private toolId: string;
12
+
13
+ constructor(options: ClientOptions, serverId: string, toolId: string) {
14
+ super(options);
15
+ this.serverId = serverId;
16
+ this.toolId = toolId;
17
+ }
18
+
19
+ /**
20
+ * Retrieves details about this specific tool from the MCP server.
21
+ * @returns Promise containing the tool's information (name, description, schema).
22
+ */
23
+ details(): Promise<McpToolInfo> {
24
+ return this.request(`/api/mcp/${this.serverId}/tools/${this.toolId}`);
25
+ }
26
+
27
+ /**
28
+ * Executes this specific tool on the MCP server.
29
+ * @param params - Parameters for tool execution, including data/args and optional runtimeContext.
30
+ * @returns Promise containing the result of the tool execution.
31
+ */
32
+ execute(params: { data?: any; runtimeContext?: RuntimeContext }): Promise<any> {
33
+ const body: any = {};
34
+ if (params.data !== undefined) body.data = params.data;
35
+ // If none of data, args the body might be empty or just contain runtimeContext.
36
+ // The handler will look for these, so an empty args object might be appropriate if that's the intent.
37
+ // else body.data = {}; // Or let it be empty if no specific input fields are used
38
+
39
+ if (params.runtimeContext !== undefined) {
40
+ body.runtimeContext = params.runtimeContext;
41
+ }
42
+
43
+ return this.request(`/api/mcp/${this.serverId}/tools/${this.toolId}/execute`, {
44
+ method: 'POST',
45
+ body: Object.keys(body).length > 0 ? body : undefined,
46
+ });
47
+ }
48
+ }