Packages

workflow

5.2.3 · 20 Oct 2026Apache-2.01.1M / weekRepositorynpmAtom feed

56 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.

  1. 5.x · latest line
  2. 5.2.3

    20 Oct 2026
    • security

      @pranaygp - Security: remove the nanoid dependency (pinned at 5.1.6, affected by GHSA-28wg-ghj8-5hjv). Default hook tokens now come from a built-in copy of the same generator, so tokens and seeded random values stay identical for runs recorded on earlier versions. Upgrading nanoid itself would have changed them, because nanoid@5.1.16 draws a different number of random bytes per id.

    • @pranaygp - Resolve a run's encryption key from metadata only, so Run#getReadable() and resuming a hook stored without a resume context no longer make the server resolve the run's whole input and output first.

    • @VaguelySerious - Fix cross-deployment start() to 4.x deployments being misread as a run invocation, and keep replayed runs in the original run's region.

  3. 5.2.2

    13 Oct 2026
    • @pranaygp - Order setAttributes() resolution with the replay delivery barriers so a branch awaiting it can no longer resume out of event-log order, which could fail the run with REPLAY_DIVERGENCE or hand concurrent branches each other's step results

    • @http-samc - Upgrade devalue to 6.0.3, which escapes large strings with native JSON.stringify instead of a per-character loop. Strings containing unpaired surrogates now round-trip exactly instead of being replaced with U+FFFD.

    • @VaguelySerious - Remove the experimental WORKFLOW_RESILIENT_STEP_DISPATCH option

  4. 5.2.1

    12 Oct 2026
    • @http-samc - Compress workflow arguments on the libuv threadpool when starting a run, so large inputs no longer block the caller's event loop during zstd compression.

    • @http-samc - Add a compressArguments option to start(); pass false to store the run's arguments uncompressed when the inputs are known to be incompressible.

    • @pranaygp - Record the queue namespace on a run's executionContext.queueNamespace in start(), so restart recovery re-enqueues the run to its own namespace.

  5. 5.2.0

    8 Oct 2026
    • security

      @TooTallNate - Upgrade react-router and @react-router/* to 7.18.4 to address CVE-2026-34077 and GHSA-qwww-vcr4-c8h2

    • @pranaygp - Start the queued branches of a wide Promise.all fan-out sooner. The batched fan-out now commits its writes in createBatch calls of at most 16 events instead of 32. Each queued branch's message waits on its chunk's commit and then its chunk's batched publish, and both are faster for smaller chunks. In production sweeps, the last branch of a 64-branch fan-out started about 90 ms sooner at p50, and of a 128-branch fan-out about 200 ms sooner, with no change to the first branch at those widths.

    • @VaguelySerious - Deliver a hook payload to the pending await when an earlier Promise.race over the same hook was lost

  6. 5.1.0

    6 Oct 2026
    • @wycats - Export the existing Serializable type from @workflow/core and workflow.

    • @TooTallNate - Remove the unused, stale vm-serde-bundle.generated.ts left over from the retired in-VM QuickJS serializer.

    • @alangenfeld - Wait for run creation before writing to writable streams passed as arguments to turbo steps.

  7. 5.0.1

    1 Oct 2026
    • @alangenfeld - Dynamic start() refusals (opt-in, validation, same-deployment, World capability, execution-context budget) are now fatal, so a start() inside a step fails fast instead of retrying.

    • @alangenfeld - Dynamic start() now publishes the run only after run_created confirms its code was stored, so a refused or failed create can no longer leave an executing run behind.

    • @alangenfeld - Dynamic start() validation: cap exportName at 64 characters, detect "use step" only as a real directive, and name non-async, generator, and duplicate workflow declarations.

  8. 5.0.0

    30 Sep 2026
    • breaking

      ** hook.metadata on hooks returned by getHookByToken() and resumeHook() is now a lazy getter that returns a Promise, like run.returnValue, and needs to be awaited. Looking a hook up by token no longer pays for hydrating metadata that is never read.

    • breaking

      Initial v5 beta release

    • breaking

      Remove the deprecated experimental_setAttributes and ExperimentalSetAttributesOptions aliases; use setAttributes and SetAttributesOptions instead.

  9. 4.x
  10. 4.8.14

    21 Oct 2026
    • security

      @pranaygp - Security: remove the nanoid dependency (pinned at 5.1.6, affected by GHSA-28wg-ghj8-5hjv). Default hook tokens now come from a built-in copy of the same generator, so tokens and seeded random values stay identical for runs recorded on earlier versions. Upgrading nanoid itself would have changed them, because nanoid@5.1.16 draws a different number of random bytes per id.

    • @pranaygp - workflow inspect stream exits 1 when it cannot read or decode a stream, and workflow inspect st lists streams instead of steps.

    • @pranaygp - Register a run's stream names under a lock so listStreamsByRunId no longer drops a stream when several of the run's streams first write at once. A stream written again after clear() is listed again.

  11. 4.8.13

    8 Oct 2026
    • security

      @TooTallNate - Upgrade react-router and @react-router/* to 7.18.4 to address CVE-2026-34077 and GHSA-qwww-vcr4-c8h2

    • @shalabhc - Accept lazy completed and failed runs whose payload is represented by a remote reference.

    • @shalabhc - Accept lazy completed and failed runs whose payload is represented by a remote reference.

  12. 4.8.12

    2 Oct 2026
    • @VaguelySerious - Fix an issue with the workflow's deterministic clock tracking advancement on consumption, not on write, which could lead to a determinism issue when concurrent replays called Date.now with different amounts of events read from the log

    • @gaojude - Order hook registration and conflict settlements with earlier workflow deliveries so replay preserves concurrent step correlation IDs.

    • @AndrewBarba - Allow same-run queue wakes to reach a workflow while an inline step is pending, so hook-driven cancellation and steering do not wait for the step to finish.

  13. 4.8.11

    1 Oct 2026
    • @SandboxRD - Fix createQueueDispatcher() and createEventsDispatcher() crashing under Bun with compose is not a function. Bun resolves undici to its built-in module, whose dispatchers can't compose interceptors and are ignored by Bun's fetch, so the plain dispatcher is used instead.

    • @alangenfeld - Honor server-provided Retry-After delays when scheduling queue redeliveries.

    • @withkarann - Fix directive discovery missing "use step" and "use workflow" when a backtick appears earlier in a comment or regex literal

  14. 4.8.10

    30 Sep 2026
    • @pranaygp - Fix an unhandled rejection that could exit the process when the encryption-key lookup for a forwarded writable stream failed (for example a run metadata read that timed out) before anything was written to that stream. The lookup now starts on the first write, and a failure rejects that stream instead.

    • @TooTallNate - Serialize a DataView as the bytes it views. It previously fell through to devalue's built-in encoding, which persists the whole backing ArrayBuffer — for a view onto Node's pooled Buffer allocator, unrelated process memory.

    • @TooTallNate - Retry the max-deliveries run_failed/step_failed write and the step handler's workflow re-queue through queue redelivery when they fail transiently (429, 5xx, transport) instead of acking and leaving the run stuck running.

  15. 4.8.9

    15 Sep 2026
    • security

      @Rich-Harris - Bump devalue to 5.9.2 to address published security advisory.

    • @ctgowrie - Stop framed stream reconnects after the consumer cancels, including while completion checks or reconnect acquisition are still pending.

    • @torsello - Allow parentheses and square brackets in workflow names

  16. 4.8.8

    9 Sep 2026
    • @VaguelySerious - Honor WORKFLOW_NODE_HTTP on the queue client's transport, so a deployment whose bundled undici is unusable can still acknowledge queue messages instead of redelivering them until the invocation is killed.

    • @VaguelySerious - Give the queue client its own connection pool and a total per-request deadline, so a stalled queue acknowledgement fails fast instead of holding the invocation until the platform kills it.

  17. 4.8.7

    9 Sep 2026
    • @karthikscale3 - Classify HTTP/2 response stream timeouts as retryable transport failures so start() can return the queued run through resilient start.

  18. 4.8.6

    9 Sep 2026
    • @AndrewBarba - Abort active local queue deliveries when the World closes, including when transport timeouts are disabled.

    • @karthikscale3 - Recycle the events HTTP/2 connection pool when a streamed response body fails after its headers arrive.

    • @VaguelySerious - Authenticate deploymentId: "latest" with the deployment's own OIDC identity instead of an ambient VERCEL_TOKEN, and scope the request to the configured team, fixing spurious 404s when resolving the latest deployment

  19. 4.8.5

    25 Aug 2026
    • @TooTallNate - Step-argument serialization failures now fail the step with a catchable error (via a step_failed event, like a step-body failure) instead of failing the run from outside the workflow, and when uncaught they fail the run immediately as a USER_ERROR rather than retrying until max queue deliveries.

    • @AndrewBarba - Preserve event-log order when adjacent hook payloads resume independent workflow branches.

    • @VaguelySerious - Fix a replay-determinism gap where branch wake order — and therefore step correlation ids — could depend on how much of the event log an invocation had loaded, corrupting runs under concurrent replays (CORRUPTED_EVENT_LOG).

  20. 4.8.4

    19 Aug 2026
    • @VaguelySerious - Add WORKFLOW_NODE_HTTP to run the Vercel and Local World HTTP layers on Node's built-in node:http and node:https modules instead of their usual HTTP client library.

    • @VaguelySerious - Add WORKFLOW_NODE_HTTP to run the Vercel and Local World HTTP layers on Node's built-in node:http and node:https modules instead of their usual HTTP client library.

    • @VaguelySerious - Reject a hook resume that races the hook's disposal, instead of journaling it after hook_disposed and corrupting the owning run's event log.

  21. 4.8.3

    14 Aug 2026
  22. 4.8.2

    11 Aug 2026
    • @ar-tama - Fix Date subclassing inside workflow functions. The deterministic Date override in the workflow VM now forwards new.target via Reflect.construct, so subclasses like TZDate from @date-fns/tz keep their identity, methods, and fields. Calling Date() without new now returns the (fixed) time string per spec, instead of a Date object.

    • @pranaygp - Deliver step results, wait completions and hook payloads in strict event-log order relative to one another, preventing replay divergence (CORRUPTED_EVENT_LOG) when a step completion is adjacent in the log to a wait_completed or hook_received that a concurrent branch is awaiting.

    • @VaguelySerious - Stop reporting replay divergence for an event the workflow is still on its way to consuming, by waiting for in-flight step and hook deliveries instead of a fixed delay

  23. 4.8.1

    7 Aug 2026
  24. 4.8.0

    31 Jul 2026
    • @shalabhc - Enforce a server-supplied per-run event limit (default 25K)

    • @shalabhc - Enforce a server-supplied per-run event limit (default 25K)

    • @AndrewBarba - Retry transient EPERM unlink failures on Windows when deleting hook and entity JSON files. A concurrent reader briefly holding a file open made deleteJSON throw a share-violation EPERM, which surfaced as a failed operation — for example a failed run.cancel() while deleteAllHooksForRun raced hook polling.

  25. 4.7.0

    29 Jul 2026
    • @VaguelySerious - Add an optimistic-concurrency guard for event creation (on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0): replay-context event creations send a stateUpdatedAt snapshot timestamp, and the runtime reloads the event log and retries (then falls back to a fresh re-invocation) when the backend reports a newer out-of-band event with a 412 PreconditionFailedError. Backends without guard support ignore the snapshot, so this is backward-compatible and fails open.

    • @VaguelySerious - Add an optimistic-concurrency guard for event creation (on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0): replay-context event creations send a stateUpdatedAt snapshot timestamp, and the runtime reloads the event log and retries (then falls back to a fresh re-invocation) when the backend reports a newer out-of-band event with a 412 PreconditionFailedError. Backends without guard support ignore the snapshot, so this is backward-compatible and fails open.

    • @VaguelySerious - Add an optimistic-concurrency guard for event creation (on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0): replay-context event creations send a stateUpdatedAt snapshot timestamp, and the runtime reloads the event log and retries (then falls back to a fresh re-invocation) when the backend reports a newer out-of-band event with a 412 PreconditionFailedError. Backends without guard support ignore the snapshot, so this is backward-compatible and fails open.

  26. 4.6.2

    24 Jul 2026
    • security

      @TooTallNate - Update next devDependency to 16.2.11 to address CVE-2026-64641

  27. 4.6.1

    22 Jul 2026

    Reading the note…

  28. 4.6.0

    6 Jul 2026

    Reading the note…

  29. 4.5.0

    15 Jun 2026

    Reading the note…

  30. 4.4.0

    11 Jun 2026

    Reading the note…

  31. 4.3.1

    2 Jun 2026

    Reading the note…

  32. 4.3.0

    2 Jun 2026

    Reading the note…

  33. 4.2.6

    31 May 2026

    Reading the note…

  34. 4.2.5

    22 May 2026

    Reading the note…

  35. 4.2.4

    17 Apr 2026

    Reading the note…

  36. 4.2.3

    16 Apr 2026

    Reading the note…

  37. 4.2.2

    14 Apr 2026

    Reading the note…

  38. 4.2.1

    11 Apr 2026

    Reading the note…

  39. 4.2.0

    7 Apr 2026

    Reading the note…

  40. 2.x
  41. 2.0.6

    26 Sep 2018

    Reading the note…

  42. 2.0.5

    26 Sep 2018

    Reading the note…

  43. 2.0.4

    26 Sep 2018

    Reading the note…

  44. 2.0.3

    25 Sep 2018

    Reading the note…

  45. 2.0.2

    25 Sep 2018

    Reading the note…

  46. 2.0.1

    25 Sep 2018

    Reading the note…

  47. 2.0.0

    18 Sep 2018

    Reading the note…

  48. 1.x
  49. 1.1.6

    18 Sep 2018

    Reading the note…

  50. 1.1.5

    12 Sep 2018

    Reading the note…

  51. 1.1.4

    11 Sep 2018

    Reading the note…

  52. 1.1.3

    11 Sep 2018

    Reading the note…

  53. 1.1.2

    11 Sep 2018

    Reading the note…

  54. 1.1.1

    10 Sep 2018

    Reading the note…