Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
165 KiB
@workflow/core
5.0.0-beta.40
Minor Changes
-
#3347
8d47928Thanks @karthikscale3! - Add a bulk run cancellation primitive.@workflow/worlddefines theBulkCancelWorkflowRuns*contract and an optionalruns.cancelMany;@workflow/world-vercelimplements it via a singlePOST /v4/runs/cancel;@workflow/coreadds acancelRunshelper that usescancelManywhen available and falls back to bounded-concurrency single-run cancellation. -
#3048
f8f6e17Thanks @TooTallNate! - Add an experimental QuickJS WASM VM engine for workflow execution, opt-in viaWORKFLOW_VM=quickjs(or per-runexecutionContext.workflowVm). The engine performs the same full event replay as the defaultnode:vmengine but runs workflow code in a QuickJS VM compiled to WebAssembly, enabling platforms withoutnode:vmsupport and laying the groundwork for VM-memory snapshotting. -
#3046
5d591d2Thanks @NathanColosimo! - Retain workflow execution across inline steps within one invocation;WORKFLOW_RETAINED_VM=0disables retention. Boundaries whose step arguments are not primitive values fall back to ordinary replay. -
#3047
89ede82Thanks @NathanColosimo! - Retained workflow VMs now keep the fast path when step arguments are plain data or standard built-ins (Map,Set,Date, typed arrays,URL,Headers, …), not just primitives. A boundary falls back to a normal replay only when serializing its arguments ran code the workflow controls — a getter, a proxy, a custom serializer — or computed anError's stack trace.
Patch Changes
-
#2960
79e4c04Thanks @alangenfeld! - Re-route a queue delivery that reaches a deployment other than the one its run is pinned to, retry transient publishing failures through normal queue redelivery, and fail the run with the newDEPLOYMENT_MISMATCHerror code once the recovery budget is spent. -
#3316
e084e08Thanks @karthikscale3! - Allow configuring the polling interval used byRun.returnValuewithWORKFLOW_RETURN_VALUE_POLL_INTERVAL_MS. -
#3345
9c1b3c8Thanks @karthikscale3! - Initialize lazy hook resume replay from thehook_receivedwrite via the new advisorypreloadEventsparam, skippingrun_startedand the initialevents.list; safe fallback otherwise. -
#3301
cb77725Thanks @VaguelySerious! - Add env option to split correlation ID derivation into per-entity-type sequential ULIDs, instead of sharing one derivation source -
#3332
939ffb4Thanks @NathanColosimo! - Reject unsupported Hook retention synchronously inside QuickJS workflows. -
#3319
27a3f15Thanks @NathanColosimo! - Preserve Hook minimum-retention deadlines in QuickJS workflows. -
#3048
f8f6e17Thanks @TooTallNate! - QuickJS engine performance: cache compiled WebAssembly modules process-wide, and execute steps inline in a live-VM continuation loop (no queue round-trip per step, cheap events fed before step bodies, delayed wait-continuation dispatch for racing timers). -
#3301
cb77725Thanks @VaguelySerious! - Fix stream IDs minted while serializing a step's arguments latching the host wall clock into a run's ID sequence, which gave every entity created afterwards a different correlation ID on each replay -
#3360
72efc90Thanks @elliotdauber! - Derive inline-execution duration limits fromWorld.getRuntimeDeadline()(implemented on Vercel World via@vercel/functions). -
Updated dependencies [
8d47928,1222aab,2eddf74,de1905f,79e4c04,9c1b3c8,e6f1b6f,72efc90]:- @workflow/world@5.0.0-beta.25
- @workflow/world-vercel@5.0.0-beta.36
- @workflow/world-local@5.0.0-beta.34
- @workflow/errors@5.0.0-beta.16
5.0.0-beta.39
Minor Changes
-
#3186
4a9d26bThanks @alangenfeld! - Record the compute instance that ran each step attempt:CreateEventParams.computeInstanceIdis stamped onstep_startedwrites, forwarded in the world-vercel v4 frame meta alongsidevercelId, read back onAnalyticsEvent/AnalyticsStep, and surfaced as "Compute Instance ID" in the observability attribute panel. -
#3244
ee944d2Thanks @pranaygp! - Stamp the creating client's environment into the queue message'srunInput, and refuse a queue delivery whose run was created in a different environment than the consuming deployment runs in, so one run ID can no longer be forked into two environments. -
#3145
1471f25Thanks @VaguelySerious! - Strengthen the event-creation precondition guard: replay-context writes now also send the number of loaded events, so a snapshot that is missing an event is rejected instead of committing a divergent event log, and a rejection restarts the replay in-process (consuming the events a world may attach to the rejection) rather than re-committing the rejected payload or re-invoking over the queue.@workflow/world-localand@workflow/world-postgresdo not implement the check. -
#2989
9cc11f5Thanks @alangenfeld! - Emit afaas.instanceOTEL span attribute (a synthesized per-warm-instance id) on the flow and step route spans, so traces can distinguish which compute instance handled each request. -
#3230
31f92dfThanks @karthikscale3! - Lazy hook resumption: on a fast path,resumeHook()writes thehook_receivedevent and dispatches the workflow queue message concurrently instead of sequentially, cutting a round trip off resume latency. A(runId, resumeId)dedup constraint keeps the two writers converging on exactly one event; the runtime falls back to the sequential path when dedup support is unavailable or whenWORKFLOW_DISABLE_LAZY_HOOK_RESUME=1.resumeHook()resolves to aResumedHook(aHookplus an optionalresilientResume: trueflag, set only when the direct write failed transiently and the resume was recovered via the queue consumer's re-ensure) — preserving the contract introduced alongside the resilient-resume work. -
#1834
438eaa6Thanks @TooTallNate! - MakeresumeHook()resilient to transienthook_receivedevent write failures (429/5xx) by carrying the payload on the queue message for the runtime to materialize. ReturnedHookgets a newresilientResume: trueflag when this fallback path is taken.
Patch Changes
-
#3288
679dfa9Thanks @NathanColosimo! - Simplify hardened serialization: intrinsic captures assert at import instead of degrading per use,URLSearchParamsnow serializes natively on Node 18, and bound-function getters are reported as guest code (previously a getter defined viafn.bind()executed with an empty report). -
#3257
b732e91Thanks @TooTallNate! - Serializing values built inside thenode:vmworkflow VM no longer executes workflow code, using engine brand checks and host intrinsics captured at boot. -
#3273
4174a6eThanks @VaguelySerious! - Treat an emptyVERCEL_URLas not running on Vercel, so a.env.localleft behind byvercel env pullno longer makes local runs fail withInvalid URL -
#3208
4017597Thanks @alangenfeld! - Report replay-divergence counts on event writes that recover or exhaust replay retries. -
Updated dependencies [
4a9d26b,1471f25,c93f6f7,31f92df,4017597,438eaa6,ee944d2,2677653,aa78a7e,f05f642,ee944d2]:- @workflow/world@5.0.0-beta.24
- @workflow/world-vercel@5.0.0-beta.35
- @workflow/errors@5.0.0-beta.15
- @workflow/world-local@5.0.0-beta.33
5.0.0-beta.38
Patch Changes
-
#3198
b92c23cThanks @TooTallNate! - Don't observe idle — and raise aWorkflowSuspension— while a delivery that is committed to reaching the workflow is still parked between its serial queue slot and its detachedresolve(). A run with an outstandingsleep()replaying a batch of parallel step results could suspend inside that gap with none of the batch's follow-up work queued, going dormant until an unrelated timer fired. -
#3142
a09d001Thanks @VaguelySerious! - Revert the static workflow world target injection: the world package is again resolved at runtime fromWORKFLOW_TARGET_WORLDinstead of being aliased into host bundles at build time. -
Updated dependencies [
34975f6,a09d001]:- @workflow/world-vercel@5.0.0-beta.34
- @workflow/utils@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.32
- @workflow/errors@5.0.0-beta.14
5.0.0-beta.37
Major Changes
-
#3128
7959accThanks @NathanColosimo! - BREAKING CHANGE: Remove the deprecatedexperimental_setAttributesandExperimentalSetAttributesOptionsaliases; usesetAttributesandSetAttributesOptionsinstead. -
#3112
4ada27dThanks @NathanColosimo! - Remove deprecated world-specific factory aliases in favor ofcreateWorld. -
#3061
62d570eThanks @NathanColosimo! - Remove the retired step route runtime and make queue health checks target the combined flow handler. -
#3045
d813fb8Thanks @NathanColosimo! - Deterministic sandbox hardening:crypto.subtle.digestin workflow functions now computes synchronously vianode:crypto(byte-identical values, deterministic timing under replay);Atomics.waitAsync, asyncWebAssemblycompilation,WeakRef, andFinalizationRegistryare no longer exposed (wall-clock timing and GC observation cannot be replayed).
Minor Changes
-
#3098
8a95d36Thanks @TooTallNate! - Carry the owning run's public key in forwardedWritableStreamdescriptors, so a run writing into another run's stream seals frames with no run fetch and no key-API round trip. -
#3146
e8bc7d6Thanks @TooTallNate! - Let observability tooling decrypt sealed (encp) payloads: key resolution now yields the run's full key capability, andhydrateDataWithKeydispatches on the envelope format. -
#3094
7a65030Thanks @TooTallNate! - Teach the serialization layer to read and writeencpsealed envelopes via aPayloadKeyunion, so a cross-run writer can encrypt with only a public key. Existing symmetric call sites are unaffected. -
#3096
0b1ca15Thanks @TooTallNate! -resumeHook()now seals its payload to the target run's published public key when one is present, removing the cross-deploymentrun-keyAPI round trip from hook resumption. Readers resolve the full key capability so they can open sealed payloads. -
#3095
b4ba79eThanks @TooTallNate! - Derive each run's X25519 public key atstart()and stamp it on the run, so cross-run writers can seal payloads to the run without fetching its symmetric key. -
#3093
4ba223aThanks @TooTallNate! - Add theencpsealed-box encryption primitive: X25519 keypairs derived from the existing per-run key material, letting cross-run writers encrypt with only a public key. Not yet wired into any write path. -
#3099
a86035fThanks @TooTallNate! - The cross-deployment capability probe now returns the target run's public key, lettingstart()seal workflow arguments without a separate key-lookup request.
Patch Changes
-
#3111
8c12358Thanks @NathanColosimo! - Clarify runtime invariants and compression behavior. -
#3155
b8bcdedThanks @TooTallNate! - Seal forwarded writes to streams taken withgetWritable()in a workflow body, which previously fell back to fetching the owner's symmetric key because the workflow VM has no key material to publish on the handle. -
#3125
d24c91cThanks @karthikscale3! - Hooks can carry an optionalresumeContext; when present,resumeHook/resumeWebhookresume from it directly instead of fetching the full run, saving a round trip per resume. When the context also carries the run'sencryptionPublicKey, the resume seals its payload (encp) directly to that key, so a default webhook resume needs neither a run read nor a run-key lookup. These two optimizations fall back independently: it fetches the full run when the context is absent, and uses symmetric encryption when no usable public key is available. -
#3069
fd05393Thanks @TooTallNate! - Fix a false "exceeded max retries" run failure: the retry-ceiling guard counted duplicatestep_startedevents written by invocations racing on the same pending batch as real attempts. The owned-recovery ceiling now counts only the owning message's own starts, and the background-step ceiling counts only bare (queue-delivered) starts. -
#3088
fc81f45Thanks @karthikscale3! - Stream writes dispatch the first chunk of an idle stream immediately (flush window default 0 instead of 10ms). Fast producers keep full batching via in-flight accumulation; setstreamFlushIntervalMs(World option) orWORKFLOW_STREAM_FLUSH_INTERVAL_MS(env, takes precedence) above 0 to opt into a windowed leading edge. -
#3131
d7553c4Thanks @NathanColosimo! - Avoid rescanning already prewarmed replay payloads during inline replays. -
#3110
5d17c60Thanks @NathanColosimo! - Consolidate runtime event merging logic. -
#3139
2941b1cThanks @pranaygp! - Deliver step results, wait completions, hook payloads and aborts 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 await_completed,hook_receivedor abort that a concurrent branch is awaiting. -
#3078
b610c46Thanks @karthikscale3! - Stream write batching now lives in the server writable itself (group commit), so rawReadableStreams piped across workflow/step boundaries batch the same asgetWritable()instead of sending one request per chunk. -
Updated dependencies [
8c12358,b4ba79e,a86035f,d24c91c,313a074,fc81f45,49276f2,49276f2,4ada27d,62d570e,62d570e,62d570e,49276f2]:- @workflow/world@5.0.0-beta.23
- @workflow/world-vercel@5.0.0-beta.33
- @workflow/world-local@5.0.0-beta.31
- @workflow/utils@5.0.0-beta.7
- @workflow/errors@5.0.0-beta.13
5.0.0-beta.36
Minor Changes
-
#2865
a5e6f11Thanks @NathanColosimo! - Addexperimental_minRetentionfor keeping a Hook token unavailable after its run ends, and require supporting Worlds to advertise thehookRetentioncapability. -
#2946
eb8fdb9Thanks @VaguelySerious! - TheWORKFLOW_PRECONDITION_GUARDevent-creation guard is now on by default; opt out withWORKFLOW_PRECONDITION_GUARD=0.
Patch Changes
-
#2993
6d1d700Thanks @NathanColosimo! - Avoid resolving run data before background step execution. -
#2996
d8071bbThanks @joeyhotz! - Cache self-hosted step port discovery per process. -
#2986
fe12b84Thanks @shalabhc! - Enforce a server-supplied per-run event limit (default 25K) -
#2970
bb773e9Thanks @VaguelySerious! - Keep the inline event-log delta fast path active with open hooks whenWORKFLOW_PRECONDITION_GUARD=1and the World declarescapabilities.preconditionGuard. The lazy inlinestep_startedclaim now carries the guard snapshot so a stale replay's claim is fenced (412 → fresh replay), and guard-enforced batches with an open hook take the await-then-run path so a fenced claim never executes the step body. -
#2980
268fedeThanks @NathanColosimo! - Prepare encrypted replay payloads concurrently and cache the decrypted, decompressed representation for reuse across inline replay iterations. -
#3035
9177ba8Thanks @VaguelySerious! - EnforcemaxRetriesfor inline and backgrounded steps that time out -
#2995
6353c8cThanks @VaguelySerious! - Fix stream writes never batching:flushablePipeawaited eachwriter.write()and the WritableStream sink serialized chunks one at a time, so the server writable's buffer never held more than one chunk and itswriteMultibatching path never engaged — every chunk became its own server round trip. The server writable now exposes a durable batch write thatflushablePipeuses to coalesce chunks arriving while a previous write is in flight into a singlewriteMulti, while preserving the existing durability guarantees. Coalesced batches are split at chunk-count and byte wire limits (WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH,WORKFLOW_STREAM_MAX_BYTES_PER_BATCH), independent of the read-ahead backpressure bound (WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS). -
Updated dependencies [
7d29bab,fe12b84,6f032d7,a5e6f11,850777a,457e671,eb8fdb9,9078126,59c1369,bb773e9,4ecbe7e]:- @workflow/world@5.0.0-beta.22
- @workflow/world-local@5.0.0-beta.30
- @workflow/world-vercel@5.0.0-beta.32
- @workflow/errors@5.0.0-beta.12
5.0.0-beta.35
Minor Changes
-
#2266
a00d169Thanks @VaguelySerious! - Add an opt-in optimistic-concurrency guard for event creation (WORKFLOW_PRECONDITION_GUARD=1): replay-context event creations send astateUpdatedAtsnapshot timestamp, and the runtime reloads the event log and retries (then falls back to a queue re-invocation) when the backend reports a newer out-of-band event with a 412PreconditionFailedError. -
#2929
1933e29Thanks @VaguelySerious! - Report run-started-to-first-step (rsfs) and final-scheduling-replay (finalSchedulingReplay) latency telemetry on step completion events.
Patch Changes
-
#2153
6b8efd5Thanks @rchasman! - Record cross-run lineage whenstart()is called from inside a workflow or step: the new run is tagged with$parentRunId(its direct parent) and inherits the parent's$rootRunId, so a daisy chain or fan-out of any depth groups under one root id. -
#2943
fd107b9Thanks @VaguelySerious! - Fixed TTFS latency telemetry reporting 0 for runs with region-tagged run IDs. -
Updated dependencies [
f72184d,a00d169,a00d169,1933e29,6b8efd5]:- @workflow/world-local@5.0.0-beta.29
- @workflow/world-vercel@5.0.0-beta.31
- @workflow/world@5.0.0-beta.21
- @workflow/errors@5.0.0-beta.11
5.0.0-beta.34
Patch Changes
-
#2901
9242ddbThanks @karthikscale3! - Move client-observed stream telemetry to core:chunk_rtton the flush span,connect_mson the read span, and newworkflow.stream.closeandworkflow.stream.read.completespans. Dedupe@opentelemetry/apito one workspace instance. -
Updated dependencies [
9242ddb]:- @workflow/world-vercel@5.0.0-beta.30
5.0.0-beta.33
Minor Changes
- #1981
9da2d76Thanks @TooTallNate! -start()now delegates run ID generation toworld.createRunId(options)when the world provides it, falling back to a monotonic ULID otherwise. The full options bag is passed through so worlds can read whichever fields they recognise. Adds a newregionoption that worlds may consume — when set, it is also forwarded onto the queue options so the initial workflow message is routed to the matching region.
Patch Changes
- Updated dependencies [
f2be954,ac41e7d,a4d8de0,c31e30c,9da2d76,9da2d76]:- @workflow/world@5.0.0-beta.20
- @workflow/world-vercel@5.0.0-beta.29
- @workflow/errors@5.0.0-beta.10
- @workflow/world-local@5.0.0-beta.28
5.0.0-beta.32
Patch Changes
-
#2891
4a43e39Thanks @karthikscale3! - Emit a client-observedworkflow.stream.flushspan per stream-write batch, with abuffer_dwell_msattribute separating client-side batching cost from network/server time. Log underDEBUG=workflow:*when@opentelemetry/apifails to load in world-vercel. -
Updated dependencies [
4a43e39]:- @workflow/world-vercel@5.0.0-beta.28
5.0.0-beta.31
Minor Changes
- #2882
0b956f6Thanks @VaguelySerious! - Renameexperimental_setAttributestosetAttributes— the attributes feature is no longer experimental. The old name remains available as a deprecated alias.
Patch Changes
- Updated dependencies [
7a1ea5a,0b956f6]:- @workflow/world@5.0.0-beta.19
- @workflow/world-local@5.0.0-beta.27
- @workflow/errors@5.0.0-beta.10
- @workflow/world-vercel@5.0.0-beta.27
5.0.0-beta.30
Minor Changes
-
#2850
f28150cThanks @karthikscale3! - Report step progress alongside step-to-step overhead latency telemetry. -
#2872
36c63afThanks @mitul-s! - Record the source run on replays:recreateRunFromExistingnow stampsreplayedFromRunIdinto the new run'sexecutionContext(andstartaccepts a matching option) so tooling can surface a run as a replay and link back to its origin.
Patch Changes
-
#2790
145835bThanks @NathanColosimo! - Centralize workflow event type classifiers and event-data payload field helpers. -
#2687
9958424Thanks @Osamaali313! - FixextractStreamIdsoverflowing the stack on circular references. The hydrated observability data it walks comes from devalue, which preserves circular and repeated references, so a step result containing a cycle would crash run inspection (wf inspectand the web dashboard) with aRangeError. The traversal now tracks visited containers and skips cycles. -
#2848
6603628Thanks @VaguelySerious! - Fix duplicate inline step execution when a hook or wait wakes a run while the step is still running (#2780). The lazystep_startednow records the owning queue message ID, and wake replays schedule a delayed backstop for in-flight inline steps instead of immediately re-dispatching them. Disable withWORKFLOW_INLINE_OWNERSHIP=0. -
#2874
48fcc4eThanks @karthikscale3! - Add anamespaceoption tostart(),recreateRunFromExisting(),reenqueueRun(), andwakeUpRun()for targeting deployments with namespaced queue topics, and makehealthCheck()respect its timeout when the stream read hangs. -
#2857
2c6ee61Thanks @karthikscale3! - Add stream latency to OTEL spans -
Updated dependencies [
f28150c,84df8f3,4dce2ae,145835b,6603628,2c6ee61]:- @workflow/world@5.0.0-beta.18
- @workflow/world-vercel@5.0.0-beta.26
- @workflow/world-local@5.0.0-beta.26
- @workflow/errors@5.0.0-beta.10
5.0.0-beta.29
Minor Changes
- #2833
3f69666Thanks @VaguelySerious! - Report time-to-first-step and step-to-step overhead latency telemetry on step completion events.
Patch Changes
-
#2833
3f69666Thanks @VaguelySerious! -experimental_setAttributesnow resolves via an in-process replay instead of a queue re-invocation, removing a delivery round-trip before subsequent steps. -
#2840
712ed61Thanks @VaguelySerious! - Add an optional reason to run cancellation (run.cancel({ cancelReason })), recorded on the cancellation event and shown in the run detail view. -
Updated dependencies [
79a9813,3f69666,712ed61]:- @workflow/world-local@5.0.0-beta.25
- @workflow/world@5.0.0-beta.17
- @workflow/world-vercel@5.0.0-beta.25
- @workflow/errors@5.0.0-beta.10
5.0.0-beta.28
Patch Changes
-
#2779
7637196Thanks @VaguelySerious! - FixcreateHook()conflicting with the run's own disposed hook when a token is reused afterdispose()within the same run -
#2732
239031aThanks @NathanColosimo! - Respect framework base paths when routing workflow traffic and expose health checks on generated Next.js workflow routes. -
#2807
e7e5a0eThanks @VaguelySerious! - Steps that receive anAbortSignalargument no longer pay a per-step queue round-trip: the real-time abort-stream reader opened for such a step is now released when the step finishes, so the step can complete inline instead of reporting pending work on every invocation. -
#2752
0f557d5Thanks @ijjk! - Statically inject the configured world package into host bundles instead of selecting worlds dynamically at runtime. -
#2468
49a50e8Thanks @NathanColosimo! - Standardize first-party World packages oncreateWorld(), support relative target World modules consistently, and align the Postgres WorldDATABASE_URLfallback with bootstrap. -
Updated dependencies [
c1d29f1,c1d29f1,7637196,e7e5a0e,239031a,0f557d5,fe327e6,49a50e8,03862ed]:- @workflow/world-local@5.0.0-beta.24
- @workflow/utils@5.0.0-beta.6
- @workflow/world-vercel@5.0.0-beta.24
- @workflow/world@5.0.0-beta.16
- @workflow/errors@5.0.0-beta.10
5.0.0-beta.27
Minor Changes
- #2718
cc7f076Thanks @VaguelySerious! - Make runtime tuning constants (timeouts, retry counts, stream buffering/reconnect) configurable viaWORKFLOW_*environment variables, and forwardWORKFLOW_TEST_LIMIT_OVERRIDESto the backend as a request header so a deployment can tighten server-side limits for testing.
Patch Changes
-
#2665
5a23159Thanks @NathanColosimo! - Reduce e2e timing and polling flakes. -
#2678
f6772d9Thanks @ijjk! - Speed up Next.js workflow dev rebuilds, ignore commented imports during HMR discovery, and avoid Turbopack resolving custom-world dynamic imports. -
Updated dependencies [
f6772d9,fc5bdcb,f76377b,cc7f076,2ab7057,89f4726]:- @workflow/utils@5.0.0-beta.5
- @workflow/world-local@5.0.0-beta.23
- @workflow/world@5.0.0-beta.15
- @workflow/world-vercel@5.0.0-beta.23
- @workflow/errors@5.0.0-beta.9
5.0.0-beta.26
Patch Changes
-
603ad97- Treat transient world-vercel transport failures as retryable, surfacing them as aTRANSPORTtypeWorkflowWorldError, to be retried by the queue instead of failing the run. -
#2685
2477ad8Thanks @VaguelySerious! - Fix a turbo-mode race where a fire-and-forget hook, wait, or attribute created by a workflow that completes synchronously could be written to the server before the run was created. -
Updated dependencies [
897aac9,603ad97,1dcdafd]:- @workflow/world-vercel@5.0.0-beta.22
5.0.0-beta.25
Patch Changes
-
#2666
b180270Thanks @NathanColosimo! - Retry inline step completion persistence failures instead of recording them as step failures. -
1ea2b4e- Fix a turbo-mode race where step-body writes (experimental_setAttributesand stream writes viagetWritable) could reach the server before the workflow run was created. -
Updated dependencies [
5977694,d4e6c5b,a1cbc8b,48e6bbf]:- @workflow/world-local@5.0.0-beta.22
- @workflow/world-vercel@5.0.0-beta.21
- @workflow/world@5.0.0-beta.14
- @workflow/errors@5.0.0-beta.8
5.0.0-beta.24
Patch Changes
- #2565
3fd4cc5Thanks @ijjk! - Collapse default workflow build output to a single completion summary and move detailed progress logs behind DEBUG=workflow:build.
5.0.0-beta.23
Patch Changes
- #2592
2bf5257Thanks @karthikscale3! - Add OpenTelemetry spans, turbo tagging, and generated-route module timing around/flowinitialization.
5.0.0-beta.22
Patch Changes
-
#2569
d108ba3Thanks @VaguelySerious! - Turbo mode now tells world-vercel to skip the run_started event-log preload it never reads, reducing request time. -
Updated dependencies [
25c3df7,d476d7a,d108ba3]:- @workflow/world@5.0.0-beta.13
- @workflow/world-vercel@5.0.0-beta.20
- @workflow/errors@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.21
5.0.0-beta.21
Minor Changes
- #2526
3e82a12Thanks @VaguelySerious! - Add turbo mode (on by default, disable withWORKFLOW_TURBO=0): on the first delivery of a run's first invocation the runtime backgroundsrun_started, skips the initial event-log load, and forces optimistic inline start so the run reaches its first steps with no preceding network round-trips. It is safe there because the first delivery has no concurrent handler to race; turbo mode deactivates once a hook or sleep is encountered.
Patch Changes
-
#2412
6de5ea5Thanks @VaguelySerious! - Fix a race where anAbortControlleraborted from a step was not reflected in acontroller.signalpassed to a subsequent step. The step now commits the abort's durable hook event before completing, and the workflow's suspension waits for the abort to land before serializing downstream step arguments. -
#2472
66ca0dcThanks @pranaygp! - Memoize hydrated step return values across inline replay iterations, turning the per-invocation step-result decrypt+parse cost from O(N²) to O(N) for sequential workflows. Only primitive results are cached, so deterministic replay is preserved.
5.0.0-beta.20
Minor Changes
-
#2525
7aee0d4Thanks @TooTallNate! - Derive the workflow VM's deterministic RNG seed fromrunId:workflowName:deploymentId(instead of including the run'sstartedAt) and its initial fixed clock from the ULID timestamp embedded inrunId. These inputs are all available the moment a queue message arrives, decoupling VM setup from therun_startedround-trip. Note: this changes the seed-derived value sequence (step/hook correlation IDs, nanoids, random values) for a given run, so runs started before this change must not be replayed across the upgrade. -
#2516
84ccd40Thanks @VaguelySerious! - Inline execution now runs up toWORKFLOW_MAX_INLINE_STEPS(default 3) steps in parallel per suspension, each lazily created. An opt-inWORKFLOW_OPTIMISTIC_INLINE_START(default off) additionally starts step bodies beforestep_startedis confirmed, reconciling the in-flight start before the terminal write so a lost create-claim is discarded; it is off by default because under contention a step body can run more than once (e.g. two runs writing to the workflow stream can corrupt it), so only enable it for idempotent steps.
Patch Changes
-
#2473
16b3670Thanks @pranaygp! - Drain consecutively consumable replay events in a single synchronous pass instead of oneprocess.nextTickper event, removing O(N) macrotask hops from replay. -
#2475
2074f91Thanks @pranaygp! - Skip the per-step incrementalevents.listround-trip in the inline sequential loop by consuming an event-log delta returned from the step's terminal write (gated to the single-step case with no open hooks or waits).Add the opt-in
CreateEventParams.sinceCursorcontract so a step-terminalevents.createcan return the event-log delta since that cursor (viaEventResult.events/cursor/hasMore).Return the inline delta from a step-terminal write when
sinceCursoris supplied, computed identically toevents.listso the consumed prefix cannot skew from the server log.Forward
sinceCursorover the v4 wire in@workflow/world-vercelso the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back toevents.list. -
#2478
e7ef9d8Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a singlestep_startedcarrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.@workflow/world:step_startedevent data accepts an optionalinput, andEventResultgains astepCreatedownership signal.@workflow/world-local:step_startedwith input atomically creates the step plus a syntheticstep_createdevent; a lazystep_startedfor an already-existing step throwsEntityConflictErrorso concurrent losers skip (exactly-once).@workflow/world-postgres: same lazy-create + exactly-once create-claim for the Postgres backend.@workflow/world-vercel: sends the step input onstep_startedover the v4 wire and threads the server'sstepCreatedsignal intoEventResult. -
#2522
722bb7cThanks @VaguelySerious! - Cache the local dev server port per process so workflow replays no longer re-run OS port discovery (which spawnslsofon macOS, ~60ms) on every replay. -
#2527
de91f20Thanks @karthikscale3! - RefineWORKFLOW_TRACE_MODE=linked(the default) so each queue-deliveredworkflow.execute/step.executespan nests under its local delivery context instead of starting a new trace root. -
#2511
ab2e9b8Thanks @VaguelySerious! - EmitworkflowNameon per-step events (step_created,step_completed, and lazy-startstep_started) so Worlds can access it without additional queries -
#2471
939890dThanks @pranaygp! - Cache the compiled workflow-bundlevm.Scriptper process so replays reuse the compiled bundle instead of re-parsing it on every iteration. -
#2490
a92c16dThanks @pranaygp! - Reject an explicit empty-stringtokenincreateHook(). Omit the option (or passundefined) to get a randomly generated token, or pass a non-empty string. -
#2529
37312edThanks @pranaygp! - Speed up workflow stack-trace remapping when source maps are absent (production default): skip bundle scanning when no frame references the workflow file and memoize parsed source maps per bundle. -
Updated dependencies [
b563126,2074f91,e7ef9d8,ab2e9b8,1332da3,fb5abbb,90efb96]:- @workflow/world-local@5.0.0-beta.20
- @workflow/world-vercel@5.0.0-beta.19
- @workflow/world@5.0.0-beta.12
- @workflow/errors@5.0.0-beta.8
5.0.0-beta.19
Patch Changes
- Updated dependencies [
26fd184]:- @workflow/world-vercel@5.0.0-beta.18
5.0.0-beta.18
Minor Changes
- #2394
5f0b845Thanks @pranaygp! - Compress serialized payloads (step inputs/outputs, workflow arguments/return values, errors, hook payloads) before storage using composable codec format prefixes. zstd is the preferred codec (markedly faster than gzip at an equal-or-better ratio, vianode:zlib); gzip (CompressionStream) is the portable fallback when zstd is unavailable. Reads dispatch on the prefix, so both codecs are always decodable. Compression is applied before encryption, gated on run specVersion 5, and skipped for small or incompressible payloads.WORKFLOW_DISABLE_COMPRESSION=1disables writes;WORKFLOW_COMPRESSION_CODEC=gzipforces the portable codec.
Patch Changes
-
#2394
5f0b845Thanks @pranaygp! - Emit OpenTelemetry span attributes for payload compression on the serialize (write) and deserialize (read) paths:workflow.serialization.{operation,compressed,uncompressed_bytes,stored_bytes,compression_ratio}. Sizes are measured at the compression boundary (pre-encryption). Telemetry failures never affect serialization. -
#2397
4b7a720Thanks @pranaygp! -start({ deploymentId: 'latest' })is now a no-op in Worlds that don't support atomic deployments (local dev, Postgres) instead of throwing — it logs a warning and targets the current deployment, so workflows that use'latest'on Vercel still run locally. -
#2470
3c79c56Thanks @TooTallNate! - Fix the payload-compression capability cutoff: gzip/zstd are gated on5.0.0-beta.18(the first published version containing the compression read path) instead of5.0.0-beta.16. The previous cutoff would let a producer write compressed payloads to a beta.16/beta.17 target that cannot decode them. -
Updated dependencies [
5f0b845,5f0b845,6aa1ce0]:- @workflow/world-vercel@5.0.0-beta.17
- @workflow/world@5.0.0-beta.11
- @workflow/errors@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.19
5.0.0-beta.17
Minor Changes
-
#2363
926a5e7Thanks @karthikscale3! - AddWORKFLOW_TRACE_MODEwith a newlinkeddefault: each workflow/step invocation span is now its own trace root with span links to the delivery and run-origin contexts, instead of one trace spanning the entire run. world-vercel now explicitly injects W3Ctraceparent/tracestate/baggageheaders on outgoing workflow-server requests.Span names are also friendlier: workflow and step spans now use the short function name (e.g.
workflow.execute processOrder,step.execute chargeCard,workflow.start processOrder) instead of the uppercase prefixes and full machine names (WORKFLOW_V2 workflow//./src/jobs/order//processOrder). The full name remains available in theworkflow.name/step.namespan attributes, and newworkflowDisplayName/stepDisplayNamehelpers are exported from@workflow/utils.Behavioral changes to telemetry under the new default (set
WORKFLOW_TRACE_MODE=continuousto restore the previous trace shape exactly; the span-name change applies in both modes):- A run no longer shares one trace ID: the trace of the request that called
start()no longer contains the workflow's execution spans — navigate via span links or theworkflow.run.idattribute instead. - Sampling decisions are made independently per invocation root (previously one parent-based decision covered the whole run), and the number of root spans/traces increases to one per invocation.
workflow.execute/step.executeinvocation spans (formerlyWORKFLOW_V2/STEP) become parentless roots, which changes parent/child-based queries and service-map edges.- Re-enqueued queue messages forward the original run-origin trace carrier unchanged, rather than each invocation's current context.
- Queries or dashboards matching the old
WORKFLOW_V2 .../STEP ...span names must switch to the new names. - The queue-delivered
workflow.executespan kind changed frominternaltoconsumer, matching the queue-deliveredstep.executespan (this applies in both modes).
Existing attributes and baggage keys are unchanged, and everything remains a no-op when no OpenTelemetry SDK is registered.
- A run no longer shares one trace ID: the trace of the request that called
Patch Changes
- Updated dependencies [
926a5e7]:- @workflow/world-vercel@5.0.0-beta.16
- @workflow/utils@5.0.0-beta.4
- @workflow/errors@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.18
5.0.0-beta.16
Minor Changes
- #2385
628795aThanks @pranaygp! - Add anallowReservedAttributesoption tostart()so framework-level callers can seed reserved$-prefixed run attributes at creation, matching the existingexperimental_setAttributesoption. The flag is carried through the resilient-start queue input so lazy run creation validates identically.
Patch Changes
- Updated dependencies [
af859c3,628795a,0178fa5]:- @workflow/world-local@5.0.0-beta.17
- @workflow/world-vercel@5.0.0-beta.15
- @workflow/world@5.0.0-beta.10
- @workflow/errors@5.0.0-beta.7
5.0.0-beta.15
Minor Changes
-
#1853
303b6daThanks @TooTallNate! - Add opt-in wire-level framing for byte streams (type: 'bytes') so consumers can identify chunk boundaries — a prerequisite for transparent auto-reconnect. The framing decision is gated on a newframedByteStreamscapability and recorded per-stream in the serialized ref (framing: 'framed-v1'); legacy raw streams continue to work unchanged. -
#2373
01c8c08Thanks @pranaygp! - Replacehook.hasConflict(aPromise<boolean>property) withhook.getConflict(), a method returning a promise that suspends the workflow to commit hook registration and resolves with the conflictingRunwhen another active hook owns the token (ornullonce the hook is registered), without waiting for hook payload data. Code usingawait hook.hasConflictshould migrate toconst conflict = await hook.getConflict()and branch onconflict !== null. -
#2226
ae8d6feThanks @pranaygp! - Allow passing initial run attributes throughstart(), and speed up workflow-levelsetAttributecalls by using native events for recording attributes.
Patch Changes
-
#1925
b3279f8Thanks @VaguelySerious! - V2 suspension processing: unify wait + step queue dispatch into a single parallel batch. The runtime now queues every pending operation (non-inline steps + wait timer) in onePromise.alland then inline-executes one owned step (if any). The asymmetric{ timeoutSeconds }return contract for waits is dropped from suspension processing; waits become normal queue continuations withdelaySeconds, deduplicated per wait so repeated suspension passes don't accumulate delayed messages. Continuation delays are clamped to 23h (VQS's message-retention bound) with longer waits chained across hop-keyed messages, so multi-daysleep()s work on every world. This restores inline step execution forPromise.race(step, sleep)workflows without any of the carve-outs the prior fix needed: even when the inline step blocks the handler, the wait continuation fires in parallel and drives the next replay. As part of the same change,world-local's queue now honorsdelaySeconds(matchesworld-vercel/world-postgres), and itsclose()aborts pending delayed deliveries and retry sleeps so dev-server/test shutdown isn't held open by wait timers. -
Updated dependencies [
b3279f8,f2a7bde,ae8d6fe]:- @workflow/world-local@5.0.0-beta.16
- @workflow/world@5.0.0-beta.9
- @workflow/world-vercel@5.0.0-beta.14
- @workflow/errors@5.0.0-beta.7
5.0.0-beta.14
Minor Changes
- #2305
4670c4bThanks @willsather! - Add an optionalnamespaceparameter that scopes queue topic prefixes to__{namespace}_wkf_workflow_*. This allows configuring multiple frameworks in the same deployment without queue topic collision.
Patch Changes
-
#2345
bf44d4dThanks @pranaygp! - Fix unhandled rejection whenstep_created/wait_createdcalls fail inwaitUntil -
#2318
eb976dbThanks @VaguelySerious! - Automatically reconnect object streams when the server stream connection times out. -
#2336
a813382Thanks @TooTallNate! - Fix unexpected rejections inwaitUntilcausing process crashes -
Updated dependencies [
95d7009,4670c4b]:- @workflow/world-vercel@5.0.0-beta.13
- @workflow/world@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.15
- @workflow/errors@5.0.0-beta.7
5.0.0-beta.13
Minor Changes
- #1854
8d75491Thanks @TooTallNate! - SurfaceworkflowCoreVersionfrom the responding deployment inhealthCheck()results.
Patch Changes
-
#2185
0fd0891Thanks @VaguelySerious! - FixCorruptedEventLogErroron replay when a workflow races a hook read against asleep()(e.g.Promise.race([hook, sleep])). Branch-deciding deliveries (buffered hook payloads and wait completions) are now handed to the workflow in strict event-log order — anchored on event position rather than on microtask-resolution timing — so the committed branch wins the race deterministically, independent of decryption/hydration time orPromise.raceargument order. -
#2257
ccd37e9Thanks @pranaygp! - Avoid unhandled run lookups for unused or empty readable streams and include Vercel request correlation headers in world transport errors. -
#2301
bb6ff9aThanks @pranaygp! - Update vulnerable package dependencies to patched releases. -
#2292
aa628b7Thanks @pranaygp! - Bumpdevalueto 5.8.1 to address published security advisories. -
Updated dependencies [
867e339,ccd37e9,81bda49,c19f38d]:- @workflow/world-local@5.0.0-beta.14
- @workflow/world-vercel@5.0.0-beta.12
5.0.0-beta.12
Patch Changes
-
#2211
52d63d1Thanks @pranaygp! - Prevent replayed workflows from advancing their deterministic clock when a future event is inspected before its matching operation is invoked. -
#2212
2a3b11bThanks @pranaygp! - Retry transient workflow replay divergence before classifying repeated divergence as a corrupted event log. -
#2215
12c35b5Thanks @pranaygp! - Skip workflow replay when a refreshed event log already contains a terminal run event. -
Updated dependencies [
b8a337c,ddc8a79,2a3b11b,3a16272]:- @workflow/world-local@5.0.0-beta.13
- @workflow/world-vercel@5.0.0-beta.11
- @workflow/errors@5.0.0-beta.7
- @workflow/world@5.0.0-beta.7
5.0.0-beta.11
Patch Changes
-
#2180
1ee63b8Thanks @pranaygp! - Harden runtime event pagination against rejected, repeated, or overlapping cursor responses. -
#2191
8f68d35Thanks @pranaygp! - Fix forwarded writable stream encryption when child workflows execute on a newer deployment than their parent. -
Updated dependencies [
8f68d35,7994629]:- @workflow/world@5.0.0-beta.6
- @workflow/world-vercel@5.0.0-beta.10
- @workflow/errors@5.0.0-beta.6
- @workflow/world-local@5.0.0-beta.12
5.0.0-beta.10
Patch Changes
-
#2145
8d0928bThanks @TooTallNate! - Classify SDK-level AES-GCM encryption failures asRUNTIME_ERRORinstead ofUSER_ERRORvia a newRuntimeDecryptionError. -
Updated dependencies [
8d0928b,3128dfc]:- @workflow/errors@5.0.0-beta.6
- @workflow/world-local@5.0.0-beta.11
- @workflow/world-vercel@5.0.0-beta.9
5.0.0-beta.9
Patch Changes
-
#2150
4b5f017Thanks @pranaygp! - Treat serialized and cross-realmAbortErrorstep failures as fatal cancellations, and stabilize abort E2E readiness checkpoints. -
#2157
409b103Thanks @VaguelySerious! - Allowexperimental_setAttributes()to be called from step functions. -
#2142
ae37315Thanks @pranaygp! - Prevent failed stream writes from surfacing as unhandled rejections and include request correlation details in stream errors. -
Updated dependencies [
65336df,ae37315]:- @workflow/world-local@5.0.0-beta.8
- @workflow/world-vercel@5.0.0-beta.8
5.0.0-beta.8
Patch Changes
-
#2134
1e6b1fdThanks @VaguelySerious! - Addexperimental_setAttributes()workflow-level helper for attaching string key/value metadata to a workflow run, surfaced asrun.attributes -
#2086
2050656Thanks @VaguelySerious! - FixgetWritable()returning a new TransformStream per call, which caused racing pipes to reorder chunks when callers acquired a writer per write. Repeat calls within the same step now share a single pipe per(runId, namespace). -
#2134
1e6b1fdThanks @VaguelySerious! - Harden workflow error stack remapping for large inline sourcemaps. -
#1799
503a929Thanks @TooTallNate! - Use inline sourcemaps for all workspace packages; published packages no longer ship external.js.mapfiles. -
Updated dependencies [
1e6b1fd,62ec537,b0d0561,503a929,657e8bb]:- @workflow/world@5.0.0-beta.5
- @workflow/world-local@5.0.0-beta.7
- @workflow/world-vercel@5.0.0-beta.7
- @workflow/errors@5.0.0-beta.5
- @workflow/serde@5.0.0-beta.2
- @workflow/utils@5.0.0-beta.3
5.0.0-beta.7
Minor Changes
- #2059
49da6c5Thanks @TooTallNate! - AWritableStreamfrom a workflow'sgetWritable()can now be passed as an argument to a child workflow viastart(); the child's writes land on the parent run's stream directly for the full lifetime of the child run.
Patch Changes
-
#2038
dc0be50Thanks @pranaygp! - Refresh workflow events after completing elapsed waits so concurrent hook events preserve deterministic replay order. -
#2046
ad71b58Thanks @pranaygp! - Report corrupted event logs with a distinctCorruptedEventLogErrortype andCORRUPTED_EVENT_LOGrun error code. -
#2056
9454151Thanks @VaguelySerious! - Fix spurious "Event cursor missing after initial load" warning -
#2030
b124365Thanks @pranaygp! - Validate step, wait, and hook lifecycle events against replay ownership metadata. -
#2013
2a446afThanks @TooTallNate! - Exclude inline step execution from the workflow replay timeout. Long-running steps no longer hitREPLAY_TIMEOUT(fixes #2009). Adds aWORKFLOW_REPLAY_TIMEOUT_MSenv var override and a new optionalWorld.processExitTriggersQueueRedeliverycapability used to gate the runtime'sprocess.exit(1)failure path. -
#2060
1d3959eThanks @pranaygp! - Record fatal world response contract failures as non-retryable workflow errors. -
Updated dependencies [
dc0be50,ad71b58,b124365,2a446af,1d3959e]:- @workflow/world@5.0.0-beta.4
- @workflow/world-local@5.0.0-beta.6
- @workflow/world-vercel@5.0.0-beta.6
- @workflow/errors@5.0.0-beta.4
5.0.0-beta.6
Patch Changes
-
#2012
9d2a926Thanks @pranaygp! - Expose the active run ID on hook token conflict errors. -
Updated dependencies [
9d2a926,c43e721,c145bf5,22b5a12]:- @workflow/errors@5.0.0-beta.3
- @workflow/world@5.0.0-beta.3
- @workflow/world-local@5.0.0-beta.5
- @workflow/world-vercel@5.0.0-beta.5
5.0.0-beta.5
Major Changes
- #1851
5f22832Thanks @TooTallNate! - BREAKING CHANGE: Run and step errors are now serialized through the workflow serialization pipeline, preserving original class identity and cause chains onWorkflowRunFailedError.cause. Pre-upgrade failed runs in theworld-postgreslegacyerrortext column surface aserror: undefinedon read; the original payload is still readable directly from theerrorJsoncolumn for manual inspection.
Minor Changes
-
#1511
e7ea068Thanks @TooTallNate! - Add first-class serialization support for built-in Error subclasses (TypeError,RangeError,SyntaxError,URIError,ReferenceError,EvalError,AggregateError) and preserve thecauseproperty on all Error types -
#1513
74b13cdThanks @TooTallNate! - Add first-class serialization forFatalErrorandRetryableErrorso they round-trip with class identity preserved across all serialization boundaries (including from environments that don't run the SWC plugin)
Patch Changes
-
#1301
aee5699Thanks @pranaygp! - Drain pending queue items at workflow completion instead of only logging warnings, and implicitly dispose any never-aborted system (abort) hooks at completion so unusedAbortControllerinstances don't leave abandoned rows in the hooks table for the run's TTL -
#1301
aee5699Thanks @pranaygp! - FixDOMExceptionnot serializing correctly -
#1924
3535cafThanks @VaguelySerious! - FixPromise.race(step, sleep)always blocking until step completed -
#1849
1203daeThanks @pranaygp! - Friendlier workflow error messages. NewSerializationError,WorkflowBuildError, and structured context-violation classes (e.g.NotInWorkflowContextError) with actionable hints and docs links applied to user-facing throw sites;FatalError.is()recognizes any error withfatal: trueso context violations and serialization failures now fail fast instead of burning retry attempts. Runtime logs are namespaced under[workflow-sdk]and gainerrorAttribution(uservssdk) plus class-aware hints -
#1747
00a011dThanks @ijjk! - Fix eager Next.js workflow builds with lazy discovery disabled. -
#1849
1203daeThanks @pranaygp! - Replaceutil.inspect's default object dump for runtime structured-log metadata with an opinionated, workflow-aware formatter. The runtime logger uses color-coded metadata blocks. -
#1301
aee5699Thanks @pranaygp! - Add serializableAbortControllerandAbortSignalsupport across workflow and step boundaries. Workflow code can now construct anAbortController, passsignalto steps, and callabort().Behavior change:
AbortErrorthrown from inside a step is now wrapped asFatalErrorand skips retry semantics. As a result, custom timeouts onfetchinside steps are no longer re-tried by default, and now need to be wrapped inRetryableErrorto preserve the old behavior. -
#1299
9f3516eThanks @TooTallNate! - Refactorserialization.tsinto modularserialization/files. No runtime change. -
#1935
d0e3f27Thanks @TooTallNate! - Preserve thethisbinding of bound step proxies across workflow serialization, so passinguseStep(...).bind(thisArg)as a step argument no longer loses the receiver. -
#1338
8ea1532Thanks @VaguelySerious! - Merge flow and step routes into a single combined handler that executes steps inline when possible, reducing function invocations and queue overhead. -
#1951
72911f7Thanks @VaguelySerious! - Fixworld.tsbeing tree-shaken out of the bundle and unavailable at runtime -
Updated dependencies [
540a2ef,92dc826,5eb0b79,5374148,1203dae,1203dae,5f22832,2f52d14,8ea1532,c1163eb,cd50618]:- @workflow/errors@5.0.0-beta.2
- @workflow/world-local@5.0.0-beta.4
- @workflow/world-vercel@5.0.0-beta.4
- @workflow/world@5.0.0-beta.2
- @workflow/utils@5.0.0-beta.2
5.0.0-beta.4
5.0.0-beta.3
Minor Changes
Patch Changes
-
#1848
7d07fabThanks @pranaygp! - Replaceevalinserialization.tsrevive()helper withJSON.parse.devalue.stringify()output is always valid JSON (special values are encoded as negative integer sentinels), soJSON.parseis a safe drop-in that eliminates theevalanti-pattern. -
Updated dependencies [
3ad8ee7,354840e]:- @workflow/world-local@5.0.0-beta.3
- @workflow/world-vercel@5.0.0-beta.3
5.0.0-beta.2
Patch Changes
-
#1716
df115fdThanks @karthikscale3! - Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection. Persistfeatures.encryptionflag inexecutionContextat run creation so the UI can detect encryption without a probe fetch. -
#1740
0810b75Thanks @VaguelySerious! - When runtime replays exceed 240s, re-try them up to three times, instead of failing immediately -
#1769
5a42964Thanks @tomdale! - Embed source content in published sourcemaps. -
#1778
b7d6595Thanks @TooTallNate! - Fix false-positive unconsumedstep_createderrors when replay resumes afor awaithook loop and appends more async work after the first promise-queue drain. -
#1681
ac09f40Thanks @TooTallNate! - Add clickable Run reference rendering in observability UI -
#1759
173756dThanks @TooTallNate! - Renameuseworkflow.devURLs toworkflow-sdk.dev -
Updated dependencies [
340c085,5a42964,11cfb8f,173756d]:- @workflow/world-vercel@5.0.0-beta.2
- @workflow/errors@5.0.0-beta.1
- @workflow/serde@5.0.0-beta.1
- @workflow/utils@5.0.0-beta.1
- @workflow/world-local@5.0.0-beta.2
5.0.0-beta.1
Major Changes
-
#1293
66d49c0Thanks @VaguelySerious! - BREAKING CHANGE: Restructure stream methods on World interface to useworld.streams.*namespace withrunIdas the first parameter.writeToStream(name, runId, chunk)→streams.write(runId, name, chunk),writeToStreamMulti→streams.writeMulti,closeStream→streams.close,readFromStream→streams.get(runId, name, startIndex?),listStreamsByRunId→streams.list(runId). -
#1632
0a86de3Thanks @TooTallNate! - BREAKING CHANGE: Remove@workflow/core/privateandworkflow/internal/privatepublic subpath exports. The SWC compiler plugin no longer generates imports from these paths. -
#1293
66d49c0Thanks @VaguelySerious! - RequirerunIdargument forworld.steps.get.
Minor Changes
-
#1652
ec517faThanks @TooTallNate! - Addfeatures.encryptiontoWorkflowMetadatareturned bygetWorkflowMetadata() -
#1616
71d39d2Thanks @TooTallNate! - Use custom class serialization forRunacross runtime and workflow VM contexts, and add e2e coverage forRuninstance boundary roundtrips -
#1677
9513a81Thanks @TooTallNate! - Add serialization support for workflow function references
Patch Changes
-
#1658
a5c90ceThanks @VaguelySerious! - Fix community world E2E tests by addingspecVersionto the World interface sostart()uses the safe baseline (v2) for worlds that don't declare their supported version -
#1678
ea97bd6Thanks @TooTallNate! - Remove redundanthc_prefix from health check correlationId that caused doubledhc_hc_in the derived runId and stream name. -
#942
873b4e2Thanks @VaguelySerious! - BREAKING CHANGE: MakegetWorldandcreateWorldasynchronous to support ESM dynamic imports for custom world modules. All callers must nowawait getWorld(). -
Updated dependencies [
66d49c0,a5c90ce,68cf25e,66d49c0]:- @workflow/world@5.0.0-beta.1
- @workflow/world-local@5.0.0-beta.1
- @workflow/world-vercel@5.0.0-beta.1
- @workflow/errors@5.0.0-beta.0
5.0.0-beta.0
Major Changes
- #1642
c5cdfc0Thanks @VaguelySerious! - Initial v5 beta release
Patch Changes
- Updated dependencies [
c5cdfc0]:- @workflow/errors@5.0.0-beta.0
- @workflow/serde@5.0.0-beta.0
- @workflow/utils@5.0.0-beta.0
- @workflow/world@5.0.0-beta.0
- @workflow/world-local@5.0.0-beta.0
- @workflow/world-vercel@5.0.0-beta.0
4.2.0-beta.78
Patch Changes
-
#1627
5f138f2Thanks @VaguelySerious! - Bump specVersion to 3 and gate CBOR queue transport on spec version. Old deployments (specVersion < 3) receive JSON queue messages; new deployments receive CBOR. Handler uses dual transport to deserialize both formats. Fixes replay/reenqueue from dashboard to older deployments. -
#1629
a6bcea9Thanks @VaguelySerious! - CLIstartcommand probes deployment specVersion via health check before choosing queue transport. Health check always uses JSON transport for compatibility with old deployments. -
#1533
7e70d18Thanks @VaguelySerious! - AddstreamFlushIntervalMsoption toStreamerinterface, optional for worlds to allow overwriting the default of 10ms in low-latency environments. -
#1512
ba916e1Thanks @TooTallNate! - AddDOMExceptionto the workflow VM context and add first-class serialization support, preservingmessage,name, and derivedcodeacross serialization boundaries -
#1618
c9b3038Thanks @VaguelySerious! - fix(core): properly propagate stream cancellation on disconnect -
#1537
c8dce52Thanks @VaguelySerious! - Allow workflow invocation to create run if initial storage call instartdid not succeed. Send run input through queue to enable this. Allow creating run_created and run_started events together in World, and skip first event list call by returning events directly. -
#1606
ab872ccThanks @VaguelySerious! - Make registeredSteps a global singleton to protect against module duplication and caching issues -
Updated dependencies [
5f138f2,7e70d18,c8dce52,5b9eb40]:- @workflow/world-vercel@4.1.0-beta.49
- @workflow/world@4.1.0-beta.17
- @workflow/world-local@4.1.0-beta.51
- @workflow/errors@4.1.0-beta.20
4.2.0-beta.77
Patch Changes
-
#1591
d8aaf27Thanks @VaguelySerious! - Fix stepcontextStorageglobal potentially seeing dual-instance issues when bundlers create multiple copies of the module. -
#1367
047c01bThanks @pranaygp! - Makestart()returnRun<unknown>withunknown[]args whendeploymentIdis provided, since the deployed workflow version may have different types -
Updated dependencies [
b30b0dc,760ebf1]:- @workflow/world@4.1.0-beta.16
- @workflow/world-local@4.1.0-beta.50
- @workflow/world-vercel@4.1.0-beta.48
- @workflow/errors@4.1.0-beta.20
4.2.0-beta.76
Patch Changes
- Updated dependencies [
ef2218a]:- @workflow/world-local@4.1.0-beta.49
- @workflow/world-vercel@4.1.0-beta.47
4.2.0-beta.75
Patch Changes
-
#1569
a98f8deThanks @VaguelySerious! - Combine initial run fetch, event fetch, and run_started event creation -
#1572
d38114bThanks @TooTallNate! - FixresumeHook()/resumeWebhook()failing on workflow runs from pre-encryption deployments by checking the target run'sworkflowCoreVersioncapabilities before encoding the payload -
#1567
6dc1b78Thanks @VaguelySerious! - Increase flow route limit to max fluid duration and fail run if a single replay takes too long -
Updated dependencies [
a98f8de,6dc1b78,329cdb3]:- @workflow/world@4.1.0-beta.15
- @workflow/world-local@4.1.0-beta.48
- @workflow/errors@4.1.0-beta.20
- @workflow/world-vercel@4.1.0-beta.46
4.2.0-beta.74
Patch Changes
-
#1546
62ff600Thanks @TooTallNate! - RemoveBufferglobal from workflow VM context -
#1547
4f646e3Thanks @TooTallNate! - Polyfill TC39Uint8Arraybase64/hex methods in workflow VM context -
Updated dependencies [
bd1f7e4]:- @workflow/world-local@4.1.0-beta.47
4.2.0-beta.73
Patch Changes
-
#1520
8e7083bThanks @pranaygp! - Addbtoa,atob, andBufferglobals to workflow VM context for base64 encoding/decoding -
#1523
d1391e1Thanks @pranaygp! - Fix race condition allowing duplicatehook_disposedevents for the same hook -
#1518
c739b99Thanks @ceolinwill! - FixgetWritable()in step functions to resolve on lock release instead of requiring stream close, preventing Vercel function timeouts -
Updated dependencies [
d1391e1]:- @workflow/world-local@4.1.0-beta.46
4.2.0-beta.72
Patch Changes
-
#1448
73a851aThanks @pranaygp! - AddHookConflictErrorto@workflow/errorsand use it for hook token conflicts instead ofWorkflowRuntimeError -
#1340
84599b7Thanks @pranaygp! - Add error code classification (USER_ERROR,RUNTIME_ERROR) torun_failedevents, improve queue and schema validation error logging -
#1452
672d919Thanks @pranaygp! - Fix workflow/step not found errors to fail gracefully instead of causing infinite queue retries -
#1344
beccbc4Thanks @pranaygp! - Remove VQS maxDeliveries cap and enforce max delivery limit in workflow/step handlers with graceful failure -
#1460
78f1b0eThanks @VaguelySerious! - Support negativestartIndexfor streaming (e.g.-3reads last 3 chunks) -
#1438
da6adf7Thanks @VaguelySerious! - Improve display when run data has expired -
#1342
aee035fThanks @pranaygp! - Replace HTTP status code checks with semantic error types (EntityConflictError, RunExpiredError, ThrottleError, TooEarlyError). BREAKING CHANGE:WorkflowAPIErrorrenamed toWorkflowWorldError. -
#1470
01bbe66Thanks @VaguelySerious! - AddgetStreamChunks()andgetStreamInfo()to the Streamer interface, andgetTailIndex()to the readable stream returned byrun.getReadable().WorkflowChatTransportnow reads thex-workflow-stream-tail-indexresponse header to resolve negativeinitialStartIndexvalues into absolute positions, fixing reconnection retries after a disconnect. -
#1446
2b07294Thanks @VaguelySerious! - Ensure open stream flush is await-able in pendingOps -
Updated dependencies [
73a851a,84599b7,fdbe853,2ef33d2,d428d66,672d919,beccbc4,78f1b0e,aee035f,741661b,01bbe66]:- @workflow/errors@4.1.0-beta.19
- @workflow/world-local@4.1.0-beta.45
- @workflow/world-vercel@4.1.0-beta.45
- @workflow/world@4.1.0-beta.14
4.2.0-beta.71
Patch Changes
-
#1409
97e4384Thanks @TooTallNate! - Remove@deprecatedtag fromdeploymentIdinStartOptions -
#1413
dcb0761Thanks @TooTallNate! - Refactor builtin step functions to usethisvalue serialization instead of explicit parameter passing. Remove unused duplicate builtins file from@workflow/core. -
#1396
2f0772dThanks @karthikscale3! - Track Vercel request IDs (x-vercel-id) on all workflow events for correlating request logs with workflow executions -
#1400
a2c0c7eThanks @VaguelySerious! - Seed lazy workflow file discovery in NextJS. Require workflow definitions to be in manifest for Vercel environments. -
#1418
2cc42cbThanks @VaguelySerious! - Don't fail to queue on 409 responses -
#1402
f52afe7Thanks @VaguelySerious! - Reduce log severity for 409/429 logs fromwarntoinfo, as they can't be meaningfully acted on by the consumer. -
Updated dependencies [
02ea057,d6e8727,2f0772d,0f07403,e902980,94c14c7]:- @workflow/world-local@4.1.0-beta.44
- @workflow/world-vercel@4.1.0-beta.44
- @workflow/world@4.1.0-beta.13
- @workflow/errors@4.1.0-beta.18
4.2.0-beta.70
Patch Changes
-
#1339
7df1385Thanks @TooTallNate! - Separate infrastructure vs user code error handling in workflow and step runtimes so transient network errors (ECONNRESET, etc.) propagate to the queue for retry instead of incorrectly marking runs as failed -
#1345
58e67ceThanks @TooTallNate! - Suppress staleWORKFLOW_VERCEL_*env var warning when running outside Vercel serverless (e.g. CLI, web observability app) -
Updated dependencies [
9feebee]:- @workflow/world-local@4.1.0-beta.43
4.2.0-beta.69
Patch Changes
-
#1317
825417aThanks @TooTallNate! - SupportdeploymentId: 'latest'instart()options to automatically resolve the most recent deployment ID for the current environment -
#1336
fb5a500Thanks @pranaygp! - Addexistsgetter toRunclass for checking if a workflow run exists without throwing -
Updated dependencies [
825417a,825417a,3648109,d5bc418]:- @workflow/world-vercel@4.1.0-beta.43
- @workflow/world@4.1.0-beta.12
- @workflow/world-local@4.1.0-beta.42
- @workflow/errors@4.1.0-beta.18
4.2.0-beta.68
Patch Changes
-
#1304
83dbd46Thanks @TooTallNate! - Stop readingWORKFLOW_VERCEL_*env vars at runtime to prevent unintended proxy routing -
#1318
854a25fThanks @TooTallNate! - Fixstart()not encrypting initial workflow input in external contexts (e2e tests, CLI). The resolveddeploymentIdwas not being passed togetEncryptionKeyForRun, causing it to silently skip encryption whendeploymentIdwas inferred from the environment rather than explicitly provided in options. -
Updated dependencies [
9781afb,4a6ddd8,d842ce1]:- @workflow/world-vercel@4.1.0-beta.42
- @workflow/world-local@4.1.0-beta.41
4.2.0-beta.67
Patch Changes
-
#1294
c71befeThanks @pranaygp! - Fix premature workflow suspension when hooks have buffered payloads and a concurrent sleep or incomplete step is pending -
#1285
36a901dThanks @TooTallNate! - AddworkflowNametogetWorkflowMetadata()andstepNametogetStepMetadata() -
Updated dependencies [
d8daa2a]:- @workflow/world@4.1.0-beta.11
- @workflow/world-local@4.1.0-beta.40
- @workflow/world-vercel@4.1.0-beta.41
- @workflow/errors@4.1.0-beta.18
4.2.0-beta.66
Patch Changes
-
#1290
8b5a388Thanks @pranaygp! - SupporttimeoutSeconds: 0for immediate re-enqueue without arbitrary delay -
#1283
dff00c9Thanks @VaguelySerious! - Avoid port inference in Vercel environment -
Updated dependencies [
8b5a388]:- @workflow/world-local@4.1.0-beta.39
- @workflow/world-vercel@4.1.0-beta.40
4.2.0-beta.65
Patch Changes
- Updated dependencies [
456c1aa,11dcb64]:- @workflow/world-local@4.1.0-beta.38
- @workflow/world@4.1.0-beta.10
- @workflow/world-vercel@4.1.0-beta.39
- @workflow/errors@4.1.0-beta.18
4.2.0-beta.64
Minor Changes
30e24d4Thanks @pranaygp! - BREAKING CHANGE:createWebhook()no longer accepts atokenoption. Webhook tokens are always randomly generated to prevent unauthorized access to the public webhook endpoint. UsecreateHook()withresumeHook()for deterministic server-side token patterns.
Patch Changes
-
#1270
adfe8b6Thanks @pranaygp! - AddHookNotFoundErrorto@workflow/errorsand adopt it across all world backends -
#1270
adfe8b6Thanks @pranaygp! - Prevent hooks from being resumed via the public webhook endpoint by default. AddisWebhookoption tocreateHook()to opt-in to public resumption.createWebhook()always setsisWebhook: true. -
#1251
7618ac3Thanks @TooTallNate! - Wire AES-GCM encryption into serialization layer with stream support -
#1246
860531dThanks @TooTallNate! - Route all event-driven promise resolutions through a sequential queue to ensure deterministic ordering -
#1254
60bc9d5Thanks @TooTallNate! - Fix false positive unconsumed event detection during async deserialization and cross-VM promise propagation -
#1256
bbe40ffThanks @TooTallNate! - Add encryption-aware o11y for CLI and web UI -
#1269
a7ae7e9Thanks @pranaygp! - Improve deterministic VM context seed derivation to incorporate additional run metadata -
Updated dependencies [
adfe8b6,adfe8b6,02f706f]:- @workflow/errors@4.1.0-beta.18
- @workflow/world-local@4.1.0-beta.37
- @workflow/world-vercel@4.1.0-beta.38
- @workflow/world@4.1.0-beta.9
4.1.0-beta.63
Patch Changes
-
#1232
4ab4412Thanks @pranaygp! - AddRun.wakeUp()method to programmatically interrupt pendingsleep()calls -
#1230
a9fea91Thanks @ijjk! - Fix deferred build mode for Next.js -
Updated dependencies [
2b1c2bd]:- @workflow/world-vercel@4.1.0-beta.37
4.1.0-beta.62
Patch Changes
-
#1172
6f2cbcdThanks @TooTallNate! - Fix custom Error subclass serialization precedence: move Instance reducer before Error reducer so that Error subclasses with WORKFLOW_SERIALIZE are serialized using custom class serialization instead of the generic Error serialization -
#1181
02681dcThanks @pranaygp! - Addhook.dispose()method to explicitly release hook tokens for reuse by other workflows while the current workflow is still running -
#1185
028a828Thanks @pranaygp! - Warn when workflow completes with uncommitted operations (unawaited steps, hooks, or sleeps) -
#1217
e55c636Thanks @pranaygp! - Upgrade dependencies across all packages -
Updated dependencies [
1cfb8b1,274ea8b,f3b2e08,e55c636]:- @workflow/world-vercel@4.1.0-beta.36
- @workflow/world-local@4.1.0-beta.36
- @workflow/utils@4.1.0-beta.13
- @workflow/world@4.1.0-beta.8
- @workflow/errors@4.1.0-beta.17
4.1.0-beta.61
Patch Changes
-
#1135
f5ea16fThanks @btsmithnz! - Updatedevalueto v5.6.3 to resolve security alerts -
#1178
70223a9Thanks @TooTallNate! - Don't enforce client-side generated runId instart()forv1Compat -
#1164
d99ca9cThanks @TooTallNate! - FixFatalErrorinstance serialization -
Updated dependencies [
b224521,49d1b6d,e1a2f47,c614456,b06e491]:- @workflow/world-vercel@4.1.0-beta.35
- @workflow/world@4.1.0-beta.7
- @workflow/errors@4.1.0-beta.16
- @workflow/world-local@4.1.0-beta.35
4.1.0-beta.60
Patch Changes
- #1147
c1cd9a3Thanks @VaguelySerious! - Handle 410s gracefully for run completion/failure
4.1.0-beta.59
Patch Changes
-
#1120
c75de97Thanks @VaguelySerious! - Handle 409 errors gracefully for step_completed, step_failed, and step_retrying events -
#956
b65bb07Thanks @TooTallNate! - Add browser-compatible AES-256-GCM encryption module withimportKey,encrypt, anddecryptfunctions; update all runtime callers to resolveCryptoKeyonce per run viaimportKey() -
Updated dependencies [
b65bb07,b65bb07]:- @workflow/world-vercel@4.1.0-beta.34
- @workflow/world@4.1.0-beta.6
- @workflow/errors@4.1.0-beta.16
- @workflow/world-local@4.1.0-beta.34
4.1.0-beta.58
Patch Changes
-
#978
0d5323cThanks @TooTallNate! - Refactor serialization code to be asynchronous -
#1098
7046610Thanks @pranaygp! - Auto-injectx-workflow-run-idandx-workflow-step-idVQS headers from queue payload inworld-vercel -
#1055
c2b4fe9Thanks @pranaygp! - Detect and fatal error on orphaned/invalid events in the event log instead of silently hanging -
#979
6e72b29Thanks @TooTallNate! - AddWorld.getEncryptionKeyForRun()and thread encryption key through serialization layer -
#999
ea3254eThanks @TooTallNate! - Separate project ID and project name into distinct env vars (WORKFLOW_VERCEL_PROJECT and WORKFLOW_VERCEL_PROJECT_NAME) -
#1031
1c11573Thanks @karthikscale3! - Refactor and enhance web-shared observability UI components and update builders base behavior. -
#1051
9f77380Thanks @VaguelySerious! - Fix 429 backoff for workflow runtime API calls -
#1118
852e3f1Thanks @VaguelySerious! - Do not re-throw error when multiple workflow invocations race to complete the workflow -
#1057
5e06a7cThanks @pranaygp! - Materialize waits as entities to prevent duplicate wait_completed events@workflow/core: Handle 409 conflict gracefully when creating wait_completed events, preventing crashes when multiple concurrent invocations race to complete the same wait@workflow/world: AddWaittype,WaitSchema, andWaitStatusSchemaexports; add optionalwaitfield toEventResult@workflow/world-local: Materialize wait entities on wait_created/wait_completed with duplicate detection; clean up waits on terminal run states@workflow/world-postgres: Addworkflow_waitstable withwait_statusenum; materialize wait entities with conditional writes for duplicate prevention; clean up waits on terminal run states
-
Updated dependencies [
7046610,c2b4fe9,6e72b29,ea3254e,29347b7,5e06a7c,5487983,5487983]:- @workflow/world-vercel@4.1.0-beta.33
- @workflow/errors@4.1.0-beta.16
- @workflow/world@4.1.0-beta.5
- @workflow/world-local@4.1.0-beta.33
4.1.0-beta.57
4.1.0-beta.56
Patch Changes
-
#1015
c56dc38Thanks @TooTallNate! - Extract browser-safe serialization format from@workflow/coreand split o11y hydration by environment. Data hydration now happens client-side in the browser, enabling future e2e encryption support. -
#990
d7d005bThanks @TooTallNate! - Allow@in workflow names to support scoped packages -
#1011
8d117cdThanks @pranaygp! - Retry 5xx errors from workflow-server in step handler to avoid consuming step attempts on transient infrastructure errors -
#1020
63caf93Thanks @TooTallNate! - Add format prefix and length-prefix framing to stream chunks for consistent serialization with step inputs/outputs. Backwards compatible with legacy newline-delimited streams. -
#992
dc2dc6aThanks @ijjk! - stop esbuild bundling for deferred step route in Next.js -
Updated dependencies [
63caf93]:- @workflow/world-local@4.1.0-beta.32
4.1.0-beta.55
Patch Changes
-
#998
3d770d5Thanks @ijjk! - Expose workflows manifest under diagnostics folder -
#976
a5935abThanks @ijjk! - Add lazy workflow/step discovery via deferredEntries in next -
#989
fc4cad6Thanks @karthikscale3! - Normalize errors cleanly so objects get destructured -
#966
56f2221Thanks @VaguelySerious! - Add 429 throttle retry handling and 500 server error retry with exponential backoff to the workflow and step runtimes -
Updated dependencies [
3d770d5,56f2221]:- @workflow/utils@4.1.0-beta.12
- @workflow/errors@4.1.0-beta.15
- @workflow/world@4.1.0-beta.4
- @workflow/world-vercel@4.1.0-beta.32
- @workflow/world-local@4.1.0-beta.31
4.1.0-beta.54
Patch Changes
-
#924
fcfaf8bThanks @TooTallNate! - SetstepIdproperty on function inregisterStepFunctionfor serialization support -
#954
d9e9859Thanks @TooTallNate! - Generate runId client-side in start() and simplify runId typesThe
runIdis now generated client-side using ULID before serialization, rather than waiting for the server response. This simplifies theStreamerinterface andWorkflowServerWritableStreamto acceptstringinstead ofstring | Promise<string>forrunId. -
#951
f7fd88eThanks @VaguelySerious! - Tidy health check latency calculation -
Updated dependencies [
d9e9859,aa448c2]:- @workflow/world@4.1.0-beta.3
- @workflow/world-vercel@4.1.0-beta.31
- @workflow/errors@4.1.0-beta.14
- @workflow/world-local@4.1.0-beta.30
4.1.0-beta.53
Patch Changes
-
#922
0ce46b9Thanks @pranaygp! - Add support for custom headers in queue messages -
#927
f090de1Thanks @karthikscale3! - Added subpatch exports for runtime modules to allow direct imports in core. Refactored web-shared to be a thin package that exported UI components and world-actions. Updated web package to consume the UI components and world-actions from web-shared. -
#933
79e988fThanks @pranaygp! - Add OTEL tracing for event loading and queue timing breakdown using standard OTEL semantic conventions -
#867
c54ba21Thanks @TooTallNate! - Add optionalwriteToStreamMultifunction to the World interface -
#935
e0061b8Thanks @pranaygp! - Improve logging: consolidate to structured logger, fix log levels, ensure errors/warnings are always visible -
#873
38e8d55Thanks @TooTallNate! - Ensure class serialization / deserialization only happens in the proper global context -
#932
088de0aThanks @pranaygp! - Improve OpenTelemetry tracing instrumentation- Add W3C trace context headers to step queue messages for cross-service trace linking
- Add
peer.serviceand RPC semantic conventions for external service attribution - Add
step.hydrateandstep.dehydratespans for argument serialization visibility - Add
workflow.replayspan for workflow event replay tracking - Rename
queueMessagespan toqueue.publishfollowing OTEL messaging conventions - Add OTEL baggage propagation for workflow context (
workflow.run_id,workflow.name) - Add span events for milestones:
retry.scheduled,step.skipped,step.delayed - Enhance error telemetry with
recordException()and error categorization (fatal/retryable/transient) - Use uppercase span names (WORKFLOW, STEP) for consistency with HTTP spans
- Add world-local OTEL instrumentation matching world-vercel
-
#947
efb33b2Thanks @TooTallNate! - Pass class asthiscontext to custom serializer/deserializer methods -
#932
088de0aThanks @pranaygp! - Optimize step handler performance and improve server-side validation- Skip initial
world.steps.get()call in step handler (saves one HTTP round-trip) - Add server-side
retryAftervalidation to local and postgres worlds (HTTP 425 when not reached) - Fix HTTP status code for step terminal state: return 409 (Conflict) instead of 410
- Fix race condition: await
step_startedevent before hydration to ensure correct attempt count
- Skip initial
-
Updated dependencies [
0ce46b9,c54ba21,088de0a,088de0a,79e988f,088de0a]:- @workflow/world@4.1.0-beta.2
- @workflow/world-vercel@4.1.0-beta.30
- @workflow/world-local@4.1.0-beta.29
- @workflow/errors@4.1.0-beta.14
4.1.0-beta.52
Patch Changes
- #916
e4e3281Thanks @VaguelySerious! - Fix circular dependency between runtime.ts and runtime/start.ts that caused issues with Bun's module resolution
4.1.0-beta.51
Minor Changes
- #621
4966b72Thanks @pranaygp! - BREAKING: Storage interface is now read-only; all mutations go throughevents.create()- Remove
cancel,pause,resumefromruns - Remove
create,updatefromruns,steps,hooks - Add run lifecycle events:
run_created,run_started,run_completed,run_failed,run_cancelled - Add
step_createdevent type - Remove
fatalfield fromstep_failed(terminal failure is now implicit) - Add
step_retryingevent with error info for retriable failures
- Remove
Patch Changes
-
#621
4966b72Thanks @pranaygp! - Runtime uses event-sourced entity creation- Suspension handler creates entities via
events.create() - Track
hasCreatedEventflag to avoid duplicate event creation on replay - Handle
hook_conflictevents during replay to reject duplicate token hooks
- Suspension handler creates entities via
-
#894
a2b688dThanks @VaguelySerious! - Fix resuming v1 hooks and cancelling/re-running v1 runs from a v2 UI or runtime -
#884
1f684dfThanks @TooTallNate! - Add a format identifier prefix for serialized data -
#814
b16a682Thanks @TooTallNate! - Move "parse-name" into theutilspackage -
#833
bd8116dThanks @TooTallNate! - RemoveskipProxyandbaseUrlconfig options, simplify proxy logic -
#853
1060f9dThanks @TooTallNate! - BREAKING CHANGE: Change user input/output to be binary data (Uint8Array) at the World interfaceThis is part of specVersion 2 changes where serialization of workflow and step data uses binary format instead of JSON arrays. This allows the workflow client to be fully responsible for the data serialization format and enables future enhancements such as encryption and compression without the World implementation needing to care about the underlying data representation.
-
#855
00c7961Thanks @TooTallNate! - Remove unusedgetWritablestub function -
#868
c45bc3fThanks @pranaygp! - Add SDK version to workflow run executionContext for observability -
Updated dependencies [
4966b72,26a9833,b59559b,4966b72,a2b688d,4966b72,b16a682,bd8116d,1060f9d,4966b72,4966b72,b973b8d,57f6376,60a9b76,4966b72,4966b72]:- @workflow/world@4.1.0-beta.1
- @workflow/world-local@4.1.0-beta.28
- @workflow/errors@4.1.0-beta.14
- @workflow/world-vercel@4.1.0-beta.29
- @workflow/serde@4.1.0-beta.2
- @workflow/utils@4.1.0-beta.11
4.0.1-beta.41
Patch Changes
-
#816
5ba82ecThanks @TooTallNate! - Add health check read stream retry/recovery logic -
Updated dependencies [
202c524,5ba82ec,f3785f0,b05dbd7]:- @workflow/world-local@4.0.1-beta.27
- @workflow/world-vercel@4.0.1-beta.28
4.0.1-beta.40
Patch Changes
-
#762
1843704Thanks @TooTallNate! - Add support for custom class instance serialization -
#809
f93e894Thanks @TooTallNate! - Show custom class serialization UI and class names in o11y -
Updated dependencies [
8621917]:- @workflow/serde@4.0.1-beta.1
4.0.1-beta.39
Patch Changes
-
#792
344c90fThanks @ijjk! - Add Next.js pages router entries handling -
#788
b729d49Thanks @VaguelySerious! - Allow passing custom world to runtime start() call
4.0.1-beta.38
Patch Changes
- #754
7906429Thanks @TooTallNate! - Add support for serializingthiswhen invoking step functions
4.0.1-beta.37
Patch Changes
-
#743
61fdb41Thanks @TooTallNate! - Add queue-based health check feature -
#773
3dd5b27Thanks @TooTallNate! - MakeresumeHook()accept aHookobject or string -
#776
49f650cThanks @Timer! - Fix race condition where step would stay pending forever if process crashed between database write and queue write -
#678
39e5774Thanks @TooTallNate! - Fix stream serialization to resolve when user releases lock instead of waiting for stream to close. This prevents Vercel functions from hanging when users incrementally write to streams within steps (e.g.,await writer.write(data); writer.releaseLock()). Uses a polling approach to detect when the stream lock is released and all pending writes are flushed. -
Updated dependencies [
61fdb41,0aa835f]:- @workflow/world@4.0.1-beta.13
- @workflow/errors@4.0.1-beta.13
- @workflow/world-local@4.0.1-beta.26
- @workflow/world-vercel@4.0.1-beta.27
4.0.1-beta.36
Patch Changes
- Updated dependencies [
dd3db13]:- @workflow/world@4.0.1-beta.12
- @workflow/world-local@4.0.1-beta.25
- @workflow/world-vercel@4.0.1-beta.26
- @workflow/errors@4.0.1-beta.13
4.0.1-beta.35
Patch Changes
4.0.1-beta.34
Patch Changes
-
#703
9b1640dThanks @TooTallNate! - Do not include initial attempt in step functionmaxRetriescount -
#712
307f4b0Thanks @ijjk! - Revert lazy workflow and step discovery -
Updated dependencies [
9b1640d]:- @workflow/utils@4.0.1-beta.10
- @workflow/errors@4.0.1-beta.13
- @workflow/world-local@4.0.1-beta.24
- @workflow/world-vercel@4.0.1-beta.25
4.0.1-beta.33
Patch Changes
- Updated dependencies [
2dbe494]:- @workflow/world-local@4.0.1-beta.23
4.0.1-beta.32
Patch Changes
-
#455
e3f0390Thanks @karthikscale3! - Added Control Flow Graph extraction from Workflows and extended manifest.json's schema to incorporate the graph structure into it. Refactored manifest generation to pass manifest as a parameter instead of using instance state. Add e2e tests for manifest validation across all builders. -
Updated dependencies [
e3f0390]:- @workflow/world-local@4.0.1-beta.22
- @workflow/utils@4.0.1-beta.9
- @workflow/world@4.0.1-beta.11
- @workflow/errors@4.0.1-beta.12
- @workflow/world-vercel@4.0.1-beta.24
4.0.1-beta.31
Patch Changes
-
#624
25b02b0Thanks @VaguelySerious! - Add CORS headers to endpoints health check response -
Updated dependencies [
d9f6a49,0cf0ac3,c3464bf]:- @workflow/world-local@4.0.1-beta.21
- @workflow/utils@4.0.1-beta.8
- @workflow/errors@4.0.1-beta.11
- @workflow/world-vercel@4.0.1-beta.23
4.0.1-beta.30
Patch Changes
- Updated dependencies [
f2d5997]:- @workflow/world-local@4.0.1-beta.20
4.0.1-beta.29
Patch Changes
-
#649
eaf9aa6Thanks @TooTallNate! - Don't shadowglobalThis -
Updated dependencies [
75a5060,6cd1a47]:- @workflow/world-vercel@4.0.1-beta.22
4.0.1-beta.28
Patch Changes
-
#544
ea2a67eThanks @pranaygp! - perf: parallelize suspension handler and refactor runtime- Process hooks first, then steps and waits in parallel to prevent race conditions
- Refactor runtime.ts into modular files:
suspension-handler.ts,step-handler.ts,helpers.ts - Add otel attributes for hooks created (
workflow.hooks.created) and waits created (workflow.waits.created) - Update suspension status from
pending_stepstoworkflow_suspended
-
#625
712f6f8Thanks @VaguelySerious! - Change serialized stream names from v4 UUIDs to ULIDs -
Updated dependencies [
ce7d428,712f6f8,ab55ba2,4bdd3e5]:- @workflow/world-local@4.0.1-beta.19
- @workflow/world-vercel@4.0.1-beta.21
- @workflow/errors@4.0.1-beta.10
4.0.1-beta.27
Patch Changes
-
#627
deaf019Thanks @VaguelySerious! - [world-vercel] Allow skipping vercel backend proxy for e2e tests where CLI runs in runtime env -
#505
b56aae3Thanks @copilot-swe-agent! - Override setTimeout, setInterval, and related functions in workflow VM context to throw helpful errors suggesting to usesleepinstead -
#613
4d7a393Thanks @TooTallNate! - Add workflow endpoints health check query parameter -
Updated dependencies [
1ef6b2f,deaf019,b56aae3]:- @workflow/utils@4.0.1-beta.7
- @workflow/world-vercel@4.0.1-beta.20
- @workflow/errors@4.0.1-beta.9
- @workflow/world-local@4.0.1-beta.18
4.0.1-beta.26
Patch Changes
-
#588
696e7e3Thanks @VaguelySerious! - Fix rare case where workflows get stuck due to edge case in step update logic -
Updated dependencies [
c9b8d84]:- @workflow/world-local@4.0.1-beta.17
- @workflow/utils@4.0.1-beta.6
- @workflow/errors@4.0.1-beta.8
- @workflow/world-vercel@4.0.1-beta.19
4.0.1-beta.25
Patch Changes
-
#575
161c54cThanks @VaguelySerious! - Add Web and CLI UI for listing and viewing streams -
#541
0bbd26fThanks @pranaygp! - perf: use Map for invocationsQueue (O(1) lookup/delete)Replace array-based invocationsQueue with Map for O(1) lookup and delete operations, eliminating O(n²) complexity in high-concurrency workflows.
-
#567
c35b445Thanks @Schniz! - otel: do not treat WorkflowSuspension errors as errors in the trace, as they symbolize effects and not actual exceptions. -
#571
d3fd81dThanks @TooTallNate! - Enhance serialization failure error reporting -
Updated dependencies [
d42a968,c82b467]:- @workflow/world-local@4.0.1-beta.16
- @workflow/world-vercel@4.0.1-beta.18
- @workflow/world@4.0.1-beta.10
- @workflow/errors@4.0.1-beta.7
4.0.1-beta.24
Patch Changes
- Updated dependencies [
48b3a12] - Updated dependencies [
57a2c32]- @workflow/world-local@4.0.1-beta.15
- @workflow/world@4.0.1-beta.9
- @workflow/errors@4.0.1-beta.7
- @workflow/world-vercel@4.0.1-beta.17
4.0.1-beta.23
Patch Changes
- Updated dependencies [
c8fa70a]- @workflow/world-vercel@4.0.1-beta.16
4.0.1-beta.22
Patch Changes
02c41cc: Set UI name of default-export-workflows to the filename, instead of "__default"
4.0.1-beta.21
Patch Changes
2f0840b: Better error when passing an invalid workflow value tostart()- Updated dependencies [
e9494d5]- @workflow/world-vercel@4.0.1-beta.15
4.0.1-beta.20
Patch Changes
0f1645b: Ignore rejections inwaitedUntilpromisebdde1bd: track queue overhead with opentelemetry8d4562e: Rename leftover references to "embedded world" to be "local world"- Updated dependencies [
bc9b628] - Updated dependencies [
34f3f86] - Updated dependencies [
cd451e0] - Updated dependencies [
6e8e828] - Updated dependencies [
10c5b91] - Updated dependencies [
bdde1bd] - Updated dependencies [
2faddf3] - Updated dependencies [
8d4562e]- @workflow/utils@4.0.1-beta.5
- @workflow/world-local@4.0.1-beta.14
- @workflow/world@4.0.1-beta.8
- @workflow/errors@4.0.1-beta.7
- @workflow/world-vercel@4.0.1-beta.14
4.0.1-beta.19
Patch Changes
07800c2: Support closure variables for serialized step functionsfb9fd0f: Add support for closure scope vars in step functions- Updated dependencies [
fb9fd0f] - Updated dependencies [
40057db]- @workflow/world@4.0.1-beta.7
- @workflow/world-local@4.0.1-beta.13
- @workflow/errors@4.0.1-beta.6
- @workflow/world-vercel@4.0.1-beta.13
4.0.1-beta.18
Patch Changes
- Updated dependencies [
6889dac]- @workflow/world-vercel@4.0.1-beta.12
4.0.1-beta.17
Patch Changes
- Updated dependencies [
2c438c3] - Updated dependencies [
edb69c3]- @workflow/world-vercel@4.0.1-beta.11
- @workflow/world-local@4.0.1-beta.12
- @workflow/utils@4.0.1-beta.4
- @workflow/errors@4.0.1-beta.6
4.0.1-beta.16
Patch Changes
3436629: Fix bugs in streamer (empty chunk handling and cloning chunks)9961140: Fix hydration of eventData for sleep calls73b6c68: Remove suppressUndefinedRejection from BaseBuilder- Updated dependencies [
3436629]- @workflow/world-local@4.0.1-beta.11
4.0.1-beta.15
Patch Changes
3d99d6d: Update@vercel/oidcand@vercel/queueto fix expired OIDC token edge case- Updated dependencies [
3d99d6d]- @workflow/world-vercel@4.0.1-beta.10
- @workflow/world-local@5.0.0-beta.10
4.0.1-beta.14
Patch Changes
6e41c90: Allow step retrying if it fails without proper cleanup
4.0.1-beta.13
Patch Changes
2fde24e: Use inline sourcemaps to prevent SWC read import error4b70739: Require specifying runId when writing to stream- Updated dependencies [
4b70739]- @workflow/world-vercel@4.0.1-beta.9
- @workflow/world-local@5.0.0-beta.9
- @workflow/world@4.0.1-beta.6
- @workflow/errors@4.0.1-beta.5
4.0.1-beta.12
Patch Changes
-
5eb588a: Remove step function identifier transform out of swc-plugin and intouseStep()runtime function -
00b0bb9: Implement the world's structured error interface -
85ce8e0: add waitUntil wrapping for toplevel commands for transaction-like behaviorwhen deployed on Vercel or other serverless providers, we must signal that we need to wait until operations are done before the function can halt the request.
This means that we can't rely on discrete operations (like Queue.queue or Storage calls), and instead wrap the entire
startfunction (which calls multiple discrete operations) in a singleawait waitUntilcall. -
b97b6bf: Lock all dependencies in our packages -
f8e5d10: Support serializing step function references -
6be03f3: Use "stepId" instead ofSymbol.for("STEP_FUNCTION_NAME_SYMBOL")for annotating step functions -
f07b2da: Transform step functions to singleuseStep()calls -
Updated dependencies [
aa015af] -
Updated dependencies [
00b0bb9] -
Updated dependencies [
b97b6bf] -
Updated dependencies [
00b0bb9] -
Updated dependencies [
00b0bb9] -
Updated dependencies [
00b0bb9] -
Updated dependencies [
79480f2]- @workflow/world-local@5.0.0-beta.8
- @workflow/world-vercel@4.0.1-beta.8
- @workflow/errors@4.0.1-beta.5
- @workflow/utils@4.0.1-beta.3
- @workflow/world@4.0.1-beta.5
4.0.1-beta.11
Patch Changes
8208b53: Fix sourcemap error tracing in workflowsaac1b6c: Make process.env in workflow context a readonly clone6373ab5: BREAKING:resumeHook()now throws errors (including when a Hook is not found for a given "token") instead of returningnull- Updated dependencies [
2b880f9] - Updated dependencies [
2dca0d4] - Updated dependencies [
68363b2]- @workflow/world-local@4.0.1-beta.7
- @workflow/world-vercel@4.0.1-beta.7
4.0.1-beta.10
Patch Changes
7013f29: BREAKING: ChangeRetryableError"retryAfter" option number value to represent milliseconds instead of seconds. Previously, numeric values were interpreted as seconds; now they are interpreted as milliseconds. This aligns with JavaScript conventions for durations (likesetTimeoutandsetInterval).a28bc37: Make@standard-schema/specbe a regular dependency809e0fe: Add support for specifying milliseconds insleep()adf0cfe: Add automatic port discovery5c0268b: Add Standard Schema support and runtime validation todefineHook()0b3e89e: Fix event data serialization for observability7a47eb8: Deprecate deploymentId in StartOptions with warning that it should not be set by users- Updated dependencies [
bf170ad] - Updated dependencies [
adf0cfe]- @workflow/utils@4.0.1-beta.2
- @workflow/world-local@4.0.1-beta.6
- @workflow/errors@4.0.1-beta.4
- @workflow/world-vercel@4.0.1-beta.6
4.0.1-beta.9
Patch Changes
9f56434: Add support for getWritable directly in step functions
4.0.1-beta.8
Patch Changes
4a821fc: Fix Windows path handling by normalizing backslashes to forward slashes in workflow IDs
4.0.1-beta.7
Patch Changes
05714f7: Add sveltekit workflow integration- Updated dependencies [
05714f7]- @workflow/world-local@4.0.1-beta.5
4.0.1-beta.6
Patch Changes
10309c3: Downgrade@types/nodeto v22.19.0f973954: Update license to Apache 2.0- Updated dependencies [
10309c3] - Updated dependencies [
f973954]- @workflow/world-local@4.0.1-beta.4
- @workflow/world-vercel@4.0.1-beta.5
- @workflow/errors@4.0.1-beta.3
- @workflow/world@4.0.1-beta.4
4.0.1-beta.5
Patch Changes
796fafd: RemoveisInstanceOf()function and utilizeis()method on Error subclasses instead70be894: Implementsleep()natively into the workflow runtime20d51f0: Respect theretryAfterproperty in the step function callback handler- Updated dependencies [
20d51f0] - Updated dependencies [
796fafd] - Updated dependencies [
20d51f0] - Updated dependencies [
20d51f0] - Updated dependencies [
70be894]- @workflow/world-vercel@4.0.1-beta.4
- @workflow/errors@4.0.1-beta.2
- @workflow/world-local@4.0.1-beta.3
- @workflow/world@4.0.1-beta.3
4.0.1-beta.4
Patch Changes
6504e42: Add support for bigint serialization- Updated dependencies [
e367046]- @workflow/world-vercel@4.0.1-beta.3
4.0.1-beta.3
Patch Changes
57419e5: Improve type-safety tostartwhen no args are provided- Updated dependencies [
d3a4ed3] - Updated dependencies [
d3a4ed3] - Updated dependencies [
66225bf] - Updated dependencies [
7868434]- @workflow/world@4.0.1-beta.2
- @workflow/world-local@4.0.1-beta.2
- @workflow/world-vercel@4.0.1-beta.2
4.0.1-beta.2
Patch Changes
- 854feb4: Handle multiple step_started events in event log
- f1c6bc5: Throw an error when the event log is corrupted
4.0.1-beta.1
Patch Changes
- 57ebfcb: Fix seedrandom not being listed in dependencies
- 1408293: Add "description" field to
package.jsonfile - e46294f: Add "license" and "repository" fields to
package.jsonfile - Updated dependencies [1408293]
- Updated dependencies [8422a32]
- Updated dependencies [e46294f]
- @workflow/world-vercel@4.0.1-beta.1
- @workflow/world-local@4.0.1-beta.1
- @workflow/errors@4.0.1-beta.1
- @workflow/world@4.0.1-beta.1
4.0.1-beta.0
Patch Changes
- fcf63d0: Initial publish
- Updated dependencies [fcf63d0]
- @workflow/world-vercel@4.0.1-beta.0
- @workflow/world-local@4.0.1-beta.0
- @workflow/errors@4.0.1-beta.0
- @workflow/world@4.0.1-beta.0