diff --git a/packages/alchemy/src/Cloudflare/Workflows/WorkflowBridge.ts b/packages/alchemy/src/Cloudflare/Workflows/WorkflowBridge.ts index 2212955e94..9dbda30406 100644 --- a/packages/alchemy/src/Cloudflare/Workflows/WorkflowBridge.ts +++ b/packages/alchemy/src/Cloudflare/Workflows/WorkflowBridge.ts @@ -192,6 +192,8 @@ export const wrapWorkflowStep = (step: any): WorkflowStep["Service"] => ({ const toWorkflowStepConfig = ( options: WorkflowTaskOptions, ): WorkflowStepConfig | undefined => { - if (!options.retries && !options.timeout) return undefined; - return { retries: options.retries, timeout: options.timeout }; + const config: WorkflowStepConfig = {}; + if (options.retries) config.retries = options.retries; + if (options.timeout !== undefined) config.timeout = options.timeout; + return Object.keys(config).length > 0 ? config : undefined; }; diff --git a/packages/alchemy/test/Cloudflare/Workers/WorkflowBridge.test.ts b/packages/alchemy/test/Cloudflare/Workers/WorkflowBridge.test.ts index 594fe7a033..a293070d24 100644 --- a/packages/alchemy/test/Cloudflare/Workers/WorkflowBridge.test.ts +++ b/packages/alchemy/test/Cloudflare/Workers/WorkflowBridge.test.ts @@ -33,4 +33,38 @@ describe("WorkflowBridge", () => { } }), ); + + it.effect( + "omits undefined config keys so retries-only steps keep the engine timeout default", + () => + Effect.gen(function* () { + const doCalls: Array = []; + const step = wrapWorkflowStep({ + do: (...args: unknown[]) => { + doCalls.push(args); + return Promise.resolve("done"); + }, + sleep: () => Promise.resolve(), + sleepUntil: () => Promise.resolve(), + waitForEvent: () => Promise.resolve(), + }); + + yield* step.do({ + name: "retries-only", + effect: Effect.succeed("done"), + retries: { limit: 3, delay: "10 seconds", backoff: "exponential" }, + }); + + expect(doCalls).toHaveLength(1); + const config = (doCalls[0] as Array)[1]; + expect(config).toEqual({ + retries: { + limit: 3, + delay: "10 seconds", + backoff: "exponential", + }, + }); + expect("timeout" in (config as object)).toBe(false); + }), + ); });