Files
github-actions[bot] e6af70b9d9 Version Packages (beta) (#3318)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-06 09:02:00 -07:00

71 KiB

@workflow/world-local

5.0.0-beta.34

Major Changes

  • #3280 de1905f Thanks @VaguelySerious! - Breaking: events.listByCorrelationId and analytics.events.listByCorrelationId now require a runId. 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.

Minor Changes

Patch Changes

5.0.0-beta.33

Minor Changes

  • #3230 31f92df Thanks @karthikscale3! - Lazy hook resumption: on a fast path, resumeHook() writes the hook_received event 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 when WORKFLOW_DISABLE_LAZY_HOOK_RESUME=1. resumeHook() resolves to a ResumedHook (a Hook plus an optional resilientResume: true flag, 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.

Patch Changes

  • #3255 2677653 Thanks @AndrewBarba! - Bound stalled local queue deliveries and redeliver their durable messages instead of waiting indefinitely.

  • #3297 aa78a7e Thanks @TooTallNate! - Converge a redelivered hook_received re-ensure on its already-committed (runId, resumeId) claim instead of rejecting with HookNotFoundError when the hook was disposed after the resume was recorded. The rejection made the queue consumer ack the redelivery as "nothing left to resume", silently dropping any continuation the message carried.

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

  • Updated dependencies [4a9d26b, 1471f25, 31f92df, 4017597, 438eaa6, ee944d2]:

    • @workflow/world@5.0.0-beta.24
    • @workflow/errors@5.0.0-beta.15

5.0.0-beta.32

Patch Changes

  • #3142 a09d001 Thanks @VaguelySerious! - Revert the static workflow world target injection: the world package is again resolved at runtime from WORKFLOW_TARGET_WORLD instead of being aliased into host bundles at build time.

  • Updated dependencies [a09d001]:

    • @workflow/utils@5.0.0-beta.8
    • @workflow/errors@5.0.0-beta.14

5.0.0-beta.31

Major Changes

  • #3112 4ada27d Thanks @NathanColosimo! - Remove deprecated world-specific factory aliases in favor of createWorld.

  • #3061 62d570e Thanks @NathanColosimo! - Remove legacy step queue topics and payloads now that queued steps use the workflow topic and combined flow handler.

Minor Changes

  • #3095 b4ba79e Thanks @TooTallNate! - Persist and transport the new optional encryptionPublicKey field on workflow runs, carried on run_created (and run_started for resilient start).

Patch Changes

5.0.0-beta.30

Minor Changes

  • #2915 7d29bab Thanks @joeyhotz! - Add runs.getMany() for retrieving ordered workflow run snapshots in one storage operation.

Patch Changes

  • #2987 850777a Thanks @VaguelySerious! - Reject hook_received on terminal runs, including when the termination commits concurrently (cross-process) and for legacy (pre-event-sourcing) runs.

  • Updated dependencies [7d29bab, fe12b84, a5e6f11, eb8fdb9, bb773e9]:

    • @workflow/world@5.0.0-beta.22
    • @workflow/errors@5.0.0-beta.12

5.0.0-beta.29

Minor Changes

  • #2914 f72184d Thanks @karthikscale3! - Add WORKFLOW_LOCAL_RECOVER_ACTIVE_RUNS env var as a fallback for the recoverActiveRuns option, so re-enqueueing of pending/running runs on startup can be disabled without a custom world module.

Patch Changes

  • Updated dependencies [a00d169, 1933e29, 6b8efd5]:
    • @workflow/world@5.0.0-beta.21
    • @workflow/errors@5.0.0-beta.11

5.0.0-beta.28

Patch Changes

5.0.0-beta.27

Patch Changes

  • #2888 7a1ea5a Thanks @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/errors@5.0.0-beta.10

5.0.0-beta.26

Patch Changes

5.0.0-beta.25

Patch Changes

  • #2830 79a9813 Thanks @AndrewBarba! - Fix hook operations scaling with total event history: hook creation, hook cache rebuilds, and token lookups now use durable per-token/per-hookId indexes instead of scanning the entire global event log, and run-termination hook cleanup uses per-run markers instead of reading every live hook. Directory listings read files concurrently, runs.list defaults to a page size of 200, and compiled filename regexes are reused.

  • Updated dependencies [3f69666, 712ed61]:

    • @workflow/world@5.0.0-beta.17
    • @workflow/errors@5.0.0-beta.10

5.0.0-beta.24

Patch Changes

  • #2808 c1d29f1 Thanks @VaguelySerious! - Fix a stalled hook token claim release deleting the next claimant's live claim

  • #2808 c1d29f1 Thanks @VaguelySerious! - Fix a resumeHook racing hook.dispose() being recorded after the disposal, which corrupted the receiving run's replay

  • #2779 7637196 Thanks @VaguelySerious! - Fix hook token claims of disposed hooks and finished runs not being released to the next claimant

  • #2807 e7e5a0e Thanks @VaguelySerious! - Shard stream chunks into a directory per stream so a tail reader's poll no longer lists every chunk in the world on each tick, and reliably release its emitter listeners and poll timer when the reader is cancelled. Note: stream chunks are now stored at streams/chunks/<streamName>/; chunk files written to the old flat layout by an earlier version are not read back (an acceptable tradeoff for local dev data, and stale flat files are left in place rather than cleaned up).

  • #2732 239031a Thanks @NathanColosimo! - Respect framework base paths when routing workflow traffic and expose health checks on generated Next.js workflow routes.

  • #2752 0f557d5 Thanks @ijjk! - Statically inject the configured world package into host bundles instead of selecting worlds dynamically at runtime.

  • #2468 49a50e8 Thanks @NathanColosimo! - Standardize first-party World packages on createWorld(), support relative target World modules consistently, and align the Postgres World DATABASE_URL fallback with bootstrap.

  • Updated dependencies [239031a, 0f557d5, fe327e6]:

    • @workflow/utils@5.0.0-beta.6
    • @workflow/world@5.0.0-beta.16
    • @workflow/errors@5.0.0-beta.10

5.0.0-beta.23

Patch Changes

  • #2152 fc5bdcb Thanks @pranaygp! - Reduce local sequential-step replay I/O with bounded recent-event and storage-directory caches.

  • #2747 2ab7057 Thanks @NathanColosimo! - Keep local hooks reachable after a crash or restart by rebuilding lost hook cache files from committed hook creation events, preventing active hook tokens from being reused.

  • Updated dependencies [f6772d9, f76377b, cc7f076, 2ab7057]:

    • @workflow/utils@5.0.0-beta.5
    • @workflow/world@5.0.0-beta.15
    • @workflow/errors@5.0.0-beta.9

5.0.0-beta.22

Patch Changes

  • #2679 5977694 Thanks @VaguelySerious! - Retry local queue deliveries that fail at the transport (e.g. fetch failed / ETIMEDOUT when the dev server is saturated by many parallel steps) instead of dropping the message, so steps no longer get stuck never-started under high local concurrency.

  • #2667 d4e6c5b Thanks @VaguelySerious! - Scope untagged startup recovery to untagged runs so a dev server no longer re-enqueues tagged runs (e.g. left behind by the vitest harness in a shared data directory), which previously failed run_started with "did not return the run entity".

  • Updated dependencies [48e6bbf]:

    • @workflow/world@5.0.0-beta.14
    • @workflow/errors@5.0.0-beta.8

5.0.0-beta.21

Patch Changes

  • Updated dependencies [25c3df7, d108ba3]:
    • @workflow/world@5.0.0-beta.13
    • @workflow/errors@5.0.0-beta.8

5.0.0-beta.20

Patch Changes

  • #2534 b563126 Thanks @NathanColosimo! - Update undici to 7.28.0.

  • #2475 2074f91 Thanks @pranaygp! - Skip the per-step incremental events.list round-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.sinceCursor contract so a step-terminal events.create can return the event-log delta since that cursor (via EventResult.events/cursor/hasMore).

    Return the inline delta from a step-terminal write when sinceCursor is supplied, computed identically to events.list so the consumed prefix cannot skew from the server log.

    Forward sinceCursor over the v4 wire in @workflow/world-vercel so the server can return the delta on a step-terminal response; older servers ignore it and the runtime falls back to events.list.

  • #2478 e7ef9d8 Thanks @pranaygp! - Lazy inline step start: the owned-inline runtime path now sends a single step_started carrying the step input, letting the world create the step on the fly and saving one round-trip per inline step.

    @workflow/world: step_started event data accepts an optional input, and EventResult gains a stepCreated ownership signal.

    @workflow/world-local: step_started with input atomically creates the step plus a synthetic step_created event; a lazy step_started for an already-existing step throws EntityConflictError so 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 on step_started over the v4 wire and threads the server's stepCreated signal into EventResult.

  • #2508 1332da3 Thanks @karthikscale3! - Add run IDs on world storage telemetry spans.

  • Updated dependencies [2074f91, e7ef9d8, ab2e9b8]:

    • @workflow/world@5.0.0-beta.12
    • @workflow/errors@5.0.0-beta.8

5.0.0-beta.19

Patch Changes

  • Updated dependencies [5f0b845]:
    • @workflow/world@5.0.0-beta.11
    • @workflow/errors@5.0.0-beta.8

5.0.0-beta.18

Patch Changes

  • Updated dependencies [926a5e7]:
    • @workflow/utils@5.0.0-beta.4
    • @workflow/errors@5.0.0-beta.8

5.0.0-beta.17

Patch Changes

  • #2399 af859c3 Thanks @VaguelySerious! - Update @vercel/queues from 0.3.0 to 0.3.1, which adds native retries for 429s and ECONNRESET

  • Updated dependencies [628795a]:

    • @workflow/world@5.0.0-beta.10
    • @workflow/errors@5.0.0-beta.7

5.0.0-beta.16

Minor Changes

  • #2226 ae8d6fe Thanks @pranaygp! - Allow passing initial run attributes through start(), and speed up workflow-level setAttribute calls by using native events for recording attributes.

Patch Changes

  • #1925 b3279f8 Thanks @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 one Promise.all and 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 with delaySeconds, 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-day sleep()s work on every world. This restores inline step execution for Promise.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 honors delaySeconds (matches world-vercel / world-postgres), and its close() aborts pending delayed deliveries and retry sleeps so dev-server/test shutdown isn't held open by wait timers.

  • #2295 f2a7bde Thanks @TooTallNate! - Fix world-local and world-postgres turning duplicate processing of the same hook_created (same runId, hookId, and token) into a self-conflict; both worlds now treat same-entity duplicates as idempotent (matching step_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 [ae8d6fe]:

    • @workflow/world@5.0.0-beta.9
    • @workflow/errors@5.0.0-beta.7

5.0.0-beta.15

Minor Changes

  • #2305 4670c4b Thanks @willsather! - Add an optional namespace parameter that scopes queue topic prefixes to __{namespace}_wkf_workflow_*. This allows configuring multiple frameworks in the same deployment without queue topic collision.

Patch Changes

  • Updated dependencies [4670c4b]:
    • @workflow/world@5.0.0-beta.8
    • @workflow/errors@5.0.0-beta.7

5.0.0-beta.14

Patch Changes

5.0.0-beta.13

Patch Changes

5.0.0-beta.12

Patch Changes

  • Updated dependencies [8f68d35]:
    • @workflow/world@5.0.0-beta.6
    • @workflow/errors@5.0.0-beta.6

5.0.0-beta.11

Patch Changes

  • #2168 3128dfc Thanks @allenzhou101! - Skip past abandoned 5.0.0-beta.8/9/10 npm slots from the November 2025 5.x attempt so the next Changesets publish lands on a fresh 5.0.0-beta.11.

  • Updated dependencies [8d0928b]:

    • @workflow/errors@5.0.0-beta.6

5.0.0-beta.8

Patch Changes

  • #2139 65336df Thanks @pranaygp! - Reduce local stream metadata and pagination I/O by reading only EOF marker bytes and scanning chunk files once.

5.0.0-beta.7

Patch Changes

  • #2134 1e6b1fd Thanks @VaguelySerious! - Add experimental_setAttributes() workflow-level helper for attaching string key/value metadata to a workflow run, surfaced as run.attributes

  • #1799 503a929 Thanks @TooTallNate! - Use inline sourcemaps for all workspace packages; published packages no longer ship external .js.map files.

  • #2097 657e8bb Thanks @TooTallNate! - Reject dots and empty correlationId values in entity ID validation.

  • Updated dependencies [1e6b1fd, 62ec537, 503a929]:

    • @workflow/world@5.0.0-beta.5
    • @workflow/errors@5.0.0-beta.5
    • @workflow/utils@5.0.0-beta.3

5.0.0-beta.6

Patch Changes

  • #2038 dc0be50 Thanks @pranaygp! - Refresh workflow events after completing elapsed waits so concurrent hook events preserve deterministic replay order.

  • Updated dependencies [dc0be50, ad71b58, b124365, 2a446af, 1d3959e]:

    • @workflow/world@5.0.0-beta.4
    • @workflow/errors@5.0.0-beta.4

5.0.0-beta.5

Patch Changes

  • #2012 9d2a926 Thanks @pranaygp! - Expose the active run ID on hook token conflict errors.

  • #1985 c145bf5 Thanks @pranaygp! - Improve the local queue error message when a Next.js proxy intercepts workflow routes.

  • Updated dependencies [9d2a926]:

    • @workflow/errors@5.0.0-beta.3
    • @workflow/world@5.0.0-beta.3

5.0.0-beta.4

Major Changes

  • #1851 5f22832 Thanks @TooTallNate! - BREAKING CHANGE: Run and step errors are now serialized through the workflow serialization pipeline, preserving original class identity and cause chains on WorkflowRunFailedError.cause. Pre-upgrade failed runs in the world-postgres legacy error text column surface as error: undefined on read; the original payload is still readable directly from the errorJson column for manual inspection.

Patch Changes

  • #1877 92dc826 Thanks @TooTallNate! - Fix race in events.create() where concurrent step_created / wait_created writes with the same correlationId would both succeed instead of one losing with EntityConflictError.

  • #1895 2f52d14 Thanks @VaguelySerious! - Fix local-world recovery isolation in Vitest and support custom test directories

  • #1894 c1163eb Thanks @VaguelySerious! - Throw WorkflowRunNotFoundError when run_failed is recorded against a run that doesn't exist, matching the behaviour of world-postgres and world-vercel.

  • Updated dependencies [540a2ef, 5374148, 1203dae, 1203dae, 5f22832, 8ea1532]:

    • @workflow/errors@5.0.0-beta.2
    • @workflow/world@5.0.0-beta.2
    • @workflow/utils@5.0.0-beta.2

5.0.0-beta.3

Patch Changes

5.0.0-beta.2

Patch Changes

5.0.0-beta.1

Major Changes

  • #1293 66d49c0 Thanks @VaguelySerious! - BREAKING CHANGE: Restructure stream methods on World interface to use world.streams.* namespace with runId as 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 66d49c0 Thanks @VaguelySerious! - Require runId argument for world.steps.get.

Patch Changes

  • #1658 a5c90ce Thanks @VaguelySerious! - Fix community world E2E tests by adding specVersion to the World interface so start() 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/errors@5.0.0-beta.0

5.0.0-beta.0

Major Changes

Patch Changes

  • Updated dependencies [c5cdfc0]:
    • @workflow/errors@5.0.0-beta.0
    • @workflow/utils@5.0.0-beta.0
    • @workflow/world@5.0.0-beta.0

4.1.0-beta.51

Patch Changes

  • #1533 7e70d18 Thanks @VaguelySerious! - Add streamFlushIntervalMs option to Streamer interface, optional for worlds to allow overwriting the default of 10ms in low-latency environments.

  • #1537 c8dce52 Thanks @VaguelySerious! - Allow workflow invocation to create run if initial storage call in start did 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/errors@4.1.0-beta.20

4.1.0-beta.50

Patch Changes

  • #1605 b30b0dc Thanks @VaguelySerious! - Use asymmetric ULID timestamp validation thresholds: 24h past, 5min future.

  • Updated dependencies [b30b0dc]:

    • @workflow/world@4.1.0-beta.16
    • @workflow/errors@4.1.0-beta.20

4.1.0-beta.49

Patch Changes

  • #1588 ef2218a Thanks @VaguelySerious! - Fix zod v3/v4 schema mismatch crash (keyValidator._parse is not a function) by using consistent zod/v4 imports in queue files that consume v4-native schemas from @workflow/world

4.1.0-beta.48

Patch Changes

4.1.0-beta.47

Patch Changes

4.1.0-beta.46

Patch Changes

  • #1523 d1391e1 Thanks @pranaygp! - Fix race condition allowing duplicate hook_disposed events for the same hook

4.1.0-beta.45

Patch Changes

  • #1340 84599b7 Thanks @pranaygp! - Add error code classification (USER_ERROR, RUNTIME_ERROR) to run_failed events, improve queue and schema validation error logging

  • #1434 d428d66 Thanks @pranaygp! - Add atomic terminal-state guards to step and wait transitions using writeExclusive lock files. Prevents concurrent step_completed/step_failed/wait_completed races and blocks step_started on already-terminal steps. Also adds cancelled to isStepTerminal.

  • #1344 beccbc4 Thanks @pranaygp! - Remove VQS maxDeliveries cap and enforce max delivery limit in workflow/step handlers with graceful failure

  • #1460 78f1b0e Thanks @VaguelySerious! - Support negative startIndex for streaming (e.g. -3 reads last 3 chunks)

  • #1342 aee035f Thanks @pranaygp! - Replace HTTP status code checks with semantic error types (EntityConflictError, RunExpiredError, ThrottleError, TooEarlyError). BREAKING CHANGE: WorkflowAPIError renamed to WorkflowWorldError.

  • #1470 01bbe66 Thanks @VaguelySerious! - Add getStreamChunks() and getStreamInfo() to the Streamer interface, and getTailIndex() to the readable stream returned by run.getReadable(). WorkflowChatTransport now reads the x-workflow-stream-tail-index response header to resolve negative initialStartIndex values into absolute positions, fixing reconnection retries after a disconnect.

  • Updated dependencies [73a851a, 84599b7, 2ef33d2, 672d919, beccbc4, 78f1b0e, aee035f, 01bbe66]:

    • @workflow/errors@4.1.0-beta.19
    • @workflow/world@4.1.0-beta.14

4.1.0-beta.44

Patch Changes

  • #1417 02ea057 Thanks @NathanColosimo! - Remove the unused world-local queue executor API and clean up postgres queue tests.

  • #1359 0f07403 Thanks @VaguelySerious! - Write workflow data for vitest to the same folder as other local world runs, allowing them to be visible in observability tooling. Use a suffix-based system to ensure clearing runs on test start only affects vitest-related data.

  • #1364 94c14c7 Thanks @karthikscale3! - Strip only ref/payload fields from eventData when resolveData is 'none', preserving all other metadata

  • Updated dependencies [2f0772d, 94c14c7]:

    • @workflow/world@4.1.0-beta.13
    • @workflow/errors@4.1.0-beta.18

4.1.0-beta.43

Patch Changes

4.1.0-beta.42

Patch Changes

  • #1334 3648109 Thanks @NathanColosimo! - Refactor queue handler to separate queue behavior from route call behavior and export QueueExecutor.

  • Updated dependencies [825417a]:

    • @workflow/world@4.1.0-beta.12
    • @workflow/errors@4.1.0-beta.18

4.1.0-beta.41

Patch Changes

  • #1307 4a6ddd8 Thanks @TooTallNate! - Return HTTP 200 instead of 503 for queue timeout re-enqueue signals in local world

4.1.0-beta.40

Patch Changes

  • #1287 d8daa2a Thanks @VaguelySerious! - Add world.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/errors@4.1.0-beta.18

4.1.0-beta.39

Patch Changes

  • #1290 8b5a388 Thanks @pranaygp! - Support timeoutSeconds: 0 for immediate re-enqueue without arbitrary delay

4.1.0-beta.38

Patch Changes

  • #1237 456c1aa Thanks @VaguelySerious! - Add registerHandler function to allow getting direct callbacks for plugins using local world

  • #1273 11dcb64 Thanks @VaguelySerious! - Locally validate run ID to be ULID when passed by user

  • Updated dependencies [11dcb64]:

    • @workflow/world@4.1.0-beta.10
    • @workflow/errors@4.1.0-beta.18

4.1.0-beta.37

Patch Changes

  • #1270 adfe8b6 Thanks @pranaygp! - Add HookNotFoundError to @workflow/errors and adopt it across all world backends

  • #1270 adfe8b6 Thanks @pranaygp! - Prevent hooks from being resumed via the public webhook endpoint by default. Add isWebhook option to createHook() to opt-in to public resumption. createWebhook() always sets isWebhook: true.

  • #1275 02f706f Thanks @TooTallNate! - Fix hooks.list() default sort order to ascending (creation order) in world-local and world-postgres, matching world-vercel behavior. Also fix world-postgres hooks.list() to respect the sortOrder pagination parameter instead of hardcoding descending order.

  • Updated dependencies [adfe8b6, adfe8b6]:

    • @workflow/errors@4.1.0-beta.18
    • @workflow/world@4.1.0-beta.9

4.1.0-beta.36

Patch Changes

  • #1211 1cfb8b1 Thanks @VaguelySerious! - Use undici v7 Agent for HTTP/2 multiplexing and automatic retry

  • #1217 e55c636 Thanks @pranaygp! - Upgrade dependencies across all packages

  • Updated dependencies [e55c636]:

    • @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.35

Patch Changes

  • Updated dependencies [b06e491]:
    • @workflow/world@4.1.0-beta.7
    • @workflow/errors@4.1.0-beta.16

4.1.0-beta.34

Patch Changes

  • Updated dependencies [b65bb07]:
    • @workflow/world@4.1.0-beta.6
    • @workflow/errors@4.1.0-beta.16

4.1.0-beta.33

Patch Changes

  • #1057 5e06a7c Thanks @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: Add Wait type, WaitSchema, and WaitStatusSchema exports; add optional wait field to EventResult
    • @workflow/world-local: Materialize wait entities on wait_created/wait_completed with duplicate detection; clean up waits on terminal run states
    • @workflow/world-postgres: Add workflow_waits table with wait_status enum; materialize wait entities with conditional writes for duplicate prevention; clean up waits on terminal run states
  • #1081 5487983 Thanks @TooTallNate! - Implement World.close() to close the undici HTTP agent; refactor agent from module-level singleton to instance-scoped

  • Updated dependencies [c2b4fe9, 6e72b29, 5e06a7c, 5487983]:

    • @workflow/errors@4.1.0-beta.16
    • @workflow/world@4.1.0-beta.5

4.1.0-beta.32

Patch Changes

  • #1020 63caf93 Thanks @TooTallNate! - Stream chunk files now use .bin extension instead of .json. Backwards compatible with existing .json chunk files.

4.1.0-beta.31

Patch Changes

  • 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

4.1.0-beta.30

Patch Changes

  • Updated dependencies [d9e9859]:
    • @workflow/world@4.1.0-beta.3
    • @workflow/errors@4.1.0-beta.14

4.1.0-beta.29

Patch Changes

  • #922 0ce46b9 Thanks @pranaygp! - Add support for custom headers in queue messages

  • #867 c54ba21 Thanks @TooTallNate! - Add optional writeToStreamMulti function to the World interface

  • #932 088de0a Thanks @pranaygp! - Improve OpenTelemetry tracing instrumentation

    • Add W3C trace context headers to step queue messages for cross-service trace linking
    • Add peer.service and RPC semantic conventions for external service attribution
    • Add step.hydrate and step.dehydrate spans for argument serialization visibility
    • Add workflow.replay span for workflow event replay tracking
    • Rename queueMessage span to queue.publish following 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
  • #932 088de0a Thanks @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 retryAfter validation 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_started event before hydration to ensure correct attempt count
  • Updated dependencies [0ce46b9, c54ba21]:

    • @workflow/world@4.1.0-beta.2
    • @workflow/errors@4.1.0-beta.14

4.1.0-beta.28

Minor Changes

  • #621 4966b72 Thanks @pranaygp! - BREAKING: Storage interface is now read-only; all mutations go through events.create()
    • Remove cancel, pause, resume from runs
    • Remove create, update from runs, steps, hooks
    • Add run lifecycle events: run_created, run_started, run_completed, run_failed, run_cancelled
    • Add step_created event type
    • Remove fatal field from step_failed (terminal failure is now implicit)
    • Add step_retrying event with error info for retriable failures

Patch Changes

  • #621 4966b72 Thanks @pranaygp! - Add backwards compatibility for runs created with different spec versions

    • Add RunNotSupportedError for 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 run
    • wait_completed: store event only (no entity mutation)
    • Unknown legacy events: throw error
  • #853 1060f9d Thanks @TooTallNate! - BREAKING CHANGE: Change user input/output to be binary data (Uint8Array) at the World interface

    This 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 4966b72 Thanks @pranaygp! - Remove deprecated workflow_completed, workflow_failed, and workflow_started events in favor of run_completed, run_failed, and run_started events.

  • #621 4966b72 Thanks @pranaygp! - Add specVersion property to World interface

    • All worlds expose @workflow/world package version for protocol compatibility
    • Stored in run_created event and WorkflowRun schema
    • Displayed in observability UI
  • #718 57f6376 Thanks @VaguelySerious! - Fix package info stored in data dir showing the wrong version

  • #903 60a9b76 Thanks @VaguelySerious! - Increase local world concurrency limits for HTTP and queue semaphore from 100 to 1000

  • #621 4966b72 Thanks @pranaygp! - Implement event-sourced entity creation in events.create()

    • Atomically create run/step/hook entities when processing corresponding events
    • Return hook_conflict event when hook token already exists
    • Remove direct entity mutation methods from storage
  • Updated dependencies [4966b72, 4966b72, 4966b72, b16a682, 1060f9d, 4966b72, 4966b72]:

    • @workflow/world@4.1.0-beta.1
    • @workflow/errors@4.1.0-beta.14
    • @workflow/utils@4.1.0-beta.11

4.0.1-beta.27

Patch Changes

4.0.1-beta.26

Patch Changes

  • Updated dependencies [61fdb41, 0aa835f]:
    • @workflow/world@4.0.1-beta.13
    • @workflow/errors@4.0.1-beta.13

4.0.1-beta.25

Patch Changes

  • #751 dd3db13 Thanks @VaguelySerious! - Remove the unused paused/resumed run events and states

    • Remove run_paused and run_resumed event types
    • Remove paused status from WorkflowRunStatus
    • Remove PauseWorkflowRunParams and ResumeWorkflowRunParams types
    • Remove pauseWorkflowRun and resumeWorkflowRun functions from world-vercel
  • Updated dependencies [dd3db13]:

    • @workflow/world@4.0.1-beta.12
    • @workflow/errors@4.0.1-beta.13

4.0.1-beta.24

Patch Changes

  • Updated dependencies [9b1640d]:
    • @workflow/utils@4.0.1-beta.10
    • @workflow/errors@4.0.1-beta.13

4.0.1-beta.23

Patch Changes

4.0.1-beta.22

Patch Changes

  • #455 e3f0390 Thanks @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/utils@4.0.1-beta.9
    • @workflow/world@4.0.1-beta.11
    • @workflow/errors@4.0.1-beta.12

4.0.1-beta.21

Patch Changes

  • #681 d9f6a49 Thanks @VaguelySerious! - Create dataDir on app start, and record package version to enable future migrations

  • #672 c3464bf Thanks @TooTallNate! - Fix race condition in streamer where close events arriving during disk reads would close the controller before data was enqueued. Close events are now buffered and processed after disk reads complete.

  • Updated dependencies [0cf0ac3]:

    • @workflow/utils@4.0.1-beta.8
    • @workflow/errors@4.0.1-beta.11

4.0.1-beta.20

Patch Changes

  • #662 f2d5997 Thanks @VaguelySerious! - Throw an error when trying writing JSON that fails entity validation, and remove error when trying to read JSON that fails validation, replacing it with a warning. This unblocks UI/CLI when data is invalid.

4.0.1-beta.19

Patch Changes

4.0.1-beta.18

Patch Changes

  • Updated dependencies [1ef6b2f, b56aae3]:
    • @workflow/utils@4.0.1-beta.7
    • @workflow/errors@4.0.1-beta.9

4.0.1-beta.17

Patch Changes

  • #590 c9b8d84 Thanks @adriandlam! - Improve port detection with HTTP probing

  • Updated dependencies [c9b8d84]:

    • @workflow/utils@4.0.1-beta.6
    • @workflow/errors@4.0.1-beta.8

4.0.1-beta.16

Patch Changes

4.0.1-beta.15

Patch Changes

  • 48b3a12: perf: optimize for high-concurrency workflows

    • Add in-memory cache for file existence checks to avoid expensive fs.access() calls
    • Increase default concurrency limit from 20 to 100
    • Improve HTTP connection pooling with undici Agent (100 connections, 30s keepalive)
  • Updated dependencies [57a2c32]

    • @workflow/world@4.0.1-beta.9
    • @workflow/errors@4.0.1-beta.7

4.0.1-beta.14

Patch Changes

  • 6e8e828: Silently ignore stream already closed errors
  • 2faddf3: Move @workflow/errors package to "dependencies" instead of "devDependencies"
  • 8d4562e: Rename leftover references to "embedded world" to be "local world"
  • Updated dependencies [bc9b628]
  • Updated dependencies [34f3f86]
  • Updated dependencies [cd451e0]
  • Updated dependencies [10c5b91]
  • Updated dependencies [bdde1bd]
    • @workflow/utils@4.0.1-beta.5
    • @workflow/world@4.0.1-beta.8
    • @workflow/errors@4.0.1-beta.7

4.0.1-beta.13

Patch Changes

  • 40057db: Use a semaphore to enforce a concurrency limit on the local world queue
  • Updated dependencies [fb9fd0f]
    • @workflow/world@4.0.1-beta.7

4.0.1-beta.12

Patch Changes

  • edb69c3: Fix port detection and base URL resolution for dev servers
  • Updated dependencies [edb69c3]
    • @workflow/utils@4.0.1-beta.4

4.0.1-beta.11

Patch Changes

  • 3436629: Fix bugs in streamer (empty chunk handling and cloning chunks)

5.0.0-beta.10

Patch Changes

  • 3d99d6d: Update @vercel/oidc and @vercel/queue to fix expired OIDC token edge case

5.0.0-beta.9

Patch Changes

  • 4b70739: Require specifying runId when writing to stream
  • Updated dependencies [4b70739]
    • @workflow/world@4.0.1-beta.6

5.0.0-beta.8

Major Changes

  • aa015af: BREAKING: Change createLocalWorld API signature from positional parameters to config object. Add baseUrl configuration support.

    Breaking change:

    • createLocalWorld(dataDir?, port?) → createLocalWorld(args?: Partial<Config>)

    New features:

    • Add baseUrl config option for HTTPS and custom hostnames (via config or WORKFLOW_LOCAL_BASE_URL env var)
    • Support for port 0 (OS-assigned port)

Patch Changes

  • 00b0bb9: Support for structured errors
  • b97b6bf: Lock all dependencies in our packages
  • 79480f2: Clean up Hook entities after a workflow run has completed
  • Updated dependencies [b97b6bf]
  • Updated dependencies [00b0bb9]
    • @workflow/utils@4.0.1-beta.3
    • @workflow/world@4.0.1-beta.5

4.0.1-beta.7

Patch Changes

  • 2b880f9: Enforce uniqueness on hook "token" values
  • 68363b2: When paginating, return a cursor even at the end of the list, to allow for stable resumption

4.0.1-beta.6

Patch Changes

  • adf0cfe: Add automatic port discovery
  • Updated dependencies [bf170ad]
  • Updated dependencies [adf0cfe]
    • @workflow/utils@4.0.1-beta.2

4.0.1-beta.5

Patch Changes

  • 05714f7: Add sveltekit workflow integration

4.0.1-beta.4

Patch Changes

  • 10309c3: Fix long-running steps to not time out after 5 minutes
  • f973954: Update license to Apache 2.0
  • Updated dependencies [f973954]
    • @workflow/world@4.0.1-beta.4

4.0.1-beta.3

Patch Changes

  • 20d51f0: Allow WORKFLOW_LOCAL_QUEUE_MAX_VISIBILITY env var to set max queue visibility timeout
  • Updated dependencies [20d51f0]
  • Updated dependencies [70be894]
    • @workflow/world@4.0.1-beta.3

4.0.1-beta.2

Patch Changes

  • 66225bf: World-local: filter by workflowName/status if passed
  • 7868434: Remove AuthProvider interface from World and associated implementations
  • Updated dependencies [d3a4ed3]
  • Updated dependencies [d3a4ed3]
  • Updated dependencies [7868434]
    • @workflow/world@4.0.1-beta.2

4.0.1-beta.1

Patch Changes

  • 1408293: Add "description" field to package.json file
  • e46294f: Add "license" and "repository" fields to package.json file
  • Updated dependencies [8422a32]
  • Updated dependencies [e46294f]
    • @workflow/world@4.0.1-beta.1

4.0.1-beta.0

Patch Changes

  • fcf63d0: Initial publish
  • Updated dependencies [fcf63d0]
    • @workflow/world@4.0.1-beta.0