@mastra/server 1.58.0-alpha.4 → 1.58.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.
- package/CHANGELOG.md +11 -0
- package/dist/{agent-builder-DAiJH1u2.cjs → agent-builder-Bq8VQxPt.cjs} +2 -2
- package/dist/{agent-builder-DAiJH1u2.cjs.map → agent-builder-Bq8VQxPt.cjs.map} +1 -1
- package/dist/{agent-builder-gGFywDVq.js → agent-builder-DVv4fSab.js} +2 -2
- package/dist/{agent-builder-gGFywDVq.js.map → agent-builder-DVv4fSab.js.map} +1 -1
- package/dist/{api-schema-manifest-B4J_QYOr.js → api-schema-manifest-CtRYAXKX.js} +2 -2
- package/dist/{api-schema-manifest-B4J_QYOr.js.map → api-schema-manifest-CtRYAXKX.js.map} +1 -1
- package/dist/{api-schema-manifest-B3bC-D98.cjs → api-schema-manifest-tsMOBlmY.cjs} +2 -2
- package/dist/{api-schema-manifest-B3bC-D98.cjs.map → api-schema-manifest-tsMOBlmY.cjs.map} +1 -1
- package/dist/{dist-BKRMiJcn.js → dist-DkY6iCA4.js} +64 -35
- package/dist/dist-DkY6iCA4.js.map +1 -0
- package/dist/{dist-C2-SedDQ.cjs → dist-fvOsjRn_.cjs} +64 -35
- package/dist/dist-fvOsjRn_.cjs.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-server-routes.md +9 -9
- package/dist/{stored-workflows-OanG0TmB.js → dynamic-workflows-B4LI2B52.js} +61 -61
- package/dist/dynamic-workflows-B4LI2B52.js.map +1 -0
- package/dist/{stored-workflows-pCiWK305.cjs → dynamic-workflows-BXeywVEf.cjs} +70 -70
- package/dist/dynamic-workflows-BXeywVEf.cjs.map +1 -0
- package/dist/{routes-CZwPlO3-.cjs → routes-BRGPk2DE.cjs} +17 -17
- package/dist/routes-BRGPk2DE.cjs.map +1 -0
- package/dist/{routes-HUaCyUb7.js → routes-cMGFe7yS.js} +17 -17
- package/dist/routes-cMGFe7yS.js.map +1 -0
- package/dist/server/handlers/agent-builder.cjs +3 -3
- package/dist/server/handlers/agent-builder.d.ts +4 -4
- package/dist/server/handlers/agent-builder.js +3 -3
- package/dist/server/handlers/dynamic-workflows.cjs +6 -0
- package/dist/server/handlers/{stored-workflows.d.ts → dynamic-workflows.d.ts} +14 -14
- package/dist/server/handlers/{stored-workflows.d.ts.map → dynamic-workflows.d.ts.map} +1 -1
- package/dist/server/handlers/dynamic-workflows.js +2 -0
- package/dist/server/handlers/system.cjs +1 -1
- package/dist/server/handlers/system.js +1 -1
- package/dist/server/handlers/workflows.cjs +1 -1
- package/dist/server/handlers/workflows.d.ts +4 -4
- package/dist/server/handlers/workflows.js +1 -1
- package/dist/server/handlers.cjs +7 -7
- package/dist/server/handlers.d.ts +1 -1
- package/dist/server/handlers.d.ts.map +1 -1
- package/dist/server/handlers.js +2 -2
- package/dist/server/schemas/{stored-workflows.d.ts → dynamic-workflows.d.ts} +13 -13
- package/dist/server/schemas/dynamic-workflows.d.ts.map +1 -0
- package/dist/server/schemas/index.cjs +2 -2
- package/dist/server/schemas/index.js +2 -2
- package/dist/server/schemas/workflows.d.ts +2 -2
- package/dist/server/server-adapter/index.cjs +1 -1
- package/dist/server/server-adapter/index.js +1 -1
- package/dist/server/server-adapter/routes/agent-builder.d.ts +4 -4
- package/dist/server/server-adapter/routes/dynamic-workflows.d.ts +16 -0
- package/dist/server/server-adapter/routes/dynamic-workflows.d.ts.map +1 -0
- package/dist/server/server-adapter/routes/index.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/workflows.d.ts +4 -4
- package/dist/{workflows-Dzxr6cmf.cjs → workflows-BPDvo87u.cjs} +2 -2
- package/dist/workflows-BPDvo87u.cjs.map +1 -0
- package/dist/{workflows-CMU5dz_4.js → workflows-Dzl1i83M.js} +2 -2
- package/dist/workflows-Dzl1i83M.js.map +1 -0
- package/package.json +8 -8
- package/dist/dist-BKRMiJcn.js.map +0 -1
- package/dist/dist-C2-SedDQ.cjs.map +0 -1
- package/dist/routes-CZwPlO3-.cjs.map +0 -1
- package/dist/routes-HUaCyUb7.js.map +0 -1
- package/dist/server/handlers/stored-workflows.cjs +0 -6
- package/dist/server/handlers/stored-workflows.js +0 -2
- package/dist/server/schemas/stored-workflows.d.ts.map +0 -1
- package/dist/server/server-adapter/routes/stored-workflows.d.ts +0 -16
- package/dist/server/server-adapter/routes/stored-workflows.d.ts.map +0 -1
- package/dist/stored-workflows-OanG0TmB.js.map +0 -1
- package/dist/stored-workflows-pCiWK305.cjs.map +0 -1
- package/dist/workflows-CMU5dz_4.js.map +0 -1
- package/dist/workflows-Dzxr6cmf.cjs.map +0 -1
package/dist/docs/SKILL.md
CHANGED
|
@@ -197,18 +197,18 @@ The `/api/workflows/run-counts` endpoint returns counts of `running` and [`suspe
|
|
|
197
197
|
}
|
|
198
198
|
```
|
|
199
199
|
|
|
200
|
-
###
|
|
200
|
+
### Dynamic workflows
|
|
201
201
|
|
|
202
|
-
|
|
202
|
+
Dynamic workflow definitions (beta) are workflows expressed as JSON, persisted through the `workflowDefinitions` storage domain, and live-registered on the running instance. See [Dynamic workflows](https://mastra.ai/docs/workflows/dynamic-workflows).
|
|
203
203
|
|
|
204
|
-
| Method | Path
|
|
205
|
-
| -------- |
|
|
206
|
-
| `GET` | `/api/stored/workflows`
|
|
207
|
-
| `GET` | `/api/stored/workflows/:
|
|
208
|
-
| `POST` | `/api/stored/workflows`
|
|
209
|
-
| `DELETE` | `/api/stored/workflows/:
|
|
204
|
+
| Method | Path | Description |
|
|
205
|
+
| -------- | ------------------------------------------ | ------------------------------------------------------------------------------ |
|
|
206
|
+
| `GET` | `/api/stored/workflows` | List dynamic workflow definitions, filterable by `status` and `authorId` |
|
|
207
|
+
| `GET` | `/api/stored/workflows/:dynamicWorkflowId` | Get a dynamic workflow definition by ID |
|
|
208
|
+
| `POST` | `/api/stored/workflows` | Upsert a definition (plus optional helper `dependencies`) and live-register it |
|
|
209
|
+
| `DELETE` | `/api/stored/workflows/:dynamicWorkflowId` | Delete a dynamic workflow definition and unregister the live workflow |
|
|
210
210
|
|
|
211
|
-
On authenticated servers, the read routes require the `stored-workflows:read` permission and the write routes require `stored-workflows:write`. Registered
|
|
211
|
+
On authenticated servers, the read routes require the `stored-workflows:read` permission and the write routes require `stored-workflows:write`. Registered dynamic workflows are executed through the ordinary `/api/workflows/:workflowId` routes above.
|
|
212
212
|
|
|
213
213
|
### Create run request body
|
|
214
214
|
|
|
@@ -3,7 +3,7 @@ import { t as HTTPException } from "./http-exception-CyfxZB6W.js";
|
|
|
3
3
|
import { n as createRoute } from "./route-builder-CIk5k35M.js";
|
|
4
4
|
import { handleError } from "./server/handlers/error.js";
|
|
5
5
|
import { z } from "zod/v4";
|
|
6
|
-
//#region src/server/schemas/
|
|
6
|
+
//#region src/server/schemas/dynamic-workflows.ts
|
|
7
7
|
const stepOptionsSchema = z.object({
|
|
8
8
|
retries: z.number().int().nonnegative().optional(),
|
|
9
9
|
metadata: z.record(z.string(), z.unknown()).optional()
|
|
@@ -126,16 +126,16 @@ const graphEntrySchema = z.discriminatedUnion("type", [
|
|
|
126
126
|
predicate: predicateSchema
|
|
127
127
|
})
|
|
128
128
|
]);
|
|
129
|
-
const
|
|
130
|
-
const
|
|
131
|
-
status: z.enum(["active", "archived"]).optional().describe("Filter
|
|
132
|
-
authorId: z.string().optional().describe("Filter
|
|
129
|
+
const dynamicWorkflowIdPathParams = z.object({ dynamicWorkflowId: z.string().describe("Unique identifier for the dynamic workflow definition") });
|
|
130
|
+
const listDynamicWorkflowsQuerySchema = z.object({
|
|
131
|
+
status: z.enum(["active", "archived"]).optional().describe("Filter dynamic workflows by status (defaults to active when omitted by the handler)"),
|
|
132
|
+
authorId: z.string().optional().describe("Filter dynamic workflows by author identifier")
|
|
133
133
|
});
|
|
134
134
|
/**
|
|
135
135
|
* One static workflow definition on the wire. Matches the input shape of
|
|
136
|
-
* `mastra.
|
|
136
|
+
* `mastra.addDynamicWorkflow()`.
|
|
137
137
|
*/
|
|
138
|
-
const
|
|
138
|
+
const dynamicWorkflowDefinitionBodySchema = z.object({
|
|
139
139
|
id: z.string().describe("Workflow id — kebab-case, descriptive"),
|
|
140
140
|
description: z.string().optional(),
|
|
141
141
|
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
@@ -149,11 +149,11 @@ const storedWorkflowDefinitionBodySchema = z.object({
|
|
|
149
149
|
* Body for `POST /stored/workflows` — upsert a static workflow definition,
|
|
150
150
|
* optionally together with the helper workflows it nests.
|
|
151
151
|
*/
|
|
152
|
-
const
|
|
152
|
+
const upsertDynamicWorkflowBodySchema = dynamicWorkflowDefinitionBodySchema.extend({ dependencies: z.array(dynamicWorkflowDefinitionBodySchema).optional().describe("Helper workflow definitions this workflow nests. Saved with it as one unit — the whole set is validated together, hydrated in derived dependency order, and rejected together, so a failed save never leaves orphaned helpers behind. Each helper becomes an ordinary dynamic workflow in its own right.") });
|
|
153
153
|
/**
|
|
154
|
-
* Shape returned for any single
|
|
154
|
+
* Shape returned for any single dynamic workflow row.
|
|
155
155
|
*/
|
|
156
|
-
const
|
|
156
|
+
const dynamicWorkflowResponseSchema = z.object({
|
|
157
157
|
id: z.string(),
|
|
158
158
|
description: z.string().optional(),
|
|
159
159
|
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
@@ -168,27 +168,27 @@ const storedWorkflowResponseSchema = z.object({
|
|
|
168
168
|
createdAt: z.union([z.date(), z.string()]),
|
|
169
169
|
updatedAt: z.union([z.date(), z.string()])
|
|
170
170
|
});
|
|
171
|
-
const
|
|
172
|
-
workflows: z.array(
|
|
171
|
+
const listDynamicWorkflowsResponseSchema = z.object({
|
|
172
|
+
workflows: z.array(dynamicWorkflowResponseSchema),
|
|
173
173
|
total: z.number()
|
|
174
174
|
});
|
|
175
|
-
const
|
|
176
|
-
const
|
|
175
|
+
const getDynamicWorkflowResponseSchema = dynamicWorkflowResponseSchema;
|
|
176
|
+
const upsertDynamicWorkflowResponseSchema = z.object({
|
|
177
177
|
ok: z.literal(true),
|
|
178
178
|
id: z.string(),
|
|
179
179
|
dependencyIds: z.array(z.string()).optional().describe("Ids of the helper workflows saved alongside this one. Present only when dependencies were supplied.")
|
|
180
180
|
});
|
|
181
|
-
const
|
|
181
|
+
const deleteDynamicWorkflowResponseSchema = z.object({
|
|
182
182
|
success: z.literal(true),
|
|
183
183
|
message: z.string()
|
|
184
184
|
});
|
|
185
185
|
//#endregion
|
|
186
|
-
//#region src/server/handlers/
|
|
187
|
-
var
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
186
|
+
//#region src/server/handlers/dynamic-workflows.ts
|
|
187
|
+
var dynamic_workflows_exports = /* @__PURE__ */ __exportAll({
|
|
188
|
+
DELETE_DYNAMIC_WORKFLOW_ROUTE: () => DELETE_DYNAMIC_WORKFLOW_ROUTE,
|
|
189
|
+
GET_DYNAMIC_WORKFLOW_ROUTE: () => GET_DYNAMIC_WORKFLOW_ROUTE,
|
|
190
|
+
LIST_DYNAMIC_WORKFLOWS_ROUTE: () => LIST_DYNAMIC_WORKFLOWS_ROUTE,
|
|
191
|
+
UPSERT_DYNAMIC_WORKFLOW_ROUTE: () => UPSERT_DYNAMIC_WORKFLOW_ROUTE
|
|
192
192
|
});
|
|
193
193
|
/**
|
|
194
194
|
* GET /stored/workflows — list stored static workflow definitions.
|
|
@@ -196,15 +196,15 @@ var stored_workflows_exports = /* @__PURE__ */ __exportAll({
|
|
|
196
196
|
* Mirrors `LIST_STORED_AGENTS_ROUTE` but without favorites/visibility/authorship
|
|
197
197
|
* scoping (which the workflow-definitions domain doesn't carry in v1).
|
|
198
198
|
*/
|
|
199
|
-
const
|
|
199
|
+
const LIST_DYNAMIC_WORKFLOWS_ROUTE = createRoute({
|
|
200
200
|
method: "GET",
|
|
201
201
|
path: "/stored/workflows",
|
|
202
202
|
responseType: "json",
|
|
203
|
-
queryParamSchema:
|
|
204
|
-
responseSchema:
|
|
205
|
-
summary: "List
|
|
203
|
+
queryParamSchema: listDynamicWorkflowsQuerySchema,
|
|
204
|
+
responseSchema: listDynamicWorkflowsResponseSchema,
|
|
205
|
+
summary: "List dynamic workflow definitions",
|
|
206
206
|
description: "Returns workflow definitions persisted to storage. Filterable by status and authorId.",
|
|
207
|
-
tags: ["
|
|
207
|
+
tags: ["Dynamic Workflows"],
|
|
208
208
|
requiresAuth: true,
|
|
209
209
|
requiresPermission: "stored-workflows:read",
|
|
210
210
|
handler: async ({ mastra, status, authorId }) => {
|
|
@@ -222,35 +222,35 @@ const LIST_STORED_WORKFLOWS_ROUTE = createRoute({
|
|
|
222
222
|
total: result.total
|
|
223
223
|
};
|
|
224
224
|
} catch (error) {
|
|
225
|
-
return handleError(error, "Error listing
|
|
225
|
+
return handleError(error, "Error listing dynamic workflows");
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
});
|
|
229
229
|
/**
|
|
230
|
-
* GET /stored/workflows/:
|
|
230
|
+
* GET /stored/workflows/:dynamicWorkflowId — get one dynamic workflow.
|
|
231
231
|
*/
|
|
232
|
-
const
|
|
232
|
+
const GET_DYNAMIC_WORKFLOW_ROUTE = createRoute({
|
|
233
233
|
method: "GET",
|
|
234
|
-
path: "/stored/workflows/:
|
|
234
|
+
path: "/stored/workflows/:dynamicWorkflowId",
|
|
235
235
|
responseType: "json",
|
|
236
|
-
pathParamSchema:
|
|
237
|
-
responseSchema:
|
|
238
|
-
summary: "Get a
|
|
236
|
+
pathParamSchema: dynamicWorkflowIdPathParams,
|
|
237
|
+
responseSchema: getDynamicWorkflowResponseSchema,
|
|
238
|
+
summary: "Get a dynamic workflow definition by id",
|
|
239
239
|
description: "Returns a single workflow definition persisted to storage.",
|
|
240
|
-
tags: ["
|
|
240
|
+
tags: ["Dynamic Workflows"],
|
|
241
241
|
requiresAuth: true,
|
|
242
242
|
requiresPermission: "stored-workflows:read",
|
|
243
|
-
handler: async ({ mastra,
|
|
243
|
+
handler: async ({ mastra, dynamicWorkflowId }) => {
|
|
244
244
|
try {
|
|
245
245
|
const storage = mastra.getStorage();
|
|
246
246
|
if (!storage) throw new HTTPException(500, { message: "Storage is not configured" });
|
|
247
247
|
const store = await storage.getStore("workflowDefinitions");
|
|
248
248
|
if (!store) throw new HTTPException(500, { message: "workflowDefinitions storage domain is not available" });
|
|
249
|
-
const def = await store.get(
|
|
250
|
-
if (!def) throw new HTTPException(404, { message: `
|
|
249
|
+
const def = await store.get(dynamicWorkflowId);
|
|
250
|
+
if (!def) throw new HTTPException(404, { message: `Dynamic workflow "${dynamicWorkflowId}" not found` });
|
|
251
251
|
return def;
|
|
252
252
|
} catch (error) {
|
|
253
|
-
return handleError(error, "Error getting
|
|
253
|
+
return handleError(error, "Error getting dynamic workflow");
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
});
|
|
@@ -258,20 +258,20 @@ const GET_STORED_WORKFLOW_ROUTE = createRoute({
|
|
|
258
258
|
* POST /stored/workflows — upsert a static workflow definition and live-register
|
|
259
259
|
* it on the Mastra instance.
|
|
260
260
|
*
|
|
261
|
-
* Calls `mastra.
|
|
261
|
+
* Calls `mastra.addDynamicWorkflow(def)` which persists the row + rehydrates a
|
|
262
262
|
* runnable workflow + registers it via `mastra.addWorkflow(workflow, id)`.
|
|
263
263
|
* After this returns, `GET /workflows/:id` and `POST /workflows/:id/run` work
|
|
264
264
|
* immediately — no server restart needed.
|
|
265
265
|
*/
|
|
266
|
-
const
|
|
266
|
+
const UPSERT_DYNAMIC_WORKFLOW_ROUTE = createRoute({
|
|
267
267
|
method: "POST",
|
|
268
268
|
path: "/stored/workflows",
|
|
269
269
|
responseType: "json",
|
|
270
|
-
bodySchema:
|
|
271
|
-
responseSchema:
|
|
272
|
-
summary: "Upsert a
|
|
270
|
+
bodySchema: upsertDynamicWorkflowBodySchema,
|
|
271
|
+
responseSchema: upsertDynamicWorkflowResponseSchema,
|
|
272
|
+
summary: "Upsert a dynamic workflow definition and live-register it",
|
|
273
273
|
description: "Persists a static workflow definition and live-registers it on the running Mastra instance. Idempotent — same id updates in place.",
|
|
274
|
-
tags: ["
|
|
274
|
+
tags: ["Dynamic Workflows"],
|
|
275
275
|
requiresAuth: true,
|
|
276
276
|
requiresPermission: "stored-workflows:write",
|
|
277
277
|
handler: async ({ mastra, id, description, metadata, inputSchema, outputSchema, stateSchema, requestContextSchema, graph, dependencies }) => {
|
|
@@ -287,52 +287,52 @@ const UPSERT_STORED_WORKFLOW_ROUTE = createRoute({
|
|
|
287
287
|
graph
|
|
288
288
|
};
|
|
289
289
|
const bundle = [...dependencies ?? [], def];
|
|
290
|
-
await mastra.
|
|
290
|
+
await mastra.addDynamicWorkflows(bundle);
|
|
291
291
|
return {
|
|
292
292
|
ok: true,
|
|
293
293
|
id: def.id,
|
|
294
294
|
...dependencies?.length ? { dependencyIds: dependencies.map((dependency) => dependency.id) } : {}
|
|
295
295
|
};
|
|
296
296
|
} catch (error) {
|
|
297
|
-
return handleError(error, "Error upserting
|
|
297
|
+
return handleError(error, "Error upserting dynamic workflow");
|
|
298
298
|
}
|
|
299
299
|
}
|
|
300
300
|
});
|
|
301
301
|
/**
|
|
302
|
-
* DELETE /stored/workflows/:
|
|
302
|
+
* DELETE /stored/workflows/:dynamicWorkflowId — delete a dynamic workflow.
|
|
303
303
|
*
|
|
304
304
|
* Removes the row from storage AND un-registers the live Workflow instance so
|
|
305
305
|
* a subsequent POST with the same id starts from a clean slate. Idempotent.
|
|
306
306
|
*/
|
|
307
|
-
const
|
|
307
|
+
const DELETE_DYNAMIC_WORKFLOW_ROUTE = createRoute({
|
|
308
308
|
method: "DELETE",
|
|
309
|
-
path: "/stored/workflows/:
|
|
309
|
+
path: "/stored/workflows/:dynamicWorkflowId",
|
|
310
310
|
responseType: "json",
|
|
311
|
-
pathParamSchema:
|
|
312
|
-
responseSchema:
|
|
313
|
-
summary: "Delete a
|
|
314
|
-
description: "Removes a
|
|
315
|
-
tags: ["
|
|
311
|
+
pathParamSchema: dynamicWorkflowIdPathParams,
|
|
312
|
+
responseSchema: deleteDynamicWorkflowResponseSchema,
|
|
313
|
+
summary: "Delete a dynamic workflow definition",
|
|
314
|
+
description: "Removes a dynamic workflow definition and unregisters the live workflow instance. Idempotent.",
|
|
315
|
+
tags: ["Dynamic Workflows"],
|
|
316
316
|
requiresAuth: true,
|
|
317
317
|
requiresPermission: "stored-workflows:write",
|
|
318
|
-
handler: async ({ mastra,
|
|
318
|
+
handler: async ({ mastra, dynamicWorkflowId }) => {
|
|
319
319
|
try {
|
|
320
320
|
const storage = mastra.getStorage();
|
|
321
321
|
if (!storage) throw new HTTPException(500, { message: "Storage is not configured" });
|
|
322
322
|
const store = await storage.getStore("workflowDefinitions");
|
|
323
323
|
if (!store) throw new HTTPException(500, { message: "workflowDefinitions storage domain is not available" });
|
|
324
|
-
await store.delete(
|
|
325
|
-
mastra.removeWorkflow(
|
|
324
|
+
await store.delete(dynamicWorkflowId);
|
|
325
|
+
mastra.removeWorkflow(dynamicWorkflowId);
|
|
326
326
|
return {
|
|
327
327
|
success: true,
|
|
328
|
-
message: `Workflow ${
|
|
328
|
+
message: `Workflow ${dynamicWorkflowId} deleted`
|
|
329
329
|
};
|
|
330
330
|
} catch (error) {
|
|
331
|
-
return handleError(error, "Error deleting
|
|
331
|
+
return handleError(error, "Error deleting dynamic workflow");
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
334
|
});
|
|
335
335
|
//#endregion
|
|
336
|
-
export {
|
|
336
|
+
export { dynamic_workflows_exports as a, UPSERT_DYNAMIC_WORKFLOW_ROUTE as i, GET_DYNAMIC_WORKFLOW_ROUTE as n, LIST_DYNAMIC_WORKFLOWS_ROUTE as r, DELETE_DYNAMIC_WORKFLOW_ROUTE as t };
|
|
337
337
|
|
|
338
|
-
//# sourceMappingURL=
|
|
338
|
+
//# sourceMappingURL=dynamic-workflows-B4LI2B52.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-workflows-B4LI2B52.js","names":[],"sources":["../src/server/schemas/dynamic-workflows.ts","../src/server/handlers/dynamic-workflows.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\n// ============================================================================\n// Serialized graph — discriminated union mirroring core's SerializedStepFlowEntry.\n// Duplicated locally rather than imported from @mastra/core/workflows because\n// this file's peer-dependency floor predates that export. Structurally\n// compatible with `Mastra.addDynamicWorkflow`'s input; the handler casts once\n// to bridge the remaining wire-vs-runtime divergences (sleepUntil.date as\n// ISO string, fluent-builder-only debug labels) that the core rehydrator\n// handles at runtime.\n// ============================================================================\n\nconst stepOptionsSchema = z\n .object({\n retries: z.number().int().nonnegative().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .optional();\n\n// ----------------------------------------------------------------------------\n// Predicate DSL — declarative condition for `conditional` / `loop` entries.\n// Mirrors `Predicate` in `@mastra/core/workflows/predicate`; duplicated\n// locally for the same peer-floor reason as the graph schema above.\n// ----------------------------------------------------------------------------\nconst literalScalar = z.union([z.string(), z.number(), z.boolean(), z.null()]);\nconst pathOrLiteral: z.ZodType = z.union([\n z.object({ path: z.string().min(1) }).strict(),\n z.object({ literal: literalScalar }).strict(),\n]);\nconst predicateSchema: z.ZodType = z.lazy(() =>\n z.union([\n z\n .object({\n op: z.enum(['eq', 'ne', 'lt', 'lte', 'gt', 'gte']),\n left: pathOrLiteral,\n right: pathOrLiteral,\n })\n .strict(),\n z\n .object({\n op: z.enum(['in', 'notIn']),\n value: pathOrLiteral,\n set: z.array(literalScalar).min(1),\n })\n .strict(),\n z.object({ op: z.enum(['exists', 'notExists']), path: z.string().min(1) }).strict(),\n z.object({ op: z.enum(['truthy', 'falsy']), value: pathOrLiteral }).strict(),\n z.object({ op: z.enum(['and', 'or']), args: z.array(predicateSchema).min(1) }).strict(),\n z.object({ op: z.literal('not'), arg: predicateSchema }).strict(),\n ]),\n);\n\nconst agentEntrySchema = z.object({\n type: z.literal('agent'),\n id: z.string(),\n agentId: z.string(),\n description: z.string().optional(),\n outputSchema: z.record(z.string(), z.unknown()).optional(),\n options: stepOptionsSchema,\n});\n\nconst toolEntrySchema = z.object({\n type: z.literal('tool'),\n id: z.string(),\n toolId: z.string(),\n description: z.string().optional(),\n options: stepOptionsSchema,\n});\n\nconst mappingEntrySchema = z.object({\n type: z.literal('mapping'),\n id: z.string(),\n mapConfig: z.string(),\n});\n\nconst workflowEntrySchema = z.object({\n type: z.literal('workflow'),\n id: z.string(),\n workflowId: z.string(),\n description: z.string().optional(),\n});\n\nconst singleStepEntrySchema = z.discriminatedUnion('type', [\n agentEntrySchema,\n toolEntrySchema,\n mappingEntrySchema,\n workflowEntrySchema,\n]);\n\nconst foreachInnerStepSchema = z.discriminatedUnion('type', [agentEntrySchema, toolEntrySchema, workflowEntrySchema]);\n\nconst graphEntrySchema = z.discriminatedUnion('type', [\n agentEntrySchema,\n toolEntrySchema,\n mappingEntrySchema,\n workflowEntrySchema,\n z.object({\n type: z.literal('parallel'),\n steps: z.array(singleStepEntrySchema),\n }),\n z.object({\n type: z.literal('foreach'),\n step: foreachInnerStepSchema,\n opts: z.object({ concurrency: z.number().int().positive() }).optional(),\n }),\n z.object({\n type: z.literal('sleep'),\n id: z.string(),\n duration: z.number(),\n }),\n z.object({\n type: z.literal('sleepUntil'),\n id: z.string(),\n date: z.string(),\n }),\n z\n .object({\n // Declarative-only conditional. Inbound dynamic workflows must ship a\n // `predicates` array aligned with `steps`; closure-based branches are not\n // accepted over the wire (they'd be arbitrary JS strings we can't\n // safely rehydrate).\n type: z.literal('conditional'),\n steps: z.array(singleStepEntrySchema),\n predicates: z.array(predicateSchema),\n })\n .refine(entry => entry.predicates.length === entry.steps.length, {\n message:\n 'conditional entries must have exactly one predicate per branch (`predicates` and `steps` must be the same length)',\n path: ['predicates'],\n }),\n z.object({\n // Declarative-only loop. Same rationale as `conditional`.\n type: z.literal('loop'),\n step: singleStepEntrySchema,\n loopType: z.enum(['dowhile', 'dountil']),\n predicate: predicateSchema,\n }),\n]);\n\n// ============================================================================\n// Path params\n// ============================================================================\n\nexport const dynamicWorkflowIdPathParams = z.object({\n dynamicWorkflowId: z.string().describe('Unique identifier for the dynamic workflow definition'),\n});\n\n// ============================================================================\n// Query params\n// ============================================================================\n\nexport const listDynamicWorkflowsQuerySchema = z.object({\n status: z\n .enum(['active', 'archived'])\n .optional()\n .describe('Filter dynamic workflows by status (defaults to active when omitted by the handler)'),\n authorId: z.string().optional().describe('Filter dynamic workflows by author identifier'),\n});\n\n// ============================================================================\n// Body schemas\n// ============================================================================\n\n/**\n * One static workflow definition on the wire. Matches the input shape of\n * `mastra.addDynamicWorkflow()`.\n */\nexport const dynamicWorkflowDefinitionBodySchema = z.object({\n id: z.string().describe('Workflow id — kebab-case, descriptive'),\n description: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n // Schemas are loose object bags by design: different JSON Schema producers\n // emit slightly different shapes and core's `JsonSchema` type is\n // `Record<string, any>`. Using `z.record` here aligns with that shape so\n // no cast is needed at the handler boundary.\n inputSchema: z.record(z.string(), z.unknown()).describe('JSON Schema (Draft 2020-12) for the workflow input'),\n outputSchema: z.record(z.string(), z.unknown()).describe('JSON Schema (Draft 2020-12) for the workflow output'),\n stateSchema: z.record(z.string(), z.unknown()).optional(),\n requestContextSchema: z.record(z.string(), z.unknown()).optional(),\n graph: z\n .array(graphEntrySchema)\n .describe('Static workflow graph — ordered array of serialized step entries with all refs as ids.'),\n});\n\n/**\n * Body for `POST /stored/workflows` — upsert a static workflow definition,\n * optionally together with the helper workflows it nests.\n */\nexport const upsertDynamicWorkflowBodySchema = dynamicWorkflowDefinitionBodySchema.extend({\n // Deliberately a FLAT list rather than a recursive tree: helpers are peers\n // of each other, hydration order is derived from the graphs, and a\n // self-referential Zod schema would not survive OpenAPI generation.\n dependencies: z\n .array(dynamicWorkflowDefinitionBodySchema)\n .optional()\n .describe(\n 'Helper workflow definitions this workflow nests. Saved with it as one unit — the whole set is validated together, ' +\n 'hydrated in derived dependency order, and rejected together, so a failed save never leaves orphaned helpers behind. ' +\n 'Each helper becomes an ordinary dynamic workflow in its own right.',\n ),\n});\n\n// ============================================================================\n// Response schemas\n// ============================================================================\n\n/**\n * Shape returned for any single dynamic workflow row.\n */\nexport const dynamicWorkflowResponseSchema = z.object({\n id: z.string(),\n description: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n inputSchema: z.unknown(),\n outputSchema: z.unknown(),\n stateSchema: z.unknown().optional(),\n requestContextSchema: z.unknown().optional(),\n graph: z.array(z.unknown()),\n status: z.enum(['active', 'archived']),\n source: z.literal('storage'),\n authorId: z.string().optional(),\n createdAt: z.union([z.date(), z.string()]),\n updatedAt: z.union([z.date(), z.string()]),\n});\n\nexport const listDynamicWorkflowsResponseSchema = z.object({\n workflows: z.array(dynamicWorkflowResponseSchema),\n total: z.number(),\n});\n\nexport const getDynamicWorkflowResponseSchema = dynamicWorkflowResponseSchema;\n\nexport const upsertDynamicWorkflowResponseSchema = z.object({\n ok: z.literal(true),\n id: z.string(),\n dependencyIds: z\n .array(z.string())\n .optional()\n .describe('Ids of the helper workflows saved alongside this one. Present only when dependencies were supplied.'),\n});\n\nexport const deleteDynamicWorkflowResponseSchema = z.object({\n success: z.literal(true),\n message: z.string(),\n});\n","import type { Mastra } from '@mastra/core/mastra';\n\nimport { HTTPException } from '../http-exception';\nimport {\n dynamicWorkflowIdPathParams,\n listDynamicWorkflowsQuerySchema,\n upsertDynamicWorkflowBodySchema,\n listDynamicWorkflowsResponseSchema,\n getDynamicWorkflowResponseSchema,\n upsertDynamicWorkflowResponseSchema,\n deleteDynamicWorkflowResponseSchema,\n} from '../schemas/dynamic-workflows';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { handleError } from './error';\n\n/**\n * GET /stored/workflows — list stored static workflow definitions.\n *\n * Mirrors `LIST_STORED_AGENTS_ROUTE` but without favorites/visibility/authorship\n * scoping (which the workflow-definitions domain doesn't carry in v1).\n */\nexport const LIST_DYNAMIC_WORKFLOWS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/workflows',\n responseType: 'json',\n queryParamSchema: listDynamicWorkflowsQuerySchema,\n responseSchema: listDynamicWorkflowsResponseSchema,\n summary: 'List dynamic workflow definitions',\n description: 'Returns workflow definitions persisted to storage. Filterable by status and authorId.',\n tags: ['Dynamic Workflows'],\n requiresAuth: true,\n requiresPermission: 'stored-workflows:read',\n handler: async ({ mastra, status, authorId }) => {\n try {\n const storage = mastra.getStorage();\n if (!storage) throw new HTTPException(500, { message: 'Storage is not configured' });\n\n const store = await storage.getStore('workflowDefinitions');\n if (!store) throw new HTTPException(500, { message: 'workflowDefinitions storage domain is not available' });\n\n const result = await store.list({ status: status ?? 'active', authorId });\n return { workflows: result.definitions, total: result.total };\n } catch (error) {\n return handleError(error, 'Error listing dynamic workflows');\n }\n },\n});\n\n/**\n * GET /stored/workflows/:dynamicWorkflowId — get one dynamic workflow.\n */\nexport const GET_DYNAMIC_WORKFLOW_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/workflows/:dynamicWorkflowId',\n responseType: 'json',\n pathParamSchema: dynamicWorkflowIdPathParams,\n responseSchema: getDynamicWorkflowResponseSchema,\n summary: 'Get a dynamic workflow definition by id',\n description: 'Returns a single workflow definition persisted to storage.',\n tags: ['Dynamic Workflows'],\n requiresAuth: true,\n requiresPermission: 'stored-workflows:read',\n handler: async ({ mastra, dynamicWorkflowId }) => {\n try {\n const storage = mastra.getStorage();\n if (!storage) throw new HTTPException(500, { message: 'Storage is not configured' });\n\n const store = await storage.getStore('workflowDefinitions');\n if (!store) throw new HTTPException(500, { message: 'workflowDefinitions storage domain is not available' });\n\n const def = await store.get(dynamicWorkflowId);\n if (!def) throw new HTTPException(404, { message: `Dynamic workflow \"${dynamicWorkflowId}\" not found` });\n return def;\n } catch (error) {\n return handleError(error, 'Error getting dynamic workflow');\n }\n },\n});\n\n/**\n * POST /stored/workflows — upsert a static workflow definition and live-register\n * it on the Mastra instance.\n *\n * Calls `mastra.addDynamicWorkflow(def)` which persists the row + rehydrates a\n * runnable workflow + registers it via `mastra.addWorkflow(workflow, id)`.\n * After this returns, `GET /workflows/:id` and `POST /workflows/:id/run` work\n * immediately — no server restart needed.\n */\nexport const UPSERT_DYNAMIC_WORKFLOW_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/workflows',\n responseType: 'json',\n bodySchema: upsertDynamicWorkflowBodySchema,\n responseSchema: upsertDynamicWorkflowResponseSchema,\n summary: 'Upsert a dynamic workflow definition and live-register it',\n description:\n 'Persists a static workflow definition and live-registers it on the running Mastra instance. Idempotent — same id updates in place.',\n tags: ['Dynamic Workflows'],\n requiresAuth: true,\n requiresPermission: 'stored-workflows:write',\n handler: async ({\n mastra,\n id,\n description,\n metadata,\n inputSchema,\n outputSchema,\n stateSchema,\n requestContextSchema,\n graph,\n dependencies,\n }) => {\n try {\n // Pick the body fields explicitly — handler args also carry server\n // context (requestContext, abortSignal, ...) which must not leak into\n // the stored definition.\n const def = { id, description, metadata, inputSchema, outputSchema, stateSchema, requestContextSchema, graph };\n // Helpers are saved with the root as one unit so a nested workflow that\n // does not exist yet resolves, and so a rejected root can never leave\n // its helpers behind as orphans. Order within the bundle is derived\n // from the graphs, not from the order the client sent them in.\n const bundle = [...(dependencies ?? []), def];\n // The Zod schema output is structurally compatible with\n // DynamicWorkflowGraph but TS can't prove every arm:\n // - sleepUntil.date is an ISO string on the wire, Date on the\n // runtime type; the rehydrator parses it via `new Date(...)`.\n // - conditional/loop's `serializedConditions`/`serializedCondition`\n // debug labels are emitted by the fluent builder at rehydration\n // time; clients don't send them.\n // `addDynamicWorkflows` runs a full registry pre-flight before\n // rehydration; the cast documents this boundary.\n await mastra.addDynamicWorkflows(bundle as Parameters<Mastra['addDynamicWorkflows']>[0]);\n return {\n ok: true as const,\n id: def.id,\n ...(dependencies?.length ? { dependencyIds: dependencies.map(dependency => dependency.id) } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error upserting dynamic workflow');\n }\n },\n});\n\n/**\n * DELETE /stored/workflows/:dynamicWorkflowId — delete a dynamic workflow.\n *\n * Removes the row from storage AND un-registers the live Workflow instance so\n * a subsequent POST with the same id starts from a clean slate. Idempotent.\n */\nexport const DELETE_DYNAMIC_WORKFLOW_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/workflows/:dynamicWorkflowId',\n responseType: 'json',\n pathParamSchema: dynamicWorkflowIdPathParams,\n responseSchema: deleteDynamicWorkflowResponseSchema,\n summary: 'Delete a dynamic workflow definition',\n description: 'Removes a dynamic workflow definition and unregisters the live workflow instance. Idempotent.',\n tags: ['Dynamic Workflows'],\n requiresAuth: true,\n requiresPermission: 'stored-workflows:write',\n handler: async ({ mastra, dynamicWorkflowId }) => {\n try {\n const storage = mastra.getStorage();\n if (!storage) throw new HTTPException(500, { message: 'Storage is not configured' });\n\n const store = await storage.getStore('workflowDefinitions');\n if (!store) throw new HTTPException(500, { message: 'workflowDefinitions storage domain is not available' });\n\n await store.delete(dynamicWorkflowId);\n (mastra as Mastra).removeWorkflow(dynamicWorkflowId);\n return { success: true as const, message: `Workflow ${dynamicWorkflowId} deleted` };\n } catch (error) {\n return handleError(error, 'Error deleting dynamic workflow');\n }\n },\n});\n"],"mappings":"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"}
|