workflow 5.0.1 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/docs/ai/chat-session-modeling.mdx +8 -8
  2. package/docs/ai/human-in-the-loop.mdx +2 -2
  3. package/docs/ai/index.mdx +14 -14
  4. package/docs/ai/streaming-updates-from-tools.mdx +2 -2
  5. package/docs/api-reference/workflow-nest/index.mdx +4 -1
  6. package/docs/api-reference/workflow-nest/is-workflow-request.mdx +58 -0
  7. package/docs/api-reference/workflow-nest/meta.json +1 -0
  8. package/docs/api-reference/workflow-nest/workflow-controller.mdx +6 -2
  9. package/docs/api-reference/workflow-nest/workflow-module.mdx +9 -1
  10. package/docs/configuration/framework-options.mdx +6 -0
  11. package/docs/configuration/runtime-tuning.mdx +2 -1
  12. package/docs/configuration/worlds.mdx +4 -4
  13. package/docs/cookbook/integrations/ai-sdk.mdx +8 -8
  14. package/docs/cookbook/integrations/chat-sdk.mdx +8 -8
  15. package/docs/cookbook/integrations/sandbox.mdx +8 -8
  16. package/docs/errors/node-js-module-in-workflow.mdx +36 -0
  17. package/docs/foundations/serialization.mdx +1 -1
  18. package/docs/foundations/streaming.mdx +1 -1
  19. package/docs/getting-started/astro.mdx +7 -9
  20. package/docs/getting-started/express.mdx +4 -10
  21. package/docs/getting-started/fastify.mdx +4 -9
  22. package/docs/getting-started/hono.mdx +4 -10
  23. package/docs/getting-started/index.mdx +2 -2
  24. package/docs/getting-started/nestjs.mdx +157 -36
  25. package/docs/getting-started/next.mdx +15 -18
  26. package/docs/getting-started/nitro.mdx +4 -10
  27. package/docs/getting-started/nuxt.mdx +4 -10
  28. package/docs/getting-started/react-router/v7.mdx +6 -22
  29. package/docs/getting-started/react-router/v8.mdx +6 -22
  30. package/docs/getting-started/sveltekit.mdx +7 -9
  31. package/docs/getting-started/tanstack-start.mdx +7 -9
  32. package/docs/getting-started/vite.mdx +7 -9
  33. package/docs/how-it-works/code-transform.mdx +12 -8
  34. package/docs/how-it-works/encryption.mdx +3 -1
  35. package/docs/whats-new.mdx +1 -1
  36. package/docs/worlds/building-a-world.mdx +6 -1
  37. package/docs/worlds/postgres.mdx +12 -32
  38. package/docs/worlds/upgrading-to-v5.mdx +1 -1
  39. package/docs/worlds/vercel.mdx +7 -5
  40. package/package.json +12 -12
@@ -74,8 +74,9 @@ flowchart LR
74
74
 
75
75
  ## Detailed transformation examples
76
76
 
77
- <Tabs items={["Step Mode", "Workflow Mode", "Detect Mode"]}>
78
- <Tab value="Step Mode">
77
+ <TabsWithChildren tabs={["Step Mode","Workflow Mode","Detect Mode"]}>
78
+
79
+ <TabContent order={1}>
79
80
 
80
81
  **Step Mode** creates the registration bundle that the combined flow handler imports (it is not an HTTP route), and is also the transform framework loaders apply to your application code.
81
82
 
@@ -126,8 +127,9 @@ handleUserSignup.workflowId = "workflow//workflows/user.js//handleUserSignup"; /
126
127
 
127
128
  **ID format:** Step IDs follow the pattern `step//{filepath}//{functionName}`, where the file path is relative to your project root.
128
129
 
129
- </Tab>
130
- <Tab value="Workflow Mode">
130
+ </TabContent>
131
+
132
+ <TabContent order={2}>
131
133
 
132
134
  **Workflow Mode** creates the workflow execution bundle served at `/.well-known/workflow/v1/flow`.
133
135
 
@@ -176,8 +178,9 @@ handleUserSignup.workflowId = "workflow//workflows/user.js//handleUserSignup"; /
176
178
 
177
179
  **ID format:** Workflow IDs follow the pattern `workflow//{filepath}//{functionName}`. The `workflowId` property is attached to the function so [`start()`](/docs/api-reference/workflow-api/start) works at runtime.
