Skip to content

Commit 1b55954

Browse files
authored
fix(core): serialize workflow request context safely (#16061)
1 parent ba82ea5 commit 1b55954

3 files changed

Lines changed: 23 additions & 5 deletions

File tree

.changeset/rare-kiwis-throw.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@mastra/core': patch
3+
---
4+
5+
Fixed workflow request context serialization to skip values that cannot be safely stored as JSON. Fixes #16043.

packages/core/src/workflows/default.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,23 @@ describe('DefaultExecutionEngine.fmtReturnValue stepExecutionPath and payload de
608608
});
609609

610610
describe('DefaultExecutionEngine.deserializeRequestContext', () => {
611+
it('should produce JSON-safe serialized request context values', () => {
612+
const engine = new TestableExecutionEngine({ mastra: undefined });
613+
const requestContext = new RequestContext();
614+
const circular: any = { name: 'service' };
615+
circular.self = circular;
616+
617+
requestContext.set('userId', 'user-123');
618+
requestContext.set('progressEmitter', () => undefined);
619+
requestContext.set('service', circular);
620+
621+
const serialized = engine.serializeRequestContext(requestContext);
622+
623+
expect(() => JSON.stringify(requestContext.toJSON())).not.toThrow();
624+
expect(() => JSON.stringify(serialized)).not.toThrow();
625+
expect(serialized).toEqual({ userId: 'user-123' });
626+
});
627+
611628
it('should return a RequestContext instance with all entries from the plain object', () => {
612629
const engine = new TestableExecutionEngine({ mastra: undefined });
613630
const plainObj = { userId: 'user-123', tenantId: 'tenant-456', nested: { flag: true } };

packages/core/src/workflows/default.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -615,11 +615,7 @@ export class DefaultExecutionEngine extends ExecutionEngine {
615615
* Used by durable execution engines to persist context across step replays.
616616
*/
617617
serializeRequestContext(requestContext: RequestContext): Record<string, any> {
618-
const obj: Record<string, any> = {};
619-
requestContext.forEach((value, key) => {
620-
obj[key] = value;
621-
});
622-
return obj;
618+
return requestContext.toJSON();
623619
}
624620

625621
/**

0 commit comments

Comments
 (0)