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.
- package/docs/ai/chat-session-modeling.mdx +8 -8
- package/docs/ai/human-in-the-loop.mdx +2 -2
- package/docs/ai/index.mdx +14 -14
- package/docs/ai/streaming-updates-from-tools.mdx +2 -2
- package/docs/api-reference/workflow-nest/index.mdx +4 -1
- package/docs/api-reference/workflow-nest/is-workflow-request.mdx +58 -0
- package/docs/api-reference/workflow-nest/meta.json +1 -0
- package/docs/api-reference/workflow-nest/workflow-controller.mdx +6 -2
- package/docs/api-reference/workflow-nest/workflow-module.mdx +9 -1
- package/docs/configuration/framework-options.mdx +6 -0
- package/docs/configuration/runtime-tuning.mdx +2 -1
- package/docs/configuration/worlds.mdx +4 -4
- package/docs/cookbook/integrations/ai-sdk.mdx +8 -8
- package/docs/cookbook/integrations/chat-sdk.mdx +8 -8
- package/docs/cookbook/integrations/sandbox.mdx +8 -8
- package/docs/errors/node-js-module-in-workflow.mdx +36 -0
- package/docs/foundations/serialization.mdx +1 -1
- package/docs/foundations/streaming.mdx +1 -1
- package/docs/getting-started/astro.mdx +7 -9
- package/docs/getting-started/express.mdx +4 -10
- package/docs/getting-started/fastify.mdx +4 -9
- package/docs/getting-started/hono.mdx +4 -10
- package/docs/getting-started/index.mdx +2 -2
- package/docs/getting-started/nestjs.mdx +157 -36
- package/docs/getting-started/next.mdx +15 -18
- package/docs/getting-started/nitro.mdx +4 -10
- package/docs/getting-started/nuxt.mdx +4 -10
- package/docs/getting-started/react-router/v7.mdx +6 -22
- package/docs/getting-started/react-router/v8.mdx +6 -22
- package/docs/getting-started/sveltekit.mdx +7 -9
- package/docs/getting-started/tanstack-start.mdx +7 -9
- package/docs/getting-started/vite.mdx +7 -9
- package/docs/how-it-works/code-transform.mdx +12 -8
- package/docs/how-it-works/encryption.mdx +3 -1
- package/docs/whats-new.mdx +1 -1
- package/docs/worlds/building-a-world.mdx +6 -1
- package/docs/worlds/postgres.mdx +12 -32
- package/docs/worlds/upgrading-to-v5.mdx +1 -1
- package/docs/worlds/vercel.mdx +7 -5
- package/package.json +12 -12
|
@@ -74,8 +74,9 @@ flowchart LR
|
|
|
74
74
|
|
|
75
75
|
## Detailed transformation examples
|
|
76
76
|
|
|
77
|
-
<
|
|
78
|
-
|
|
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
|
-
</
|
|
130
|
-
|
|
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
|
-
</
|
|
180
|
-
|
|
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
|
-
</
|
|
220
|
-
|
|
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
|
|
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
|
|
package/docs/whats-new.mdx
CHANGED
|
@@ -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
|
-
- **
|
|
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.
|
|
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
|
|
package/docs/worlds/postgres.mdx
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
137
|
+
<TabsWithChildren tabs={["Next.js","SvelteKit","Nitro"]}>
|
|
158
138
|
|
|
159
|
-
<
|
|
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
|
-
</
|
|
157
|
+
</TabContent>
|
|
178
158
|
|
|
179
|
-
<
|
|
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
|
-
</
|
|
177
|
+
</TabContent>
|
|
198
178
|
|
|
199
|
-
<
|
|
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
|
-
</
|
|
208
|
+
</TabContent>
|
|
229
209
|
|
|
230
|
-
</
|
|
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`
|
|
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
|
|
package/docs/worlds/vercel.mdx
CHANGED
|
@@ -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
|
-
|
|
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=
|
|
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
|
|
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
|
|
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`,
|
|
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
|
|
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.
|
|
62
|
-
"@workflow/cli": "5.0.
|
|
63
|
-
"@workflow/core": "5.0
|
|
64
|
-
"@workflow/errors": "5.0.
|
|
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.
|
|
66
|
+
"@workflow/utils": "5.0.1",
|
|
67
67
|
"ms": "2.1.3",
|
|
68
|
-
"@workflow/next": "5.0.
|
|
69
|
-
"@workflow/nest": "5.0
|
|
70
|
-
"@workflow/nitro": "5.0.
|
|
71
|
-
"@workflow/nuxt": "5.0.
|
|
72
|
-
"@workflow/sveltekit": "5.0.
|
|
73
|
-
"@workflow/rollup": "5.0.
|
|
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",
|