Skip to content

workflow@5.0.0-beta.44

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Aug 05:19
Immutable release. Only release title and notes can be modified.
3c0d60b

@workflow/core@5.0.0-beta.44

  • #3700 9b1b8c7 @VaguelySerious - Pin correlation-ID draw order to event-log order (Node.js VM engine), so two concurrent replays of the same run assign the same IDs even when one loaded a shorter event-log prefix. Set WORKFLOW_LOG_ORDER_DRAWS=0 to opt back into arrival-order delivery resolution.
  • #3570 9454d51 @pranaygp - Add world.runs.waitForTerminalStatus(runId, { timeoutMs, signal, resolveData }) method, which long-polls until the run reaches a terminal status. await run.returnValue now internally uses this, if the World supports it, instead of using a polling interval.
  • #3634 7b79ba3 @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 a noop event; replay steps over those without delivering them or advancing the deterministic clock. Set WORKFLOW_SEALED_LOG=0 to 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.
  • #3675 5b5a926 @TooTallNate - Step-argument serialization failures now fail the step with a catchable SerializationError (via a step_failed event, like a step-body failure) instead of failing the run from outside the workflow, and when uncaught they fail the run immediately as a USER_ERROR rather than retrying until max queue deliveries.
  • #3728 f771585 @pranaygp - Hold process-wide state on globalThis rather than at module scope in the packages that get bundled into the host application's server build, where a bundler compiles one copy of each module per layer. Covers warn-once latches, lazy caches, the VM script and QuickJS asset caches, the dev-server port cache, and step single-flight, whose per-copy map was not actually single-flight. State that is deliberately per-copy is annotated with the reason.
  • #3728 f771585 @pranaygp - Build the workflow entrypoint's queue handler from the runtime World (getWorld()) instead of getWorldHandlers(), so a process creates one World rather than two. A stateful World no longer gets duplicate connection pools or queue workers.
  • #3743 bf9de1c @VaguelySerious - A wait-continuation delivered before its wait elapses now re-arms under a fresh idempotency key instead of losing the wait's timer. Previously the re-enqueue reused a key the early delivery had already spent, so the world's dedupe window dropped it and the run slept indefinitely with nothing scheduled to wake it.

@workflow/world@5.0.0-beta.29

  • #3570 9454d51 @pranaygp - Add world.runs.waitForTerminalStatus(runId, { timeoutMs, signal, resolveData }) method, which long-polls until the run reaches a terminal status. await run.returnValue now internally uses this, if the World supports it, instead of using a polling interval.
  • #3634 7b79ba3 @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 a noop event; replay steps over those without delivering them or advancing the deterministic clock. Set WORKFLOW_SEALED_LOG=0 to 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.
  • #3728 f771585 @pranaygp - Hold process-wide state on globalThis rather than at module scope in the packages that get bundled into the host application's server build, where a bundler compiles one copy of each module per layer. Covers warn-once latches, lazy caches, the VM script and QuickJS asset caches, the dev-server port cache, and step single-flight, whose per-copy map was not actually single-flight. State that is deliberately per-copy is annotated with the reason.
  • #3743 bf9de1c @VaguelySerious - A wait-continuation delivered before its wait elapses now re-arms under a fresh idempotency key instead of losing the wait's timer. Previously the re-enqueue reused a key the early delivery had already spent, so the world's dedupe window dropped it and the run slept indefinitely with nothing scheduled to wake it.

@workflow/world-local@5.0.0-beta.38

  • #3570 9454d51 @pranaygp - Add world.runs.waitForTerminalStatus(runId, { timeoutMs, signal, resolveData }) method, which long-polls until the run reaches a terminal status. await run.returnValue now internally uses this, if the World supports it, instead of using a polling interval.
  • #3634 7b79ba3 @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 a noop event; replay steps over those without delivering them or advancing the deterministic clock. Set WORKFLOW_SEALED_LOG=0 to 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.
  • #3728 f771585 @pranaygp - Hold process-wide state (the WebSocket transport registry, HTTP connection pools, ULID factories, caches, log-once latches) on globalThis instead of at module scope. This de-duplicates state across bundled packages. Fixes WebSocket transport, which was registered in one module state but looked up in another.

@workflow/world-postgres@5.0.0-beta.36

  • #3570 9454d51 @pranaygp - Add world.runs.waitForTerminalStatus(runId, { timeoutMs, signal, resolveData }) method, which long-polls until the run reaches a terminal status. await run.returnValue now internally uses this, if the World supports it, instead of using a polling interval.
  • #3634 7b79ba3 @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 a noop event; replay steps over those without delivering them or advancing the deterministic clock. Set WORKFLOW_SEALED_LOG=0 to 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 71bc027 @shin4141 - Commit step entities and their step_created events atomically.

