- #4458
35bc428Thanks @pranaygp! - Upgrade undici to 7.30.0, which stops a failed HTTP/2 stream from leaving a phantom in-flight request on its connection. - Updated dependencies [
35bc428]:- @workflow/world-local@5.0.0-beta.49
- #4348
f2daf40Thanks @pranaygp! - Added aresolveData: 'skip-step-inputs'option, which directs the World to leave outinputfromstep_createdandstep_startedevents. Replay recomputes step arguments by re-running workflow code, and steps take their input from thestep_startedresponse or from memory, never from the replay log, so replay now reads the event log with this option and no longer downloads recorded step inputs. For workflows that pass growing state into their steps, this removes the part of the replay transfer that grows quadratically. A World that doesn't implement the option must treat it as'all'. - Updated dependencies [
f2daf40,54b48ef,2694663,12fcca0]:- @workflow/world@5.0.0-beta.39
- @workflow/world-local@5.0.0-beta.48
- @workflow/errors@5.0.0-beta.24
- #4193
4f52438Thanks @pranaygp! - AddcreateHook({ experimental_force: true })option, which takes a hook token over from the run that currently holds it instead of rejecting withHookConflictError. Previous runs awaiting the hook are rejected withHookForceClaimedErrornaming the run that took the token. Seeexperimental_forcedocs for details.
- #3908
5093edeThanks @pranaygp! - Document that this is a reference implementation whose workflow HTTP routes are unauthenticated, and how to restrict them. - Updated dependencies [
4f52438]:- @workflow/world@5.0.0-beta.38
- @workflow/world-local@5.0.0-beta.47
- @workflow/errors@5.0.0-beta.23
- #4168
97dccc9Thanks @shalabhc! - Add an optionalinvokemethod and capability to the World interface. It routes a payload to the runner handling the specifiedrunIdand returns a promise for its response. In world-postgres, this uses a regular queue roundtrip with a run-scoped queue. The runtime usesinvokewhen available, initially to resume hooks.
- #4219
b27395fThanks @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. - Updated dependencies [
6c0d510,97dccc9]:- @workflow/world@5.0.0-beta.37
- @workflow/errors@5.0.0-beta.22
- @workflow/world-local@5.0.0-beta.46
- #3712
5f723b3Thanks @himself65! - FixreadFromStreamerroring when rows were written after the stream's first EOF marker. Rows past the first EOF are now ignored consistently acrossstreams.get(),getChunks(), andgetInfo().
-
#4114
cc9a4cfThanks @komly! - Queue deliveries no longer inheritfetch's 300s headers/body deadlines, which redelivered healthy long-running inline work while it was still executing. Deadlines can be set withWORKFLOW_POSTGRES_HEADERS_TIMEOUT_MSandWORKFLOW_POSTGRES_BODY_TIMEOUT_MS. -
#4117
2883509Thanks @komly! - Preserve error names, messages, stacks, and nested causes in Graphile Worker log metadata. -
#3707
79e7436Thanks @unusdon! - Allowruns.list({ status })to accept an array of statuses so callers can easily express set filters (e.g. non-terminal runs). world-vercel does not yet support the array form and throws a clearINVALID_ARGUMENTerror instead of a broken request. -
Updated dependencies [
79e7436]:- @workflow/world@5.0.0-beta.36
- @workflow/world-local@5.0.0-beta.45
- @workflow/errors@5.0.0-beta.21
-
#4111
2eb2fe6Thanks @komly! - Fix run creation and slot allocation not happening transactionally -
#4113
3dad0a9Thanks @komly! - Fix stream cursors not being advanced for skipped chunks, so repeated notifications cannot consume the requested start offset twice -
#4125
7e8e5ddThanks @VaguelySerious! - Fix stream readers leaking EventEmitter listeners on EOF, initial query failure, and World close, and fail pending readers when the World is closed. -
#3457
03455a2Thanks @TooTallNate! - Rejectstep_startedon terminal runs even when the step row still readsrunning: a redelivered start on a cancelled/completed run previously passed the claim and re-executed the step body whose outcome nothing would consume. In-flight steps can still write their terminal events (step_completed/step_failed) unchanged. -
#3902
7a46a81Thanks @NathanColosimo! - Upgrade runtime validation to Zod 4.5 and enable compilation on SDK-owned Zod schemas. -
Updated dependencies [
ec57aff,6cc851c,e00b1a5,03455a2,03455a2,7a46a81]:- @workflow/world@5.0.0-beta.35
- @workflow/world-local@5.0.0-beta.44
- @workflow/errors@5.0.0-beta.21
- #3787
61fb1f9Thanks @VaguelySerious! - Add anexperimental_retentionoption tostart():experimental_retention: 0asks the World to delete the run's user data as soon as the run completes or fails, while keeping the run itself listable. Implemented on the Vercel, Postgres and Local Worlds. Reading a run whose data has expired now throwsRunExpiredErrorinstead of resolving to a placeholder.
- Updated dependencies [
61fb1f9,9a5660f,4547e1a]:- @workflow/errors@5.0.0-beta.21
- @workflow/world@5.0.0-beta.34
- @workflow/world-local@5.0.0-beta.43
-
#3901
5c4eef0Thanks @NathanColosimo! - Upgrade repository tooling and CI from pnpm 10 to pnpm 11. -
Updated dependencies [
fbfb9fe,7cc5c88,4a18b01,fe2fd8c,5c4eef0]:- @workflow/world@5.0.0-beta.33
- @workflow/errors@5.0.0-beta.20
- @workflow/world-local@5.0.0-beta.42
- Updated dependencies [
855e479,2668e33,e9d5c56,ffc5807,3e0c18a]:- @workflow/world@5.0.0-beta.32
- @workflow/world-local@5.0.0-beta.41
- @workflow/utils@5.0.0-beta.10
- @workflow/errors@5.0.0-beta.19
- Updated dependencies [
d9e0777]:- @workflow/world@5.0.0-beta.31
- @workflow/errors@5.0.0-beta.18
- @workflow/world-local@5.0.0-beta.40
- Updated dependencies [
d62b444]:- @workflow/world@5.0.0-beta.30
- @workflow/errors@5.0.0-beta.18
- @workflow/world-local@5.0.0-beta.39
-
#3570
9454d51Thanks @pranaygp! - Addworld.runs.waitForTerminalStatus(runId, { timeoutMs, signal, resolveData })method, which long-polls until the run reaches a terminal status.await run.returnValuenow internally uses this, if the World supports it, instead of using a polling interval. -
#3634
7b79ba3Thanks @pranaygp! - New runs are created with the sealed-log event identity (specVersion 7). A sealed-log run's event positions are assigned by the backend before each write commits, so concurrent writers never contend for a position. A position whose writer dies is closed by the backend with anoopevent; replay steps over those without delivering them or advancing the deterministic clock. SetWORKFLOW_SEALED_LOG=0to put a deployment back on the previous scheme. Every runtime reads sealed logs either way, and a run's version is fixed at creation, so the setting only affects new runs.
-
#3575
71bc027Thanks @shin4141! - Commit step entities and theirstep_createdevents atomically. -
Updated dependencies [
f771585,f771585,9454d51,7b79ba3,f771585,bf9de1c,f771585]:- @workflow/utils@5.0.0-beta.9
- @workflow/world@5.0.0-beta.29
- @workflow/world-local@5.0.0-beta.38
- @workflow/errors@5.0.0-beta.18
-
#3645
771cdb2Thanks @VaguelySerious! - Reject a hook resume that races the hook's disposal, instead of journaling it afterhook_disposedand corrupting the owning run's event log. -
Updated dependencies [
b0adb50,37e1d9e,1321570,04e060a]:- @workflow/world@5.0.0-beta.28
- @workflow/world-local@5.0.0-beta.37
- @workflow/errors@5.0.0-beta.17
-
#3542
de2a86cThanks @VaguelySerious! - Breaking: New runs are created at spec version 6, and a World that declares an older spec version is now rejected before the first run rather than failing partway through one. -
#3519
dc85865Thanks @VaguelySerious! - Slot-numbered event ids are a requirement of the World contract, not a capability. TheslotEventIdsflag is gone, and the conformance suite now fails a World whose event ids are not positions. -
Updated dependencies [
600b096,dc85865,efbc408,a0ccfe0,de2a86c,dc85865,7683130,dc85865,b589460,c1a5c74,0f4b35f]:- @workflow/world@5.0.0-beta.27
- @workflow/world-local@5.0.0-beta.36
- @workflow/errors@5.0.0-beta.17
-
#3385
74dbf81Thanks @NathanColosimo! - Retry replay timeouts through normal queue redelivery instead of exiting the process, and keep Postgres jobs retryable through Core's terminal delivery limit. -
#3382
a8db185Thanks @VaguelySerious! - Fold new events returned byevents.createinto the replay log so a completed wait no longer needs a follow-upevents.listround trip -
#3389
6786db9Thanks @VaguelySerious! - Breaking: SpecVersion 6: Event IDs are now a dense per-run slot number, allocated by the world at publish time so a rejected write leaves no gap in the event log. A replay tells the world how many events it had read and gets back the ones it did not see, so an event that arrives from outside the replay and lands ahead of an event the replay wrote no longer fails the run withCORRUPTED_EVENT_LOG: it is held for whichever part of the workflow awaits it. A gap in the numbering fails the run instead of being replayed over. -
#3205
22349e9Thanks @NathanColosimo! - Load replay-event suffixes through one World request. -
#3124
65139acThanks @NathanColosimo! - Infer required run and step entities, including their start times, fromevents.createrequest types. -
Updated dependencies [
74dbf81,a8db185,439a495,6786db9,22349e9,65139ac]:- @workflow/world@5.0.0-beta.26
- @workflow/world-local@5.0.0-beta.35
- @workflow/errors@5.0.0-beta.16
- #3280
de1905fThanks @VaguelySerious! - Breaking:events.listByCorrelationIdandanalytics.events.listByCorrelationIdnow require arunId. A correlation id is unique within its run, not across runs, so an unscoped lookup answered with one event per run that numbered a step or wait the same.
- #3276
99f4aebThanks @NathanColosimo! - Keep Hook tokens reserved through their configured minimum retention.
-
#2866
e6f1b6fThanks @NathanColosimo! - Keep Hook tokens reserved through their configured minimum retention. -
Updated dependencies [
8d47928,1222aab,de1905f,79e4c04,9c1b3c8,e6f1b6f,72efc90]:- @workflow/world@5.0.0-beta.25
- @workflow/world-local@5.0.0-beta.34
- @workflow/errors@5.0.0-beta.16
-
#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. -
Updated dependencies [
4a9d26b,1471f25,31f92df,4017597,438eaa6,ee944d2,2677653,aa78a7e,f05f642]:- @workflow/world@5.0.0-beta.24
- @workflow/errors@5.0.0-beta.15
- @workflow/world-local@5.0.0-beta.33
- Updated dependencies [
a09d001]:- @workflow/utils@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.32
- @workflow/errors@5.0.0-beta.14
- #3061
62d570eThanks @NathanColosimo! - Remove legacy step queue topics and payloads now that queued steps use the workflow topic and combined flow handler.
- #3095
b4ba79eThanks @TooTallNate! - Add anencryption_public_keycolumn toworkflow_runs(migration0016) to store each run's X25519 public key.
-
#3064
cdb3db4Thanks @joeyhotz! - On shutdown, abort stalled workflow and step HTTP deliveries after Graphile Worker's grace period so their Postgres job rows are unlocked through normal failure handling instead of waiting for stale-lock recovery; aborted deliveries still consume an attempt and retry only when budget remains. Add opt-in application-managed shutdown throughapplicationManagedShutdownorWORKFLOW_POSTGRES_APPLICATION_MANAGED_SHUTDOWN=1so applications can awaitworld.close()before closing their HTTP server and caller-owned pool. -
#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. -
Updated dependencies [
8c12358,b4ba79e,a86035f,d24c91c,fc81f45,49276f2,49276f2,4ada27d,62d570e,62d570e,62d570e]:- @workflow/world@5.0.0-beta.23
- @workflow/world-local@5.0.0-beta.31
- @workflow/utils@5.0.0-beta.7
- @workflow/errors@5.0.0-beta.13
- #2915
7d29babThanks @joeyhotz! - Addruns.getMany()for retrieving ordered workflow run snapshots in one storage operation.
-
#2987
850777aThanks @VaguelySerious! - Rejecthook_receivedon terminal runs, including when the termination commits concurrently (cross-process) and for legacy (pre-event-sourcing) runs. -
#2983
3ddf42eThanks @joeyhotz! - ThrowEntityConflictErrorwhen arun_createdevent targets a run that already exists, instead of resolving with no run. This matchesworld-localandworld-vercel, and stopsstart()from throwingMissing 'run' in server response for 'run_created' eventwhen the resilient start path wins the race. -
Updated dependencies [
7d29bab,fe12b84,a5e6f11,850777a,eb8fdb9,bb773e9]:- @workflow/world@5.0.0-beta.22
- @workflow/world-local@5.0.0-beta.30
- @workflow/errors@5.0.0-beta.12
- Updated dependencies [
f72184d,a00d169,1933e29,6b8efd5]:- @workflow/world-local@5.0.0-beta.29
- @workflow/world@5.0.0-beta.21
- @workflow/errors@5.0.0-beta.11
- Updated dependencies [
f2be954,ac41e7d,c31e30c,9da2d76]:- @workflow/world@5.0.0-beta.20
- @workflow/errors@5.0.0-beta.10
- @workflow/world-local@5.0.0-beta.28
-
#2888
7a1ea5aThanks @ctgowrie! - Use the active queue namespace when re-enqueuing workflow runs during world startup recovery. -
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
-
#2876
84df8f3Thanks @karthikscale3! - Update@vercel/queuefrom 0.3.1 to 0.4.0 -
#2790
145835bThanks @NathanColosimo! - Centralize workflow event type classifiers and event-data payload field helpers. -
Updated dependencies [
f28150c,84df8f3,145835b,6603628]:- @workflow/world@5.0.0-beta.18
- @workflow/world-local@5.0.0-beta.26
- @workflow/errors@5.0.0-beta.10
- Updated dependencies [
79a9813,3f69666,712ed61]:- @workflow/world-local@5.0.0-beta.25
- @workflow/world@5.0.0-beta.17
- @workflow/errors@5.0.0-beta.10
-
#2732
239031aThanks @NathanColosimo! - Respect framework base paths when routing workflow traffic and expose health checks on generated Next.js workflow routes. -
#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]:- @workflow/world-local@5.0.0-beta.24
- @workflow/utils@5.0.0-beta.6
- @workflow/world@5.0.0-beta.16
- @workflow/errors@5.0.0-beta.10
- #2705
97b8469Thanks @NathanColosimo! - Move Workflow Postgres enum types into the workflow schema.
-
#2714
dd36e26Thanks @NathanColosimo! - Fix Postgres step lifecycle event ordering so a late concurrent step_started is no longer logged after step_completed. -
Updated dependencies [
f6772d9,fc5bdcb,f76377b,cc7f076,2ab7057]:- @workflow/utils@5.0.0-beta.5
- @workflow/world-local@5.0.0-beta.23
- @workflow/world@5.0.0-beta.15
- @workflow/errors@5.0.0-beta.9
-
#2644
361ce23Thanks @NathanColosimo! - Rename the Postgres setup command tobootstrap. -
#2657
5718df8Thanks @NathanColosimo! - Defer loopback worker startup -
Updated dependencies [
5977694,d4e6c5b,48e6bbf]:- @workflow/world-local@5.0.0-beta.22
- @workflow/world@5.0.0-beta.14
- @workflow/errors@5.0.0-beta.8
-
#2580
25c3df7Thanks @karthikscale3! - Send optional client-side event occurrence timestamps through world event creation. -
Updated dependencies [
25c3df7,d108ba3]:- @workflow/world@5.0.0-beta.13
- @workflow/errors@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.21
-
#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. -
Updated dependencies [
b563126,2074f91,e7ef9d8,ab2e9b8,1332da3]:- @workflow/world-local@5.0.0-beta.20
- @workflow/world@5.0.0-beta.12
- @workflow/errors@5.0.0-beta.8
- Updated dependencies [
5f0b845]:- @workflow/world@5.0.0-beta.11
- @workflow/errors@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.19
- Updated dependencies [
926a5e7]:- @workflow/utils@5.0.0-beta.4
- @workflow/errors@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.18
-
#2399
af859c3Thanks @VaguelySerious! - Update @vercel/queues from 0.3.0 to 0.3.1, which adds native retries for 429s and ECONNRESET -
Updated dependencies [
af859c3,628795a]:- @workflow/world-local@5.0.0-beta.17
- @workflow/world@5.0.0-beta.10
- @workflow/errors@5.0.0-beta.7
- #2226
ae8d6feThanks @pranaygp! - Allow passing initial run attributes throughstart(), and speed up workflow-levelsetAttributecalls by using native events for recording attributes.
-
#2295
f2a7bdeThanks @TooTallNate! - Fixworld-localandworld-postgresturning duplicate processing of the samehook_created(samerunId,hookId, and token) into a self-conflict; both worlds now treat same-entity duplicates as idempotent (matchingstep_created), and recover crash-orphaned token claims (world-local) and hook rows (world-postgres) by completing the partial write instead of incorrectly suppressing it. -
Updated dependencies [
b3279f8,f2a7bde,ae8d6fe]:- @workflow/world-local@5.0.0-beta.16
- @workflow/world@5.0.0-beta.9
- @workflow/errors@5.0.0-beta.7
- #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.
- Updated dependencies [
4670c4b]:- @workflow/world@5.0.0-beta.8
- @workflow/world-local@5.0.0-beta.15
- @workflow/errors@5.0.0-beta.7
-
#2301
bb6ff9aThanks @pranaygp! - Update vulnerable package dependencies to patched releases. -
#2255
81bda49Thanks @ctgowrie! - Update @vercel/queue from 0.2.1 to 0.3.0 -
Updated dependencies [
867e339,81bda49]:- @workflow/world-local@5.0.0-beta.14
-
#2246
ddc8a79Thanks @ctgowrie! - Update@vercel/queuefrom 0.1.7 to 0.2.1 -
Updated dependencies [
b8a337c,ddc8a79,2a3b11b]:- @workflow/world-local@5.0.0-beta.13
- @workflow/errors@5.0.0-beta.7
- @workflow/world@5.0.0-beta.7
- Updated dependencies [
8f68d35]:- @workflow/world@5.0.0-beta.6
- @workflow/errors@5.0.0-beta.6
- @workflow/world-local@5.0.0-beta.12
- Updated dependencies [
8d0928b,3128dfc]:- @workflow/errors@5.0.0-beta.6
- @workflow/world-local@5.0.0-beta.11
- Updated dependencies [
65336df]:- @workflow/world-local@5.0.0-beta.8
-
#2134
1e6b1fdThanks @VaguelySerious! - Addexperimental_setAttributes()workflow-level helper for attaching string key/value metadata to a workflow run, surfaced asrun.attributes -
#1799
503a929Thanks @TooTallNate! - Use inline sourcemaps for all workspace packages; published packages no longer ship external.js.mapfiles. -
Updated dependencies [
1e6b1fd,62ec537,503a929,657e8bb]:- @workflow/world@5.0.0-beta.5
- @workflow/world-local@5.0.0-beta.7
- @workflow/errors@5.0.0-beta.5
- @workflow/utils@5.0.0-beta.3
-
#2038
dc0be50Thanks @pranaygp! - Refresh workflow events after completing elapsed waits so concurrent hook events preserve deterministic replay order. -
#2019
738ec5eThanks @VaguelySerious! -workflow-postgres-setupnow also bootstraps thegraphile_workerschema, fixing potential race on setup when starting the app and a test runner at the same time -
Updated dependencies [
dc0be50,ad71b58,b124365,2a446af,1d3959e]:- @workflow/world@5.0.0-beta.4
- @workflow/world-local@5.0.0-beta.6
- @workflow/errors@5.0.0-beta.4
-
#2012
9d2a926Thanks @pranaygp! - Expose the active run ID on hook token conflict errors. -
Updated dependencies [
9d2a926,c145bf5]:- @workflow/errors@5.0.0-beta.3
- @workflow/world@5.0.0-beta.3
- @workflow/world-local@5.0.0-beta.5
- #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.
-
#1338
8ea1532Thanks @VaguelySerious! - Increase default concurrency to 50 -
#1878
7c45e9eThanks @TooTallNate! - Fix race inevents.create()where concurrentstep_created/hook_created/wait_createdwrites with the samecorrelationIdwould persist duplicate event rows. Adds a unique partial index and surfaces the violation asEntityConflictError. -
Updated dependencies [
540a2ef,92dc826,5374148,1203dae,1203dae,5f22832,2f52d14,8ea1532,c1163eb]:- @workflow/errors@5.0.0-beta.2
- @workflow/world-local@5.0.0-beta.4
- @workflow/world@5.0.0-beta.2
- @workflow/utils@5.0.0-beta.2
- Updated dependencies [
3ad8ee7]:- @workflow/world-local@5.0.0-beta.3
-
#1769
5a42964Thanks @tomdale! - Embed source content in published sourcemaps. -
Updated dependencies [
5a42964,11cfb8f,173756d]:- @workflow/errors@5.0.0-beta.1
- @workflow/utils@5.0.0-beta.1
- @workflow/world-local@5.0.0-beta.2
-
#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). -
#1293
66d49c0Thanks @VaguelySerious! - RequirerunIdargument forworld.steps.get.
-
#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 -
Updated dependencies [
66d49c0,a5c90ce,66d49c0]:- @workflow/world@5.0.0-beta.1
- @workflow/world-local@5.0.0-beta.1
- @workflow/errors@5.0.0-beta.0
- #1642
c5cdfc0Thanks @VaguelySerious! - Initial v5 beta release
- Updated dependencies [
c5cdfc0]:- @workflow/errors@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
-
#1533
7e70d18Thanks @VaguelySerious! - AddstreamFlushIntervalMsoption toStreamerinterface, optional for worlds to allow overwriting the default of 10ms in low-latency environments. -
#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. -
Updated dependencies [
5f138f2,7e70d18,c8dce52]:- @workflow/world@4.1.0-beta.17
- @workflow/world-local@4.1.0-beta.51
- @workflow/errors@4.1.0-beta.20
- Updated dependencies [
b30b0dc]:- @workflow/world@4.1.0-beta.16
- @workflow/world-local@4.1.0-beta.50
- @workflow/errors@4.1.0-beta.20
-
#1588
ef2218aThanks @VaguelySerious! - Fix zod v3/v4 schema mismatch crash (keyValidator._parse is not a function) by using consistentzod/v4imports in queue files that consume v4-native schemas from@workflow/world -
Updated dependencies [
ef2218a]:- @workflow/world-local@4.1.0-beta.49
-
#1569
a98f8deThanks @VaguelySerious! - Combine initial run fetch, event fetch, and run_started event creation -
#1534
329cdb3Thanks @VaguelySerious! - Re-enqueue active runs on world restart so inflight runs resume instead of getting stuck -
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
- Updated dependencies [
bd1f7e4]:- @workflow/world-local@4.1.0-beta.47
-
#1523
d1391e1Thanks @pranaygp! - Fix race condition allowing duplicatehook_disposedevents for the same hook -
#1527
e045b59Thanks @NathanColosimo! - Add maxPoolSize configuration -
Updated dependencies [
d1391e1]:- @workflow/world-local@4.1.0-beta.46
-
#1434
d428d66Thanks @pranaygp! - Fix race condition instep_startedthat could corrupt the event log. TheUPDATEforstep_startednow includes a conditional guard (status NOT IN ('completed', 'failed', 'cancelled')) to prevent a concurrent step execution from reverting a completed step back to running. Also adds terminal-state guards tostep_retrying,run_completed,run_failed, andrun_cancelled, and addscancelledto the existing guards onstep_completedandstep_failed. -
#1484
5502438Thanks @jlalmes! - Replacepostgres(postgres.js) withpg(node-postgres) for Drizzle and Graphile Worker. Add optionalpooloncreateWorldto share apg.Pool; when provided -
#1460
78f1b0eThanks @VaguelySerious! - Support negativestartIndexfor streaming (e.g.-3reads last 3 chunks) -
#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. -
Updated dependencies [
73a851a,84599b7,2ef33d2,d428d66,672d919,beccbc4,78f1b0e,aee035f,01bbe66]:- @workflow/errors@4.1.0-beta.19
- @workflow/world-local@4.1.0-beta.45
- @workflow/world@4.1.0-beta.14
-
#1417
02ea057Thanks @NathanColosimo! - Remove the unused world-local queue executor API and clean up postgres queue tests. -
#1417
02ea057Thanks @NathanColosimo! - Fix world-postgres queue execution to use workflow HTTP routes instead of in-process handlers. -
#1364
94c14c7Thanks @karthikscale3! - Strip only ref/payload fields from eventData when resolveData is 'none', preserving all other metadata -
Updated dependencies [
02ea057,2f0772d,0f07403,94c14c7]:- @workflow/world-local@4.1.0-beta.44
- @workflow/world@4.1.0-beta.13
- @workflow/errors@4.1.0-beta.18
- Updated dependencies [
9feebee]:- @workflow/world-local@4.1.0-beta.43
-
#1334
3648109Thanks @NathanColosimo! - Execute Graphile jobs inline and durably reschedule delayed queue work. -
Updated dependencies [
825417a,3648109]:- @workflow/world@4.1.0-beta.12
- @workflow/world-local@4.1.0-beta.42
- @workflow/errors@4.1.0-beta.18
- Updated dependencies [
4a6ddd8]:- @workflow/world-local@4.1.0-beta.41
-
#1287
d8daa2aThanks @VaguelySerious! - Addworld.events.get(runId, eventId)to the Storage interface for fetching a single event by ID. -
Updated dependencies [
d8daa2a]:- @workflow/world@4.1.0-beta.11
- @workflow/world-local@4.1.0-beta.40
- @workflow/errors@4.1.0-beta.18
- Updated dependencies [
8b5a388]:- @workflow/world-local@4.1.0-beta.39
-
#1273
11dcb64Thanks @VaguelySerious! - Locally validate run ID to be ULID when passed by user -
Updated dependencies [
456c1aa,11dcb64]:- @workflow/world-local@4.1.0-beta.38
- @workflow/world@4.1.0-beta.10
- @workflow/errors@4.1.0-beta.18
-
#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. -
#1275
02f706fThanks @TooTallNate! - Fixhooks.list()default sort order to ascending (creation order) in world-local and world-postgres, matching world-vercel behavior. Also fix world-postgreshooks.list()to respect thesortOrderpagination parameter instead of hardcoding descending order. -
Updated dependencies [
adfe8b6,adfe8b6,02f706f]:- @workflow/errors@4.1.0-beta.18
- @workflow/world-local@4.1.0-beta.37
- @workflow/world@4.1.0-beta.9
-
#1217
e55c636Thanks @pranaygp! - Upgrade dependencies across all packages -
Updated dependencies [
1cfb8b1,e55c636]:- @workflow/world-local@4.1.0-beta.36
- @workflow/world@4.1.0-beta.8
- @workflow/errors@4.1.0-beta.17
-
#1002
0735b2aThanks @rovo89! - Fix racing conditions in Postgres streamer -
#1171
79a730aThanks @rovo89! - Hide also "info" logs from Graphile Worker by default -
#1124
1f9a67cThanks @kschmelter13! - Replace queuepg-boss-based implementation withgraphile-worker -
Updated dependencies [
b06e491]:- @workflow/world@4.1.0-beta.7
- @workflow/errors@4.1.0-beta.16
- @workflow/world-local@4.1.0-beta.35
- Updated dependencies [
b65bb07]:- @workflow/world@4.1.0-beta.6
- @workflow/errors@4.1.0-beta.16
- @workflow/world-local@4.1.0-beta.34
-
#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
-
#1081
5487983Thanks @TooTallNate! - ImplementWorld.close()to stop PgBoss and close the postgres connection pool so the process can exit cleanly -
Updated dependencies [
c2b4fe9,6e72b29,5e06a7c,5487983,5487983]:- @workflow/errors@4.1.0-beta.16
- @workflow/world@4.1.0-beta.5
- @workflow/world-local@4.1.0-beta.33
- Updated dependencies [
63caf93]:- @workflow/world-local@4.1.0-beta.32
- Updated dependencies [
56f2221]:- @workflow/errors@4.1.0-beta.15
- @workflow/world@4.1.0-beta.4
- @workflow/world-local@4.1.0-beta.31
- Updated dependencies [
d9e9859]:- @workflow/world@4.1.0-beta.3
- @workflow/errors@4.1.0-beta.14
- @workflow/world-local@4.1.0-beta.30
-
#867
c54ba21Thanks @TooTallNate! - Add optionalwriteToStreamMultifunction to the World interface -
#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]:- @workflow/world@4.1.0-beta.2
- @workflow/world-local@4.1.0-beta.29
- @workflow/errors@4.1.0-beta.14
- #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
-
#621
4966b72Thanks @pranaygp! - Add backwards compatibility for runs created with different spec versions- Add
RunNotSupportedErrorfor runs requiring newer world versions - Add semver-based version comparison utilities
- Legacy runs (< 4.1): route to legacy handlers
run_cancelled: skip event storage, directly update runwait_completed: store event only (no entity mutation)- Unknown legacy events: throw error
- Add
-
#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.
-
#621
4966b72Thanks @pranaygp! - Remove deprecatedworkflow_completed,workflow_failed, andworkflow_startedevents in favor ofrun_completed,run_failed, andrun_startedevents. -
#621
4966b72Thanks @pranaygp! - AddspecVersionproperty to World interface- All worlds expose
@workflow/worldpackage version for protocol compatibility - Stored in
run_createdevent andWorkflowRunschema - Displayed in observability UI
- All worlds expose
-
#621
4966b72Thanks @pranaygp! - Implement event-sourced entity creation inevents.create()- Atomically create run/step/hook entities when processing corresponding events
- Return
hook_conflictevent when hook token already exists - Add
spec_versioncolumn to runs table
-
Updated dependencies [
4966b72,4966b72,4966b72,1060f9d,4966b72,4966b72,57f6376,60a9b76,4966b72]:- @workflow/world@4.1.0-beta.1
- @workflow/world-local@4.1.0-beta.28
- @workflow/errors@4.1.0-beta.14
-
#804
1533dbbThanks @lcneves! - Delete redundant and bugged Drizzle migration -
Updated dependencies [
202c524,5ba82ec,b05dbd7]:- @workflow/world-local@4.0.1-beta.27
- 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
- Updated dependencies [
dd3db13]:- @workflow/world@4.0.1-beta.12
- @workflow/world-local@4.0.1-beta.25
- @workflow/errors@4.0.1-beta.13
- Updated dependencies []:
- @workflow/errors@4.0.1-beta.13
- @workflow/world-local@4.0.1-beta.24
- Updated dependencies [
2dbe494]:- @workflow/world-local@4.0.1-beta.23
-
#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/world@4.0.1-beta.11
- @workflow/errors@4.0.1-beta.12
- Updated dependencies [
d9f6a49,c3464bf]:- @workflow/world-local@4.0.1-beta.21
- @workflow/errors@4.0.1-beta.11
- Updated dependencies [
f2d5997]:- @workflow/world-local@4.0.1-beta.20
-
#625
712f6f8Thanks @VaguelySerious! - List implicitly passed streams forworld.listStreamsByRun -
Updated dependencies [
ce7d428,712f6f8,4bdd3e5]:- @workflow/world-local@4.0.1-beta.19
- @workflow/errors@4.0.1-beta.10
- Updated dependencies [
b56aae3]:- @workflow/errors@4.0.1-beta.9
- @workflow/world-local@4.0.1-beta.18
- Updated dependencies [
c9b8d84]:- @workflow/world-local@4.0.1-beta.17
- @workflow/errors@4.0.1-beta.8
-
#574
c82b467Thanks @VaguelySerious! - Add listByRunId endpoint to Streamer interface -
Updated dependencies [
d42a968,c82b467]:- @workflow/world-local@4.0.1-beta.16
- @workflow/world@4.0.1-beta.10
- @workflow/errors@4.0.1-beta.7
- 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
- ef8e0e5: Increase polling interval for pg-boss to reduce interval between steps
- 8d4562e: Rename leftover references to "embedded world" to be "local world"
- Updated dependencies [6e8e828]
- Updated dependencies [10c5b91]
- Updated dependencies [bdde1bd]
- Updated dependencies [2faddf3]
- Updated dependencies [8d4562e]
- @workflow/world-local@4.0.1-beta.14
- @workflow/world@4.0.1-beta.8
- @workflow/errors@4.0.1-beta.7
- 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
- Updated dependencies [edb69c3]
- @workflow/world-local@4.0.1-beta.12
- @workflow/errors@4.0.1-beta.6
- Updated dependencies [3436629]
- @workflow/world-local@4.0.1-beta.11
- 3d99d6d: Update
@vercel/oidcand@vercel/queueto fix expired OIDC token edge case - Updated dependencies [3d99d6d]
- @workflow/world-local@5.0.0-beta.10
- 4b70739: Require specifying runId when writing to stream
- Updated dependencies [4b70739]
- @workflow/world-local@5.0.0-beta.9
- @workflow/world@4.0.1-beta.6
- @workflow/errors@4.0.1-beta.5
- 5790cb2: Use drizzle migrator
- b97b6bf: Lock all dependencies in our packages
- 00b0bb9: Support structured errors for steps and runs
- a6f5545: Update migration and parse data through schemas
- 79480f2: Clean up Hook entities after a workflow run has completed
- Updated dependencies [aa015af]
- Updated dependencies [00b0bb9]
- Updated dependencies [b97b6bf]
- Updated dependencies [00b0bb9]
- Updated dependencies [00b0bb9]
- Updated dependencies [79480f2]
- @workflow/world-local@5.0.0-beta.8
- @workflow/errors@4.0.1-beta.5
- @workflow/world@4.0.1-beta.5
- Updated dependencies [2b880f9]
- Updated dependencies [68363b2]
- @workflow/world-local@4.0.1-beta.7
- Updated dependencies [adf0cfe]
- @workflow/world-local@4.0.1-beta.6
- @workflow/errors@4.0.1-beta.4
- 8a82ec5: Bug fixes and test coverage for Storage.ts in Postgres World
- Updated dependencies [05714f7]
- @workflow/world-local@4.0.1-beta.5
- f973954: Update license to Apache 2.0
- Updated dependencies [10309c3]
- Updated dependencies [f973954]
- @workflow/world-local@4.0.1-beta.4
- @workflow/errors@4.0.1-beta.3
- @workflow/world@4.0.1-beta.4
- 3dd25de: Exported the database schema and added a script for initializing the database with all the required tables for the setup.
- 20d51f0: Add optional
retryAfterproperty toStepinterface - Updated dependencies [796fafd]
- Updated dependencies [20d51f0]
- Updated dependencies [20d51f0]
- Updated dependencies [70be894]
- @workflow/errors@4.0.1-beta.2
- @workflow/world-local@4.0.1-beta.3
- @workflow/world@4.0.1-beta.3
- ae0972f: Fix build script to include the built files
- 7868434: Remove
AuthProviderinterface fromWorldand associated implementations - 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
- e46294f: Add "license" and "repository" fields to
package.jsonfile - Updated dependencies [1408293]
- Updated dependencies [8422a32]
- Updated dependencies [e46294f]
- @workflow/world-local@4.0.1-beta.1
- @workflow/errors@4.0.1-beta.1
- @workflow/world@4.0.1-beta.1
- fcf63d0: Initial publish
- Updated dependencies [fcf63d0]
- @workflow/world-local@4.0.1-beta.0
- @workflow/errors@4.0.1-beta.0
- @workflow/world@4.0.1-beta.0