178
180
 
179
- </Tab>
180
- <Tab value="Detect Mode">
181
+ </TabContent>
182
+
183
+ <TabContent order={3}>
181
184
 
182
185
  **Detect Mode** is a lightweight, non-transforming mode used during the build's discovery phase.
183
186
 
@@ -216,8 +219,9 @@ export async function handleUserSignup(email: string) {
216
219
  **Working without the app-code loader:** Frameworks apply the step-mode transform to application code by default, which is what gives `start(handleUserSignup)` its automatic IDs and type safety. If your setup can't run the loader, you can instead construct workflow IDs manually using the pattern `workflow//{filepath}//{functionName}`, look them up in the build manifest, and pass them to `start()` as strings.
217
220
  </Callout>
218
221
 
219
- </Tab>
220
- </Tabs>
222
+ </TabContent>
223
+
224
+ </TabsWithChildren>
221
225
 
222
226
  ## Generated files
223
227
 
@@ -36,7 +36,9 @@ Metadata such as workflow names, step names, entity IDs, timestamps, and lifecyc
36
36
 
37
37
  ### Compression
38
38
 
39
- Payloads are compressed before encryption. A format prefix on the stored value records the compression codec (gzip, with zstd support in the format), and the inner payload keeps its own serialization format prefix after decompression. Repetitive payloads compress heavily. AI token streams average around 80% smaller, reducing storage and network transfer. Like encryption, compression is automatic and requires no code changes.
39
+ Payloads are compressed before encryption. A format prefix on the stored value records the compression codec, and the inner payload keeps its own serialization format prefix after decompression. Repetitive payloads compress heavily. AI token streams average around 80% smaller, reducing storage and network transfer. Like encryption, compression is automatic and requires no code changes.
40
+
41
+ The codec is zstd when both the writer and the run's deployment run Node.js 22.15+ (or 23.8+), and gzip otherwise. Runs started on an older Node.js version stay readable after you upgrade the project's Node.js version. To force a codec, set [`WORKFLOW_COMPRESSION_CODEC`](/docs/configuration/runtime-tuning#workflow_compression_codec).
40
42
 
41
43
  ### Key management
42
44
 
@@ -154,7 +154,7 @@ All three first-party Worlds now implement it: Vercel accepts up to 30 days, and
154
154
  - **A run cannot be forked across environments.** `start()` stamps the environment it was called from onto the queue message, and a deployment refuses a delivery whose run was created in a different environment. Previously a preview client and a production deployment could each hold half of one run ID.
155
155
  - **An experimental QuickJS VM engine.** Set [`WORKFLOW_VM=quickjs`](/docs/configuration/runtime-tuning#workflow_vm) to run workflow functions in a QuickJS VM compiled to WebAssembly instead of `node:vm`, for platforms that do not provide `node:vm`. Replay semantics are identical, but the available globals are not: check the differences before switching an existing deployment.
156
156
  - **Experimental dynamic workflows.** Pass workflow source as a string to `start()` to run orchestration assembled after deployment over steps already deployed with your app. The code is stored with the run (encrypted on Vercel), so replays always execute the code the run started with. Off unless the deployment sets `WORKFLOW_EXPERIMENTAL_DYNAMIC_WORKFLOWS=1`. See [Dynamic Workflows](/docs/advanced/dynamic-workflows).
157
- - **An opt-in WebSocket transport for event writes** on the Vercel World, which ships a run's events over one socket instead of one HTTP request each. Set [`WORKFLOW_EVENTS_TRANSPORT=ws`](/worlds/vercel#workflow_events_transport) to opt in. Any other value, including unset, keeps HTTP. Tracing is unaffected: each write still emits an `http POST` client span, synthesized around the frame, with the transport on `workflow.events.transport`.
157
+ - **A WebSocket transport for event writes** on the Vercel World, which ships a run's events over one socket instead of one HTTP request each. It is the default; set [`WORKFLOW_EVENTS_TRANSPORT=http`](/worlds/vercel#workflow_events_transport) to opt out. Tracing is unaffected: each write still emits an `http POST` client span, synthesized around the frame, with the transport on `workflow.events.transport`.
158
158
  - **`await run.returnValue` waits instead of polling.** Reading a run's result long-polls the World until the run reaches a terminal status, rather than asking again on a fixed interval. A result is observed as soon as it exists, and an idle wait costs one open request instead of a request per tick. Worlds that do not implement the long poll keep the interval.
159
159
  - **An event arriving mid-replay no longer fails the run.** A hook resume or step completion landing while a replay is in flight used to be able to fail it with [`CORRUPTED_EVENT_LOG`](/docs/errors/corrupted-event-log). Writes now come back with the events the replay had not seen, and the event is held for whichever part of the workflow awaits it. A run only fails when the log is genuinely missing a position.
160
160
 
@@ -158,6 +158,8 @@ interface Storage {
158
158
 
159
159
  **Batch writes:** `events.createBatch()` is optional, and implementing it is what declares it. The runtime folds a suspension's `step_created` and `wait_created` writes into batches only when the method exists, and otherwise takes the single-event path unchanged. Implement it with real atomicity per attempt, so a lost race leaves nothing behind, or do not implement it at all. The events land in request order at consecutive positions, and a concurrent writer may push the whole batch above the caller's view of the log. No skipped-event report accompanies the result, so a position-tracking caller compares the committed positions against what it expected and reloads. Reject the whole batch, with a request-level error, for `run_created`, `run_started`, `run_cancelled`, `hook_created`, `hook_disposed`, `attr_set`, for more events targeting one entity than a single write can express, and for a batch over your own size caps. The one legal same-entity pair is `step_created` followed by `step_started`, which creates the step born-running, and there the input must ride the `step_created`.
160
160
 
161
+ **Throttled step results:** `step_completed`, `step_retrying`, and a `step_failed` marked with `afterStepBody: true` in `CreateEventParams` record a step body that already ran. If your World retries throttled writes, keep these waiting longer than other writes, because losing one to queue redelivery runs the body again. `@workflow/world-vercel` waits until the invocation's deadline. The flag is advisory, and a World may ignore it.
162
+
161
163
  **Run creation:** For `run_created` events, the `runId` parameter may be a client-provided string or `null`. When `null`, your World generates and returns a new `runId`.
162
164
 
163
165
  **Event data resolution:** `events.list()` and `events.create()` accept `resolveData: 'skip-step-inputs'`, and the runtime replays with it. The World may leave `input` out of `step_created` and `step_started` events, and returns everything else as for `'all'`. Treat any value other than `'none'` as `'all'`, because a World that tests `resolveData === 'all'` strips step results and breaks every replay. Map the value with `entityResolveData()` from `@workflow/world` before passing it to an entity read.
@@ -449,7 +451,10 @@ that lifetime, so the session's `write(chunkSeq, chunks)` receives a sequence
449
451
  number that is writer-local rather than stream-global. That is what lets a
450
452
  World order concurrent writers to the same stream. The session's `close()` must
451
453
  not resolve before every prior write is durable; `dispose()` is optional and
452
- releases transport resources without ending the stream. A World that does not
454
+ releases transport resources without ending the stream. Optional `release()`
455
+ retires an idle transport after the runtime drains a released writer. Unlike
456
+ `dispose()`, it must leave later `write()` and `close()` usable, for example
457
+ by switching that writer to stateless HTTP. A World that does not
453
458
  implement `createWriteSession` is unaffected: the runtime uses
454
459
  `write`/`writeMulti`/`close` exactly as before.
455
460
 
@@ -48,42 +48,22 @@ WORKFLOW_POSTGRES_URL="postgres://user:password@host:5432/database"
48
48
 
49
49
  Run the migration script to create the necessary tables in your database. Ensure `WORKFLOW_POSTGRES_URL` or `DATABASE_URL` is set when running this command:
50
50
 
51
- <Tabs items={["npm", "pnpm", "Yarn", "Bun"]}>
52
-
53
- <Tab value="npm">
54
-
55
- ```bash
51
+ ```bash tab="npm"
56
52
  npx --package=@workflow/world-postgres bootstrap
57
53
  ```
58
54
 
59
- </Tab>
60
-
61
- <Tab value="pnpm">
62
-
63
- ```bash
55
+ ```bash tab="pnpm"
64
56
  pnpm dlx --package @workflow/world-postgres bootstrap
65
57
  ```
66
58
 
67
- </Tab>
68
-
69
- <Tab value="Yarn">
70
-
71
- ```bash
59
+ ```bash tab="Yarn"
72
60
  yarn dlx --package @workflow/world-postgres bootstrap
73
61
  ```
74
62
 
75
- </Tab>
76
-
77
- <Tab value="Bun">
78
-
79
- ```bash
63
+ ```bash tab="Bun"
80
64
  bunx --package @workflow/world-postgres bootstrap
81
65
  ```
82
66
 
83
- </Tab>
84
-
85
- </Tabs>
86
-
87
67
  <Callout type="info">
88
68
  The migration is idempotent and can safely be run as a post-deployment lifecycle script.
89
69
  </Callout>
@@ -154,9 +134,9 @@ still adds overhead. Pulling in `workflow/runtime` from a server-startup hook pu
154
134
  the whole runtime into the cold-start path before the first request is served.
155
135
  </Callout>
156
136
 
157
- <Tabs items={["Next.js", "SvelteKit", "Nitro"]}>
137
+ <TabsWithChildren tabs={["Next.js","SvelteKit","Nitro"]}>
158
138
 
159
- <Tab value="Next.js">
139
+ <TabContent order={1}>
160
140
 
161
141
  Create an `instrumentation.ts` file in your project root:
162
142
 
@@ -174,9 +154,9 @@ export async function register() {
174
154
  Learn more about [Next.js Instrumentation](https://nextjs.org/docs/app/guides/instrumentation).
175
155
  </Callout>
176
156
 
177
- </Tab>
157
+ </TabContent>
178
158
 
179
- <Tab value="SvelteKit">
159
+ <TabContent order={2}>
180
160
 
181
161
  Create a `src/hooks.server.ts` file:
182
162
 
@@ -194,9 +174,9 @@ export const init: ServerInit = async () => {
194
174
  Learn more about [SvelteKit Hooks](https://svelte.dev/docs/kit/hooks).
195
175
  </Callout>
196
176
 
197
- </Tab>
177
+ </TabContent>
198
178
 
199
- <Tab value="Nitro">
179
+ <TabContent order={3}>
200
180
 
201
181
  Create a plugin to start the world on server initialization:
202
182
 
@@ -225,9 +205,9 @@ export default defineNitroConfig({
225
205
  Learn more about [Nitro Plugins](https://v3.nitro.build/docs/plugins).
226
206
  </Callout>
227
207
 
228
- </Tab>
208
+ </TabContent>
229
209
 
230
- </Tabs>
210
+ </TabsWithChildren>
231
211
 
232
212
  <Callout type="info">
233
213
  The Postgres World requires a long-lived worker process that polls the database for jobs. This does not work on serverless environments. For Vercel deployments, use the [Vercel World](/worlds/vercel) instead.
@@ -99,7 +99,7 @@ This bites rather than merely wasting memory because the runtime caches the *Wor
99
99
 
100
100
  **One World per process.** The workflow entrypoint's queue handler is now built from the runtime World that `getWorld()` returns, rather than from `getWorldHandlers()`. A stateful World is no longer instantiated twice in one process, so it stops getting duplicate connection pools and duplicate queue workers. If you added your own de-duplication to work around that, it is now redundant, though harmless if it keys on process-wide state.
101
101
 
102
- **Your own transport is your own business, except for the tracing.** How a World ships events to its backend is unconstrained: `@workflow/world-vercel` can opt into a WebSocket and falls back to HTTP. What is constrained is what a reader of a trace sees. A non-HTTP transport still has to emit the per-event client span that an HTTP write would, or the per-event view of a run silently disappears. See [`WORKFLOW_EVENTS_TRANSPORT`](/worlds/vercel#workflow_events_transport) for the span shape and attributes the Vercel World uses, including a separate span for the handshake.
102
+ **Your own transport is your own business, except for the tracing.** How a World ships events to its backend is unconstrained: `@workflow/world-vercel` uses a WebSocket by default and falls back to HTTP. What is constrained is what a reader of a trace sees. A non-HTTP transport still has to emit the per-event client span that an HTTP write would, or the per-event view of a run silently disappears. See [`WORKFLOW_EVENTS_TRANSPORT`](/worlds/vercel#workflow_events_transport) for the span shape and attributes the Vercel World uses, including a separate span for the handshake.
103
103
 
104
104
  **Replay reads the event log with `resolveData: 'skip-step-inputs'`.** A World may leave `input` out of `step_created` and `step_started` events for this value, and must otherwise treat it as `'all'`. A World that tests `resolveData === 'all'`, or validates against `['none', 'all']`, strips step results or rejects the read, and every replay fails. Test for `'none'` instead, or map with `entityResolveData()` from `@workflow/world`. `@workflow/world-testing` covers this case.
105
105
 
@@ -248,17 +248,19 @@ This setting does not own tenant rollout policy and does not infer server suppor
248
248
 
249
249
  Writes and close requests execute serially. The first operation waits up to 250 ms for an opted-in socket to open; this is an implementation-level measurement knob, not protocol semantics. If the budget expires, or the upgrade fails or is declined before acceptance, the writer uses HTTP without racing the same operation over both transports. After the socket accepts a write, a missing acknowledgement has an unknown outcome: the writer fails rather than replaying the write over HTTP and risking a duplicate append. A throttled (429) write or close did not apply, so the writer retries it after the server's `Retry-After`, as the HTTP writer does, on the socket if it stays open (or its replacement, after a drain) and otherwise over HTTP. Past 30 seconds of cumulative wait, the write moves to HTTP, whose own 429 retry applies. A close that fails with a 5xx is retried over HTTP, since close is idempotent.
250
250
 
251
+ Once a released writer's writes drain, its socket closes without closing the shared stream, and later writes through that same handle go over HTTP. Writers acquired with `getWritable()` inside a step release their socket when the step completes. External `getRun(runId).getWritable()` handles release it on the first `releaseLock()` after pending writes drain, so hold the writer lock for the whole burst to keep writing over the socket.
252
+
251
253
  Before routine authentication expiry or server max duration, the server sends a v1 `drain` control. The client stops sending, lets an already-admitted request receive its reply, and reconnects after the server closes with code 1001. Authentication drains re-resolve a fresh bearer. A request that was sent but receives no reply before close still has an unknown outcome and is never replayed.
252
254
 
253
255
  Each stream WebSocket message is at most [`WORKFLOW_WS_MAX_MESSAGE_BYTES`](#workflow_ws_max_message_bytes) bytes. A write group larger than the limit is sent as several ordered write requests. A single chunk too large for one message is written over HTTP instead, as are the rest of its writer's writes.
254
256
 
255
257
  ### `WORKFLOW_EVENTS_TRANSPORT`
256
258
 
257
- Opt-in WebSocket transport for workflow run events, which ships them to the Vercel World over one socket per run instead of one HTTP request each. Default: `http`.
259
+ Workflow run events ship to the Vercel World over a WebSocket instead of one HTTP request each. Default: `ws`.
258
260
 
259
- Set `WORKFLOW_EVENTS_TRANSPORT=ws` to opt in. Only that value (case-insensitive) enables the WebSocket — any other value, including unset, empty, or `http`, keeps HTTP — so a typo fails toward the default rather than enabling a transport nobody asked for.
261
+ Set `WORKFLOW_EVENTS_TRANSPORT=http` to opt out. Only that exact value disables the WebSocket — any other value, including unset or empty, takes it — so a typo fails toward the default rather than silently pinning a deployment to HTTP.
260
262
 
261
- The setting is ignored when the World is configured with `projectConfig` and therefore routes through the `api-workflow` proxy: that endpoint is an HTTP-only REST gateway and does not forward a WebSocket upgrade, so events stay on HTTP. The fallback is silent, because the variable is typically set deployment-wide and a `projectConfig` World (such as the CLI) cannot act on it, and is reported once per process under `DEBUG=workflow:*`. `workflow.events.transport` on the per-write span records which transport actually carried a run.
263
+ The setting is ignored when the World is configured with `projectConfig` and therefore routes through the `api-workflow` proxy: that endpoint is an HTTP-only REST gateway and does not forward a WebSocket upgrade, so events stay on HTTP. The fallback is silent — now that the WebSocket is the default, nothing asked for it — and is reported once per process under `DEBUG=workflow:*`. `workflow.events.transport` on the per-write span records which transport actually carried a run.
262
264
 
263
265
  Event writes use the WebSocket only while that run's events channel is open. The queue handler opens it for every delivery, so workflows need nothing extra. Code that writes a run's events outside a delivery, such as a custom driver or a long-lived process, opens the channel with `openEventsChannel(runId)`, or those writes go over HTTP. Call the returned release when you're done, because an open socket keeps the process alive:
264
266
 
@@ -294,7 +296,7 @@ The WebSocket handshake is itself a span, `workflow.events.ws.connect`, so the c
294
296
 
295
297
  ### `WORKFLOW_EVENTS_TRANSPORT_WS_OVERRIDE_WORKFLOWS`
296
298
 
297
- Comma-separated workflows whose runs use the WebSocket events transport even when [`WORKFLOW_EVENTS_TRANSPORT`](#workflow_events_transport) is `http` or unset. Use it to move selected workflows onto the WebSocket while the rest of the deployment stays on HTTP. Default: none.
299
+ Comma-separated workflows whose runs use the WebSocket events transport even when [`WORKFLOW_EVENTS_TRANSPORT`](#workflow_events_transport) is `http`. Use it to move selected workflows onto the WebSocket while the rest of the deployment stays on HTTP. Default: none.
298
300
 
299
301
  Each entry is a workflow's function name, such as `processOrder`, or its full workflow name, such as `workflow//./src/workflows/order//processOrder`. Matching is exact and case-sensitive. A function name matches every workflow with that name, in any file.
300
302
 
@@ -302,7 +304,7 @@ Each entry is a workflow's function name, such as `processOrder`, or its full wo
302
304
  WORKFLOW_EVENTS_TRANSPORT_WS_OVERRIDE_WORKFLOWS=processOrder,syncInventory
303
305
  ```
304
306
 
305
- The override applies to the events channel the queue handler opens for each delivery of a listed workflow's run. The workflow name comes from the delivery's queue, so it covers the run's workflow and step invocations alike. `openEventsChannel(runId, config, { workflowName })` applies it to channels you open yourself; without `workflowName`, only `WORKFLOW_EVENTS_TRANSPORT=ws` opens one. When `WORKFLOW_EVENTS_TRANSPORT=ws` is set, every workflow already uses the WebSocket and the override has no effect.
307
+ The override applies to the events channel the queue handler opens for each delivery of a listed workflow's run. The workflow name comes from the delivery's queue, so it covers the run's workflow and step invocations alike. `openEventsChannel(runId, config, { workflowName })` applies it to channels you open yourself; without `workflowName`, a deployment with `WORKFLOW_EVENTS_TRANSPORT=http` opens none. Unless `WORKFLOW_EVENTS_TRANSPORT=http` is set, every workflow already uses the WebSocket and the override has no effect.
306
308
 
307
309
  Like other environment variables, the setting is fixed for each deployment, and a run stays on the deployment it started on. Changing it takes effect for runs started on the next deployment; runs already in progress keep the transport of the deployment they're pinned to.
308
310
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workflow",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Workflow SDK - Build durable, resilient, and observable workflows",
5
5
  "main": "dist/typescript-plugin.cjs",
6
6
  "type": "module",
@@ -58,19 +58,19 @@
58
58
  }
59
59
  },
60
60
  "dependencies": {
61
- "@workflow/astro": "5.0.1",
62
- "@workflow/cli": "5.0.1",
63
- "@workflow/core": "5.0.1",
64
- "@workflow/errors": "5.0.1",
61
+ "@workflow/astro": "5.0.2",
62
+ "@workflow/cli": "5.0.2",
63
+ "@workflow/core": "5.1.0",
64
+ "@workflow/errors": "5.0.2",
65
65
  "@workflow/typescript-plugin": "5.0.0",
66
- "@workflow/utils": "5.0.0",
66
+ "@workflow/utils": "5.0.1",
67
67
  "ms": "2.1.3",
68
- "@workflow/next": "5.0.1",
69
- "@workflow/nest": "5.0.1",
70
- "@workflow/nitro": "5.0.1",
71
- "@workflow/nuxt": "5.0.1",
72
- "@workflow/sveltekit": "5.0.1",
73
- "@workflow/rollup": "5.0.1"
68
+ "@workflow/next": "5.0.2",
69
+ "@workflow/nest": "5.1.0",
70
+ "@workflow/nitro": "5.0.2",
71
+ "@workflow/nuxt": "5.0.2",
72
+ "@workflow/sveltekit": "5.0.2",
73
+ "@workflow/rollup": "5.0.2"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@types/ms": "2.1.0",