@workflow/world-vercel@5.0.0-beta.40

  • #3570 9454d51 @pranaygp - Add world.runs.waitForTerminalStatus(runId, { timeoutMs, signal, resolveData }) method, which long-polls until the run reaches a terminal status. await run.returnValue now internally uses this, if the World supports it, instead of using a polling interval.
  • #3634 7b79ba3 @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 a noop event; replay steps over those without delivering them or advancing the deterministic clock. Set WORKFLOW_SEALED_LOG=0 to 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.
  • #3702 dc68611 @shalabhc - Default the events transport to WebSockets. WORKFLOW_EVENTS_TRANSPORT=http opts back out; any other value, including unset, now takes the socket.
  • #3599 d012bf0 @karthikscale3 - Preserve upstream HTTP status codes when fetching Workflow run encryption keys.
  • #3728 f771585 @pranaygp - Hold process-wide state (the WebSocket transport registry, HTTP connection pools, ULID factories, caches, log-once latches) on globalThis instead of at module scope. This de-duplicates state across bundled packages. Fixes WebSocket transport, which was registered in one module state but looked up in another.
  • #3702 dc68611 @shalabhc - Add WORKFLOW_INTERNAL_EVENTS_TRANSPORT_STRICT, an internal flag that fails a step_completed write which falls back to HTTP while the WebSocket gate is on, so CI can tell a working socket from a silently demoted one.

@workflow/world-testing@5.0.0-beta.44

  • #3728 f771585 @pranaygp - Annotate the test server's per-run invocation counter as deliberately per-copy, so it passes the module-scope state rule.
  • #3737 7e48e7b @VaguelySerious - The event-id conformance test now floors a run's stamped specVersion at mintedSpecVersion() rather than SPEC_VERSION_CURRENT, so a World is not failed for stamping the version it was told to stamp while a spec bump is staged.

@workflow/web-shared@5.0.0-beta.44

  • #3715 5a59bb8 @karthikscale3 - Allow consumers to disable decrypt controls and explain why decryption is unavailable.
  • #3692 a06afee @mitul-s - Prefix trace viewer marker context cards with "Hook received" or "Attribute set" before the relative time.
  • #3634 7b79ba3 @pranaygp - Render sealed log positions (noop events) as the log rows they are: shown in event lists, excluded from span geometry and trace duration, since a seal's timestamp belongs to whichever reader wrote it rather than to the run.
  • #3684 4bd533d @karthikscale3 - Display short step names when observability events contain a workflow-prefixed name.

@workflow/ai@5.0.0-beta.14

  • #3728 f771585 @pranaygp - Hold process-wide state on globalThis rather than at module scope in the packages that get bundled into the host application's server build, where a bundler compiles one copy of each module per layer. Covers warn-once latches, lazy caches, the VM script and QuickJS asset caches, the dev-server port cache, and step single-flight, whose per-copy map was not actually single-flight. State that is deliberately per-copy is annotated with the reason.

@workflow/builders@5.0.0-beta.44

  • #3454 8a2648e @josuediazflores - Emit manifest.json in a stable order and remove a redundant compilation round per no-op rebuild in Next dev.

@workflow/next@5.0.0-beta.44

  • #3454 8a2648e @josuediazflores - Emit manifest.json in a stable order and remove a redundant compilation round per no-op rebuild in Next dev.

@workflow/nitro@5.0.0-beta.44

  • #3454 8a2648e @josuediazflores - Emit manifest.json in a stable order and remove a redundant compilation round per no-op rebuild in Next dev.

@workflow/sveltekit@5.0.0-beta.44

  • #3509 37ed049 @dummdidumm - Load SvelteKit route configuration through @sveltejs/load-config, including projects that configure SvelteKit exclusively in vite.config.

@workflow/utils@5.0.0-beta.9

  • #3728 f771585 @pranaygp - Add globalSingleton(), which parks a package's process-wide state on globalThis so bundled copies of a module in one process share it.
  • #3728 f771585 @pranaygp - Declare sideEffects: false so bundlers can drop the unused parts of the barrel from a host application's build.

@workflow/nest@5.0.0-beta.44

  • #3728 f771585 @pranaygp - Hold process-wide state on globalThis rather than at module scope in the packages that get bundled into the host application's server build, where a bundler compiles one copy of each module per layer. Covers warn-once latches, lazy caches, the VM script and QuickJS asset caches, the dev-server port cache, and step single-flight, whose per-copy map was not actually single-flight. State that is deliberately per-copy is annotated with the reason.