workflow 5.0.0-beta.5 → 5.0.0-beta.51

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 (256) hide show
  1. package/README.md +68 -23
  2. package/dist/api-workflow.d.ts +1 -1
  3. package/dist/api-workflow.d.ts.map +1 -1
  4. package/dist/api-workflow.js +1 -1
  5. package/dist/api.d.ts +3 -3
  6. package/dist/api.d.ts.map +1 -1
  7. package/dist/api.js +5 -7
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +6 -1
  11. package/dist/internal/builtins.d.ts +20 -3
  12. package/dist/internal/builtins.d.ts.map +1 -1
  13. package/dist/internal/builtins.js +68 -4
  14. package/dist/internal/errors.d.ts +1 -1
  15. package/dist/internal/errors.d.ts.map +1 -1
  16. package/dist/internal/errors.js +2 -2
  17. package/dist/nest-builder.d.ts +2 -0
  18. package/dist/nest-builder.d.ts.map +1 -0
  19. package/dist/nest-builder.js +2 -0
  20. package/dist/nest-vercel-builder.d.ts +2 -0
  21. package/dist/nest-vercel-builder.d.ts.map +1 -0
  22. package/dist/nest-vercel-builder.js +2 -0
  23. package/dist/observability.d.ts +1 -1
  24. package/dist/observability.js +2 -2
  25. package/dist/runtime.d.ts +2 -1
  26. package/dist/runtime.d.ts.map +1 -1
  27. package/dist/runtime.js +4 -1
  28. package/docs/ai/chat-session-modeling.mdx +176 -422
  29. package/docs/ai/defining-tools.mdx +6 -7
  30. package/docs/ai/human-in-the-loop.mdx +11 -11
  31. package/docs/ai/index.mdx +71 -75
  32. package/docs/ai/message-queueing.mdx +71 -110
  33. package/docs/ai/meta.json +1 -0
  34. package/docs/ai/resumable-streams.mdx +40 -28
  35. package/docs/ai/sleep-and-delays.mdx +10 -10
  36. package/docs/ai/streaming-updates-from-tools.mdx +6 -6
  37. package/docs/api-reference/index.mdx +25 -1
  38. package/docs/api-reference/meta.json +8 -0
  39. package/docs/api-reference/vitest/index.mdx +9 -15
  40. package/docs/api-reference/workflow/create-hook.mdx +89 -10
  41. package/docs/api-reference/workflow/create-webhook.mdx +16 -15
  42. package/docs/api-reference/workflow/define-hook.mdx +35 -33
  43. package/docs/api-reference/workflow/fatal-error.mdx +30 -8
  44. package/docs/api-reference/workflow/fetch.mdx +14 -10
  45. package/docs/api-reference/workflow/get-step-metadata.mdx +2 -2
  46. package/docs/api-reference/workflow/get-workflow-metadata.mdx +3 -3
  47. package/docs/api-reference/workflow/get-writable.mdx +7 -7
  48. package/docs/api-reference/workflow/index.mdx +4 -1
  49. package/docs/api-reference/workflow/retryable-error.mdx +1 -1
  50. package/docs/api-reference/workflow/set-attributes.mdx +61 -0
  51. package/docs/api-reference/workflow/sleep.mdx +4 -4
  52. package/docs/api-reference/workflow-ai/durable-agent.mdx +63 -101
  53. package/docs/api-reference/workflow-ai/index.mdx +5 -5
  54. package/docs/api-reference/workflow-ai/workflow-chat-transport.mdx +67 -24
  55. package/docs/api-reference/workflow-api/get-hook-by-token.mdx +26 -12
  56. package/docs/api-reference/workflow-api/get-run.mdx +43 -8
  57. package/docs/api-reference/workflow-api/index.mdx +6 -10
  58. package/docs/api-reference/workflow-api/resume-hook.mdx +73 -12
  59. package/docs/api-reference/workflow-api/resume-webhook.mdx +11 -9
  60. package/docs/api-reference/workflow-api/start.mdx +60 -13
  61. package/docs/api-reference/workflow-astro/index.mdx +18 -0
  62. package/docs/api-reference/workflow-astro/meta.json +4 -0
  63. package/docs/api-reference/workflow-astro/workflow.mdx +45 -0
  64. package/docs/api-reference/workflow-errors/entity-conflict-error.mdx +4 -4
  65. package/docs/api-reference/workflow-errors/hook-conflict-error.mdx +60 -0
  66. package/docs/api-reference/workflow-errors/hook-not-found-error.mdx +8 -8
  67. package/docs/api-reference/workflow-errors/index.mdx +88 -0
  68. package/docs/api-reference/workflow-errors/meta.json +6 -0
  69. package/docs/api-reference/workflow-errors/precondition-failed-error.mdx +68 -0
  70. package/docs/api-reference/workflow-errors/run-expired-error.mdx +2 -2
  71. package/docs/api-reference/workflow-errors/run-not-supported-error.mdx +58 -0
  72. package/docs/api-reference/workflow-errors/step-not-registered-error.mdx +5 -5
  73. package/docs/api-reference/workflow-errors/throttle-error.mdx +2 -2
  74. package/docs/api-reference/workflow-errors/too-early-error.mdx +2 -2
  75. package/docs/api-reference/workflow-errors/workflow-error.mdx +52 -0
  76. package/docs/api-reference/workflow-errors/workflow-not-registered-error.mdx +5 -6
  77. package/docs/api-reference/workflow-errors/workflow-run-cancelled-error.mdx +6 -6
  78. package/docs/api-reference/workflow-errors/workflow-run-failed-error.mdx +5 -5
  79. package/docs/api-reference/workflow-errors/workflow-run-not-completed-error.mdx +58 -0
  80. package/docs/api-reference/workflow-errors/workflow-run-not-found-error.mdx +4 -4
  81. package/docs/api-reference/workflow-errors/workflow-runtime-error.mdx +58 -0
  82. package/docs/api-reference/workflow-errors/workflow-world-error.mdx +8 -8
  83. package/docs/api-reference/workflow-globals.mdx +14 -10
  84. package/docs/api-reference/workflow-nest/configure-workflow-controller.mdx +33 -0
  85. package/docs/api-reference/workflow-nest/index.mdx +31 -0
  86. package/docs/api-reference/workflow-nest/meta.json +9 -0
  87. package/docs/api-reference/workflow-nest/nest-local-builder.mdx +64 -0
  88. package/docs/api-reference/workflow-nest/workflow-controller.mdx +40 -0
  89. package/docs/api-reference/workflow-nest/workflow-module.mdx +74 -0
  90. package/docs/api-reference/workflow-next/with-workflow.mdx +39 -17
  91. package/docs/api-reference/workflow-nitro/index.mdx +60 -0
  92. package/docs/api-reference/workflow-nuxt/index.mdx +48 -0
  93. package/docs/api-reference/workflow-observability/hydrate-data.mdx +35 -0
  94. package/docs/api-reference/workflow-observability/hydrate-resource-io.mdx +62 -0
  95. package/docs/api-reference/workflow-observability/index.mdx +62 -0
  96. package/docs/api-reference/workflow-observability/meta.json +11 -0
  97. package/docs/api-reference/workflow-observability/observability-revivers.mdx +50 -0
  98. package/docs/api-reference/workflow-observability/parse-class-name.mdx +41 -0
  99. package/docs/api-reference/workflow-observability/parse-step-name.mdx +40 -0
  100. package/docs/api-reference/workflow-observability/parse-workflow-name.mdx +55 -0
  101. package/docs/api-reference/workflow-runtime/create-world.mdx +39 -0
  102. package/docs/api-reference/workflow-runtime/get-world-handlers.mdx +44 -0
  103. package/docs/api-reference/{workflow-api → workflow-runtime}/get-world.mdx +11 -14
  104. package/docs/api-reference/workflow-runtime/health-check.mdx +50 -0
  105. package/docs/api-reference/workflow-runtime/index.mdx +41 -0
  106. package/docs/api-reference/workflow-runtime/meta.json +12 -0
  107. package/docs/api-reference/workflow-runtime/set-world.mdx +51 -0
  108. package/docs/api-reference/workflow-runtime/workflow-entrypoint.mdx +43 -0
  109. package/docs/api-reference/workflow-runtime/world/analytics.mdx +315 -0
  110. package/docs/api-reference/workflow-runtime/world/index.mdx +60 -0
  111. package/docs/api-reference/workflow-runtime/world/meta.json +4 -0
  112. package/docs/api-reference/workflow-runtime/world/queue.mdx +88 -0
  113. package/docs/api-reference/{workflow-api → workflow-runtime}/world/storage.mdx +98 -34
  114. package/docs/api-reference/{workflow-api → workflow-runtime}/world/streams.mdx +8 -8
  115. package/docs/api-reference/workflow-serde/index.mdx +1 -2
  116. package/docs/api-reference/workflow-serde/workflow-deserialize.mdx +3 -4
  117. package/docs/api-reference/workflow-serde/workflow-serialize.mdx +8 -8
  118. package/docs/api-reference/workflow-sveltekit/index.mdx +18 -0
  119. package/docs/api-reference/workflow-sveltekit/meta.json +4 -0
  120. package/docs/api-reference/workflow-sveltekit/workflow-plugin.mdx +42 -0
  121. package/docs/api-reference/workflow-vite/index.mdx +18 -0
  122. package/docs/api-reference/workflow-vite/meta.json +4 -0
  123. package/docs/api-reference/workflow-vite/workflow.mdx +48 -0
  124. package/docs/changelog/attributes-mvp.mdx +380 -0
  125. package/docs/changelog/batched-event-writes.mdx +79 -0
  126. package/docs/changelog/eager-processing.mdx +110 -436
  127. package/docs/changelog/index.mdx +4 -2
  128. package/docs/changelog/lazy-event-creation.md +127 -0
  129. package/docs/changelog/lazy-hook-resume.mdx +78 -0
  130. package/docs/changelog/meta.json +11 -1
  131. package/docs/changelog/resilient-resume.mdx +32 -0
  132. package/docs/changelog/resilient-start.mdx +33 -285
  133. package/docs/changelog/step-message-ownership.mdx +360 -0
  134. package/docs/changelog/turbo-mode.md +87 -0
  135. package/docs/comparisons/index.mdx +66 -0
  136. package/docs/comparisons/meta.json +11 -0
  137. package/docs/comparisons/workflow-sdk-vs-aws-agentcore.mdx +55 -0
  138. package/docs/comparisons/workflow-sdk-vs-aws-step-functions.mdx +111 -0
  139. package/docs/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx +71 -0
  140. package/docs/comparisons/workflow-sdk-vs-inngest.mdx +102 -0
  141. package/docs/comparisons/workflow-sdk-vs-temporal.mdx +123 -0
  142. package/docs/comparisons/workflow-sdk-vs-trigger-dev.mdx +104 -0
  143. package/docs/configuration/build-and-diagnostics.mdx +70 -0
  144. package/docs/configuration/cli-and-web-ui.mdx +241 -0
  145. package/docs/configuration/framework-options.mdx +165 -0
  146. package/docs/configuration/index.mdx +32 -0
  147. package/docs/configuration/meta.json +12 -0
  148. package/docs/configuration/runtime-tuning.mdx +381 -0
  149. package/docs/configuration/worlds.mdx +313 -0
  150. package/docs/cookbook/advanced/child-workflows.mdx +211 -264
  151. package/docs/cookbook/advanced/meta.json +6 -1
  152. package/docs/cookbook/advanced/publishing-libraries.mdx +65 -56
  153. package/docs/cookbook/advanced/serializable-steps.mdx +48 -68
  154. package/docs/cookbook/advanced/upgrading-workflows.mdx +199 -0
  155. package/docs/cookbook/agent-patterns/agent-cancellation.mdx +78 -60
  156. package/docs/cookbook/agent-patterns/durable-agent.mdx +23 -131
  157. package/docs/cookbook/agent-patterns/human-in-the-loop.mdx +180 -195
  158. package/docs/cookbook/common-patterns/batching.mdx +18 -14
  159. package/docs/cookbook/common-patterns/idempotency.mdx +41 -53
  160. package/docs/cookbook/common-patterns/rate-limiting.mdx +8 -4
  161. package/docs/cookbook/common-patterns/saga.mdx +23 -19
  162. package/docs/cookbook/common-patterns/scheduling.mdx +34 -22
  163. package/docs/cookbook/common-patterns/sequential-and-parallel.mdx +29 -25
  164. package/docs/cookbook/common-patterns/timeouts.mdx +26 -21
  165. package/docs/cookbook/common-patterns/webhooks.mdx +10 -6
  166. package/docs/cookbook/common-patterns/workflow-composition.mdx +30 -27
  167. package/docs/cookbook/index.mdx +22 -21
  168. package/docs/cookbook/integrations/ai-sdk.mdx +86 -48
  169. package/docs/cookbook/integrations/chat-sdk.mdx +50 -33
  170. package/docs/cookbook/integrations/sandbox.mdx +62 -45
  171. package/docs/deploying.mdx +95 -0
  172. package/docs/errors/abort-signal-timeout-in-workflow.mdx +16 -12
  173. package/docs/errors/corrupted-event-log.mdx +39 -18
  174. package/docs/errors/deployment-mismatch.mdx +71 -0
  175. package/docs/errors/fetch-in-workflow.mdx +15 -14
  176. package/docs/errors/hook-conflict.mdx +69 -13
  177. package/docs/errors/index.mdx +2 -36
  178. package/docs/errors/node-js-module-in-workflow.mdx +9 -5
  179. package/docs/errors/replay-divergence.mdx +27 -0
  180. package/docs/errors/run-expired.mdx +85 -0
  181. package/docs/errors/runtime-decryption-failed.mdx +77 -0
  182. package/docs/errors/serialization-failed.mdx +44 -12
  183. package/docs/errors/start-invalid-workflow-function.mdx +9 -5
  184. package/docs/errors/step-executed-multiple-times.mdx +23 -0
  185. package/docs/errors/step-not-registered.mdx +6 -6
  186. package/docs/errors/timeout-in-workflow.mdx +12 -8
  187. package/docs/errors/webhook-invalid-respond-with-value.mdx +18 -18
  188. package/docs/errors/webhook-response-not-sent.mdx +20 -16
  189. package/docs/errors/workflow-not-registered.mdx +5 -5
  190. package/docs/foundations/cancellation.mdx +31 -32
  191. package/docs/foundations/errors-and-retries.mdx +42 -11
  192. package/docs/foundations/hooks.mdx +64 -35
  193. package/docs/foundations/idempotency.mdx +244 -12
  194. package/docs/foundations/index.mdx +1 -23
  195. package/docs/foundations/meta.json +2 -1
  196. package/docs/foundations/serialization.mdx +21 -22
  197. package/docs/foundations/starting-workflows.mdx +106 -30
  198. package/docs/foundations/streaming.mdx +108 -60
  199. package/docs/foundations/versioning.mdx +263 -0
  200. package/docs/foundations/workflows-and-steps.mdx +9 -9
  201. package/docs/getting-started/astro.mdx +22 -18
  202. package/docs/getting-started/express.mdx +15 -11
  203. package/docs/getting-started/fastify.mdx +15 -11
  204. package/docs/getting-started/hono.mdx +15 -11
  205. package/docs/getting-started/index.mdx +10 -3
  206. package/docs/getting-started/meta.json +3 -1
  207. package/docs/getting-started/nestjs.mdx +87 -20
  208. package/docs/getting-started/next.mdx +22 -16
  209. package/docs/getting-started/nitro.mdx +22 -18
  210. package/docs/getting-started/nuxt.mdx +15 -11
  211. package/docs/getting-started/python.mdx +190 -41
  212. package/docs/getting-started/react-router/index.mdx +33 -0
  213. package/docs/getting-started/react-router/meta.json +5 -0
  214. package/docs/getting-started/react-router/v7.mdx +237 -0
  215. package/docs/getting-started/react-router/v8.mdx +232 -0
  216. package/docs/getting-started/sveltekit.mdx +20 -16
  217. package/docs/getting-started/tanstack-start.mdx +17 -13
  218. package/docs/getting-started/vite.mdx +15 -11
  219. package/docs/how-it-works/cancellation.mdx +63 -63
  220. package/docs/how-it-works/code-transform.mdx +83 -67
  221. package/docs/how-it-works/encryption.mdx +30 -26
  222. package/docs/how-it-works/event-sourcing.mdx +125 -34
  223. package/docs/how-it-works/framework-integrations.mdx +96 -337
  224. package/docs/how-it-works/understanding-directives.mdx +22 -22
  225. package/docs/internal/index.mdx +6 -4
  226. package/docs/internal/meta.json +6 -1
  227. package/docs/internal/nitro-native-build.mdx +38 -0
  228. package/docs/internal/nitro-web-ui.mdx +24 -0
  229. package/docs/internal/serializable-abort-controller.mdx +7 -7
  230. package/docs/meta.json +3 -2
  231. package/docs/observability/attributes.mdx +134 -0
  232. package/docs/observability/index.mdx +32 -10
  233. package/docs/observability/meta.json +1 -1
  234. package/docs/observability/retention.mdx +95 -0
  235. package/docs/observability/tracing.mdx +124 -0
  236. package/docs/testing/index.mdx +36 -36
  237. package/docs/testing/server-based.mdx +10 -10
  238. package/docs/whats-new.mdx +186 -0
  239. package/package.json +17 -14
  240. package/docs/api-reference/workflow-api/world/index.mdx +0 -58
  241. package/docs/api-reference/workflow-api/world/meta.json +0 -4
  242. package/docs/api-reference/workflow-api/world/observability.mdx +0 -164
  243. package/docs/api-reference/workflow-api/world/queue.mdx +0 -86
  244. package/docs/deploying/building-a-world.mdx +0 -251
  245. package/docs/deploying/index.mdx +0 -95
  246. package/docs/deploying/meta.json +0 -4
  247. package/docs/deploying/world/local-world.mdx +0 -84
  248. package/docs/deploying/world/meta.json +0 -4
  249. package/docs/deploying/world/postgres-world.mdx +0 -224
  250. package/docs/deploying/world/vercel-world.mdx +0 -179
  251. package/docs/migration-guides/index.mdx +0 -34
  252. package/docs/migration-guides/meta.json +0 -9
  253. package/docs/migration-guides/migrating-from-aws-step-functions.mdx +0 -363
  254. package/docs/migration-guides/migrating-from-inngest.mdx +0 -314
  255. package/docs/migration-guides/migrating-from-temporal.mdx +0 -318
  256. package/docs/migration-guides/migrating-from-trigger-dev.mdx +0 -337
@@ -2,9 +2,11 @@
2
2
  title: start
3
3
  description: Start and enqueue a new workflow run.
4
4
  type: reference
5
- summary: Use start to programmatically enqueue a new workflow run from outside a workflow function.
5
+ summary: Use start to programmatically enqueue a new workflow run.
6
6
  prerequisites:
7
7
  - /docs/foundations/starting-workflows
8
+ related:
9
+ - /docs/foundations/idempotency
8
10
  ---
9
11
 
10
12
  Start/enqueue a new workflow run.
@@ -16,7 +18,7 @@ import { myWorkflow } from "./workflows/my-workflow";
16
18
  const run = await start(myWorkflow); // [!code highlight]
17
19
  ```
18
20
 
19
- ## API Signature
21
+ ## API signature
20
22
 
21
23
  ### Parameters
22
24
 
@@ -48,21 +50,26 @@ showSections={["returns"]}
48
50
 
49
51
  Learn more about [`WorkflowReadableStreamOptions`](/docs/api-reference/workflow-api/get-run#workflowreadablestreamoptions).
50
52
 
51
- ## Good to Know
53
+ ## Good to know
52
54
 
53
- * The `start()` function is used in runtime/non-workflow contexts to programmatically trigger workflow executions.
55
+ * Use the `start()` function in runtime contexts to programmatically trigger workflow executions.
56
+ * In v5, you can also call `start()` directly from a workflow function to spawn a child run or continue work in a new run. See [Workflow Composition](/cookbook/common-patterns/workflow-composition) and [Versioning](/docs/foundations/versioning).
54
57
  * This is different from calling workflow functions directly, which is the typical pattern in Next.js applications.
55
- * The function returns immediately after enqueuing the workflow - it doesn't wait for the workflow to complete.
58
+ * The function returns immediately after enqueuing the workflow. It doesn't wait for the workflow to complete.
59
+ * Each call to `start()` creates a new workflow run. If retried requests must route to one active workflow, have the workflow create a deterministic hook token and use [`getHookByToken()`](/docs/api-reference/workflow-api/get-hook-by-token) to reuse an already-registered active hook. The lookup is not atomic with `start()`, so concurrent callers can still create extra runs before the hook is registered. Handle that race inside the workflow by checking `await hook.getConflict()` before duplicate-sensitive work. On a conflict, it resolves with the run that owns the token, so the duplicate can return the active owner to the caller. If duplicates must be rejected before a workflow body runs, keep a durable request record until native atomic start-and-hook registration exists. See [Idempotency](/docs/foundations/idempotency#run-idempotency).
56
60
  * All arguments must be [serializable](/docs/foundations/serialization).
57
- * When `deploymentId` is provided, the argument types and return type become `unknown` since there is no guarantee the workflow function's types will be consistent across different deployments.
61
+ * When you provide `deploymentId`, the argument types and return type become `unknown` because the workflow function's types may differ across deployments.
62
+ * `attributes` seeds plaintext run metadata as part of creation and requires a World implementing spec version 4 or later. Keys that start with `$` are reserved for framework and library code; framework-level callers can pass `allowReservedAttributes: true` to seed reserved keys, with the same semantics as the [`setAttributes`](/docs/api-reference/workflow/set-attributes) option of the same name.
63
+ * `region` pins the new run to a specific region on Worlds with a regional dimension. The [Vercel World](/worlds/vercel#explicit-region-selection) then serves the run's storage, queue dispatch, and streams from that region. When you omit `region`, the run is pinned to the region where it was created. Worlds without regions ignore the option.
64
+ * `experimental_retention` asks the World to delete the run's user data as soon as the run completes or fails, instead of keeping it for the World's default window. `0` requests immediate deletion; `'default'` is identical to omitting the option. These are the only two values accepted — the value is a duration and zero is the only one implemented, and its unit is not yet decided. Recorded as the reserved `$retention` attribute, so it needs a World implementing spec version 4 or later. Retention is enforced by the World, not the SDK: the first-party Worlds implement it and a World that does not keeps the data. Note that `await run.returnValue` on a run started with `experimental_retention: 0` usually throws [`RunExpiredError`](/docs/errors/run-expired) rather than resolving, because the deletion races the read. See [Data retention](/docs/observability/retention).
58
65
 
59
66
  <Callout type="info">
60
- If `start()` throws `'start' received an invalid workflow function. Ensure the Workflow Development Kit is configured correctly and the function includes a 'use workflow' directive.`, the passed function was not transformed as a workflow. The two most common causes are a missing `"use workflow"` directive or missing framework integration. See [start-invalid-workflow-function](/docs/errors/start-invalid-workflow-function).
67
+ If `start()` throws `'start' received an invalid workflow function. Ensure the Workflow SDK is configured correctly and the function includes a 'use workflow' directive.`, the compiler did not transform the passed function as a workflow. The two most common causes are a missing `"use workflow"` directive or missing framework integration. See [start-invalid-workflow-function](/docs/errors/start-invalid-workflow-function).
61
68
  </Callout>
62
69
 
63
70
  ## Examples
64
71
 
65
- ### With Arguments
72
+ ### With arguments
66
73
 
67
74
  ```typescript
68
75
  import { start } from "workflow/api";
@@ -78,13 +85,14 @@ import { start } from "workflow/api";
78
85
  import { myWorkflow } from "./workflows/my-workflow";
79
86
 
80
87
  const run = await start(myWorkflow, ["arg1", "arg2"], { // [!code highlight]
81
- deploymentId: "custom-deployment-id" // [!code highlight]
88
+ deploymentId: "custom-deployment-id", // [!code highlight]
89
+ attributes: { source: "checkout" } // [!code highlight]
82
90
  }); // [!code highlight]
83
91
  ```
84
92
 
85
93
  ### Using `deploymentId: "latest"`
86
94
 
87
- Set `deploymentId` to `"latest"` to automatically resolve the most recent deployment for the current environment. This is useful when you want to ensure a workflow run targets the latest deployed version of your application rather than the deployment that initiated the call.
95
+ Set `deploymentId` to `"latest"` to automatically resolve the most recent deployment for the current environment. This is useful when you want to ensure a workflow run targets the latest deployed version of your application rather than the deployment that initiated the call. For when to use this and how it fits with default run pinning, see [Versioning](/docs/foundations/versioning).
88
96
 
89
97
  ```typescript
90
98
  import { start } from "workflow/api";
@@ -96,12 +104,51 @@ const run = await start(myWorkflow, ["arg1", "arg2"], { // [!code highlight]
96
104
  ```
97
105
 
98
106
  <Callout type="info">
99
- The `deploymentId` option is currently a Vercel-specific feature. The `"latest"` value resolves to the most recent deployment matching your current environment the same production target for production deployments, or the same git branch for preview deployments.
107
+ The `deploymentId` option is currently a Vercel-specific feature. Other Worlds may implement this option differently to match their own deployment runtimes, and the World spec may rename it from `deploymentId` to `version` in a future SDK version. On Vercel, `"latest"` resolves to the most recent deployment matching your current environment: the same production target for production deployments, or the same git branch for preview deployments.
108
+
109
+ In Worlds without atomic, immutable deployments (such as local development or self-hosted Postgres), there is no notion of multiple deployments to resolve between, so `deploymentId: "latest"` has no effect: the SDK logs a warning and the run targets the current deployment. This means a workflow that opts into `"latest"` on Vercel still runs unchanged in local development.
110
+ </Callout>
111
+
112
+ <Callout type="info">
113
+ Resolving `"latest"` is the one `start()` path that calls the Vercel API, so it
114
+ needs an identity that can see the calling deployment. Inside a Vercel
115
+ deployment the SDK authenticates with the deployment's own OIDC token, which
116
+ carries the owning team, and this takes precedence over a `VERCEL_TOKEN` set in
117
+ the function's environment. A `VERCEL_TOKEN` belongs to a *user* and carries no
118
+ team, so authenticating with it scopes the lookup to that user's default team
119
+ and fails with a 404 whenever that is not the team that owns the deployment.
120
+ Outside a deployment (CLI, CI, the dashboard) `VERCEL_TOKEN` is still used;
121
+ configure the World's `teamId` so the request is scoped explicitly.
100
122
  </Callout>
101
123
 
102
124
  <Callout type="warn">
103
125
  When using `deploymentId: "latest"`, the workflow run will execute on a potentially different deployment than the one calling `start()`. Be mindful of forward and backward compatibility:
104
126
 
105
- - **Workflow identity**: The workflow ID is derived from the function name and file path. If the latest deployment has renamed the workflow function or moved it to a different directory, the workflow ID will no longer match and the run will fail to start.
106
- - **Input and output compatibility**: The arguments passed to `start()` are serialized by the calling deployment but deserialized by the target deployment. Similarly, the workflow's return value is serialized by the target deployment but deserialized by the caller. If the workflow's expected arguments or return type have changed (e.g. added required fields, removed fields, or changed types), the run may fail or behave unexpectedly. Ensure that input and output schemas remain backward-compatible across deployments.
127
+ - **Workflow identity**: The function name and file path determine the workflow ID. If the latest deployment has renamed the workflow function or moved it to a different directory, the workflow ID will no longer match and the run will fail to start.
128
+ - **Input and output compatibility**: The calling deployment serializes the arguments passed to `start()`, and the target deployment deserializes them. Similarly, the target deployment serializes the workflow's return value, and the caller deserializes it. If the workflow's expected arguments or return type have changed (for example, added required fields, removed fields, or changed types), the run may fail or behave unexpectedly. Ensure that input and output schemas remain backward-compatible across deployments.
129
+ </Callout>
130
+
131
+ ### Inside a workflow function
132
+
133
+ Call `start()` directly from a workflow function to spawn a child run. It is step-backed, so the spawn records a deterministic step boundary in the parent's event log.
134
+
135
+ ```typescript
136
+ import { start } from "workflow/api";
137
+ import { childWorkflow } from "./workflows/child";
138
+
139
+ export async function parentWorkflow(value: number) {
140
+ "use workflow";
141
+
142
+ const childRun = await start(childWorkflow, [value]); // [!code highlight]
143
+ const result = await childRun.returnValue; // [!code highlight]
144
+ return { childRunId: childRun.runId, result };
145
+ }
146
+ ```
147
+
148
+ <Callout type="info">
149
+ The returned `Run` object is fully functional inside a workflow. Each property access or method call (`.status`, `.returnValue`, `.cancel()`) executes as a separate step. See [Workflow Composition](/cookbook/common-patterns/workflow-composition) for choosing between spawning a child run and awaiting a workflow function directly.
150
+ </Callout>
151
+
152
+ <Callout type="warn">
153
+ `returnValue` polls the child run every second and holds the polling step's worker slot open for as long as the child takes to finish. For long-running children, spawn without awaiting `returnValue` and have the child resume a [hook](/docs/foundations/hooks) when it completes. See the [`startAndWait()` pattern](/cookbook/advanced/child-workflows).
107
154
  </Callout>
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: "workflow/astro"
3
+ description: Astro integration for automatic workflow bundling and route registration.
4
+ type: overview
5
+ summary: Explore the Astro integration for automatic workflow bundling and runtime support.
6
+ related:
7
+ - /docs/getting-started/astro
8
+ ---
9
+
10
+ Astro integration for Workflow SDK that transforms workflow code and builds the workflow bundles.
11
+
12
+ ## Functions
13
+
14
+ <Cards>
15
+ <Card title="workflow()" href="/docs/api-reference/workflow-astro/workflow">
16
+ Astro integration that transforms workflow code (`"use step"`/`"use workflow"` directives)
17
+ </Card>
18
+ </Cards>
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "workflow/astro",
3
+ "pages": ["workflow"]
4
+ }
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: workflow
3
+ description: Configure Astro to transform workflow directives.
4
+ type: reference
5
+ summary: Add the workflow integration to your Astro config to enable workflow directive transformation.
6
+ prerequisites:
7
+ - /docs/getting-started/astro
8
+ ---
9
+
10
+ Returns an Astro integration that transforms workflow code (`"use step"`/`"use workflow"` directives) and builds the workflow bundles.
11
+
12
+ ## Usage
13
+
14
+ To enable `"use step"` and `"use workflow"` directives while developing locally or deploying to production, add `workflow()` to the `integrations` array of your Astro config.
15
+
16
+ ```typescript title="astro.config.mjs" lineNumbers
17
+ // @ts-check
18
+ import { defineConfig } from "astro/config";
19
+ import { workflow } from "workflow/astro"; // [!code highlight]
20
+
21
+ // https://astro.build/config
22
+ export default defineConfig({
23
+ integrations: [workflow()], // [!code highlight]
24
+ });
25
+ ```
26
+
27
+ The integration registers the workflow Vite transform plugins during `astro:config:setup` and builds the workflow bundles: locally during config setup, or via the Vercel builder after `astro:build:done` when deploying to Vercel.
28
+
29
+ ## API signature
30
+
31
+ ### Parameters
32
+
33
+ | Parameter | Type | Description |
34
+ | --- | --- | --- |
35
+ | `options` | `WorkflowPluginOptions` | Optional. Configures the workflow build. |
36
+
37
+ #### WorkflowPluginOptions
38
+
39
+ | Option | Type | Default | Description |
40
+ | --- | --- | --- | --- |
41
+ | `sourcemap` | `boolean \| 'inline' \| 'linked' \| 'external' \| 'both'` | `'inline'` (dev) / `false` (prod) | Controls source maps on generated workflow bundles. Accepts the same values as esbuild's `sourcemap` option. Defaults to `'inline'` in development and `false` in production (smaller function bundles, which helps stay under the Vercel 250 MB function size limit). Set it explicitly, or use the `WORKFLOW_SOURCEMAP` environment variable, to override in either environment. |
42
+
43
+ ### Returns
44
+
45
+ Returns an `AstroIntegration` object to include in the `integrations` array of your Astro config.
@@ -26,12 +26,12 @@ try {
26
26
  await world.events.create(runId, event);
27
27
  } catch (error) {
28
28
  if (EntityConflictError.is(error)) { // [!code highlight]
29
- // Event already exists safe to ignore during replay
29
+ // Event already exists, safe to ignore during replay
30
30
  }
31
31
  }
32
32
  ```
33
33
 
34
- ## API Signature
34
+ ## API signature
35
35
 
36
36
  ### Properties
37
37
 
@@ -44,11 +44,11 @@ interface EntityConflictError {
44
44
  export default EntityConflictError;`}
45
45
  />
46
46
 
47
- ### Static Methods
47
+ ### Static methods
48
48
 
49
49
  #### `EntityConflictError.is(value)`
50
50
 
51
- Type-safe check for `EntityConflictError` instances. Preferred over `instanceof` because it works across module boundaries and VM contexts.
51
+ Type-safe check for `EntityConflictError` instances. Preferred over `instanceof` because it works across module boundaries and virtual machine contexts.
52
52
 
53
53
  ```typescript
54
54
  import { EntityConflictError } from "workflow/errors"
@@ -0,0 +1,60 @@
1
+ ---
2
+ title: HookConflictError
3
+ description: Thrown when creating a hook with a token that is already in use by another workflow run.
4
+ type: reference
5
+ summary: Catch HookConflictError when a hook token is already claimed by another active workflow run.
6
+ related:
7
+ - /docs/api-reference/workflow/create-hook
8
+ - /docs/foundations/hooks
9
+ - /docs/errors/hook-conflict
10
+ ---
11
+
12
+ `HookConflictError` is thrown when creating a hook with a token that is already in use by another active workflow run. Hook tokens must be unique across all running workflows. See the [hook-conflict](/docs/errors/hook-conflict) error guide for resolution strategies.
13
+
14
+ ```typescript lineNumbers
15
+ import { HookConflictError } from "workflow/errors"
16
+ declare function startApprovalWorkflow(token: string): Promise<void>; // @setup
17
+ declare const token: string; // @setup
18
+
19
+ try {
20
+ await startApprovalWorkflow(token);
21
+ } catch (error) {
22
+ if (HookConflictError.is(error)) { // [!code highlight]
23
+ console.error(
24
+ `Token "${error.token}" already in use by run ${error.conflictingRunId}`
25
+ );
26
+ }
27
+ }
28
+ ```
29
+
30
+ ## API signature
31
+
32
+ ### Properties
33
+
34
+ <TSDoc
35
+ definition={`
36
+ interface HookConflictError {
37
+ /** The hook token that conflicted. */
38
+ token: string;
39
+ /** The run ID of the workflow currently holding the token, when known. */
40
+ conflictingRunId?: string;
41
+ /** The error message. */
42
+ message: string;
43
+ }
44
+ export default HookConflictError;`}
45
+ />
46
+
47
+ ### Static methods
48
+
49
+ #### `HookConflictError.is(value)`
50
+
51
+ Type-safe check for `HookConflictError` instances. Preferred over `instanceof` because it works across module boundaries and virtual machine contexts.
52
+
53
+ ```typescript
54
+ import { HookConflictError } from "workflow/errors"
55
+ declare const error: unknown; // @setup
56
+
57
+ if (HookConflictError.is(error)) {
58
+ // error is typed as HookConflictError
59
+ }
60
+ ```
@@ -10,9 +10,9 @@ related:
10
10
 
11
11
  `HookNotFoundError` is thrown when calling `resumeHook()` or `resumeWebhook()` with a token that does not match any active hook. This typically happens when:
12
12
 
13
- - The hook has expired (past its TTL)
14
- - The hook was already consumed and disposed
15
- - The workflow has not started yet, so the hook does not exist
13
+ - The hook's time to live (TTL) has expired.
14
+ - The hook was already consumed and disposed.
15
+ - The workflow has not started yet, so the hook does not exist.
16
16
 
17
17
  ```typescript lineNumbers
18
18
  import { HookNotFoundError } from "workflow/errors"
@@ -29,7 +29,7 @@ try {
29
29
  }
30
30
  ```
31
31
 
32
- ## API Signature
32
+ ## API signature
33
33
 
34
34
  ### Properties
35
35
 
@@ -44,11 +44,11 @@ interface HookNotFoundError {
44
44
  export default HookNotFoundError;`}
45
45
  />
46
46
 
47
- ### Static Methods
47
+ ### Static methods
48
48
 
49
49
  #### `HookNotFoundError.is(value)`
50
50
 
51
- Type-safe check for `HookNotFoundError` instances. Preferred over `instanceof` because it works across module boundaries and VM contexts.
51
+ Type-safe check for `HookNotFoundError` instances. Preferred over `instanceof` because it works across module boundaries and virtual machine contexts.
52
52
 
53
53
  ```typescript
54
54
  import { HookNotFoundError } from "workflow/errors"
@@ -66,7 +66,7 @@ if (HookNotFoundError.is(error)) {
66
66
  A common pattern for idempotent workflows is to try resuming a hook, and if it doesn't exist yet, start a new workflow run with the input data.
67
67
 
68
68
  <Callout>
69
- This "resume or start" pattern is not atomic there is a small window where a race condition is possible. A better native approach is being worked on, but this pattern works well for many use cases.
69
+ This "resume or start" pattern is not atomic: there is a small window where a race condition is possible. A better native approach is being worked on, but this pattern works well for many use cases.
70
70
  </Callout>
71
71
 
72
72
  ```typescript lineNumbers
@@ -80,7 +80,7 @@ async function handleIncomingEvent(token: string, data: unknown) {
80
80
  await resumeHook(token, data);
81
81
  } catch (error) {
82
82
  if (HookNotFoundError.is(error)) { // [!code highlight]
83
- // Hook doesn't exist yet start a new workflow run
83
+ // Hook doesn't exist yet, so start a new workflow run
84
84
  await startWorkflow("processEvent", data); // [!code highlight]
85
85
  } else {
86
86
  throw error;
@@ -0,0 +1,88 @@
1
+ ---
2
+ title: "workflow/errors"
3
+ description: Semantic error types thrown by the Workflow SDK and its storage backends.
4
+ type: overview
5
+ summary: Explore the error classes exported from workflow/errors for handling workflow failures.
6
+ related:
7
+ - /docs/foundations/errors-and-retries
8
+ ---
9
+
10
+ API reference for the error classes exported from the `workflow/errors` package.
11
+
12
+ All errors extend [`WorkflowError`](/docs/api-reference/workflow-errors/workflow-error), so you can catch any SDK error with a single `instanceof` check, or narrow to a specific class for fine-grained handling.
13
+
14
+ ## Base classes
15
+
16
+ <Cards>
17
+ <Card href="/docs/api-reference/workflow-errors/workflow-error" title="WorkflowError">
18
+ Base class for all workflow error types.
19
+ </Card>
20
+ <Card href="/docs/api-reference/workflow-errors/workflow-world-error" title="WorkflowWorldError">
21
+ Base error for failures from workflow storage backends.
22
+ </Card>
23
+ </Cards>
24
+
25
+ ## Registration errors
26
+
27
+ <Cards>
28
+ <Card href="/docs/api-reference/workflow-errors/workflow-not-registered-error" title="WorkflowNotRegisteredError">
29
+ Thrown when a workflow function is not registered in the current deployment.
30
+ </Card>
31
+ <Card href="/docs/api-reference/workflow-errors/step-not-registered-error" title="StepNotRegisteredError">
32
+ Thrown when a step function is not registered in the current deployment.
33
+ </Card>
34
+ </Cards>
35
+
36
+ ## Run errors
37
+
38
+ <Cards>
39
+ <Card href="/docs/api-reference/workflow-errors/workflow-run-not-found-error" title="WorkflowRunNotFoundError">
40
+ Thrown when operating on a workflow run that does not exist.
41
+ </Card>
42
+ <Card href="/docs/api-reference/workflow-errors/workflow-run-failed-error" title="WorkflowRunFailedError">
43
+ Thrown when awaiting the return value of a failed workflow run.
44
+ </Card>
45
+ <Card href="/docs/api-reference/workflow-errors/workflow-run-cancelled-error" title="WorkflowRunCancelledError">
46
+ Thrown when awaiting the return value of a canceled workflow run.
47
+ </Card>
48
+ <Card href="/docs/api-reference/workflow-errors/workflow-run-not-completed-error" title="WorkflowRunNotCompletedError">
49
+ Thrown when requesting the result of a workflow run that has not completed yet.
50
+ </Card>
51
+ <Card href="/docs/api-reference/workflow-errors/workflow-runtime-error" title="WorkflowRuntimeError">
52
+ Thrown when the workflow runtime encounters an execution error, such as serialization failures or timeouts.
53
+ </Card>
54
+ <Card href="/docs/api-reference/workflow-errors/run-expired-error" title="RunExpiredError">
55
+ Thrown when a workflow run has expired and can no longer be operated on.
56
+ </Card>
57
+ <Card href="/docs/api-reference/workflow-errors/run-not-supported-error" title="RunNotSupportedError">
58
+ Thrown when a workflow run requires a newer workflow spec version than the installed SDK supports.
59
+ </Card>
60
+ </Cards>
61
+
62
+ ## Hook errors
63
+
64
+ <Cards>
65
+ <Card href="/docs/api-reference/workflow-errors/hook-not-found-error" title="HookNotFoundError">
66
+ Thrown when resuming a hook that does not exist.
67
+ </Card>
68
+ <Card href="/docs/api-reference/workflow-errors/hook-conflict-error" title="HookConflictError">
69
+ Thrown when creating a hook with a token that is already in use by another workflow run.
70
+ </Card>
71
+ </Cards>
72
+
73
+ ## Backend errors
74
+
75
+ <Cards>
76
+ <Card href="/docs/api-reference/workflow-errors/throttle-error" title="ThrottleError">
77
+ Thrown when a request is rate-limited by the workflow backend.
78
+ </Card>
79
+ <Card href="/docs/api-reference/workflow-errors/entity-conflict-error" title="EntityConflictError">
80
+ Thrown when a storage operation conflicts with the current entity state.
81
+ </Card>
82
+ <Card href="/docs/api-reference/workflow-errors/precondition-failed-error" title="PreconditionFailedError">
83
+ Thrown when an event creation is rejected because the client's event-log snapshot is stale.
84
+ </Card>
85
+ <Card href="/docs/api-reference/workflow-errors/too-early-error" title="TooEarlyError">
86
+ Thrown when a request is made before the system is ready to process it.
87
+ </Card>
88
+ </Cards>
@@ -1,16 +1,22 @@
1
1
  {
2
2
  "title": "workflow/errors",
3
3
  "pages": [
4
+ "workflow-error",
4
5
  "hook-not-found-error",
6
+ "hook-conflict-error",
5
7
  "step-not-registered-error",
6
8
  "workflow-not-registered-error",
7
9
  "workflow-run-not-found-error",
8
10
  "workflow-run-failed-error",
9
11
  "workflow-run-cancelled-error",
12
+ "workflow-run-not-completed-error",
13
+ "workflow-runtime-error",
10
14
  "workflow-world-error",
11
15
  "throttle-error",
12
16
  "entity-conflict-error",
17
+ "precondition-failed-error",
13
18
  "run-expired-error",
19
+ "run-not-supported-error",
14
20
  "too-early-error"
15
21
  ]
16
22
  }
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: PreconditionFailedError
3
+ description: World implementations throw this error when they reject an event creation because the client's event-log snapshot is stale.
4
+ type: reference
5
+ summary: Catch PreconditionFailedError when a World rejects an event creation made from a stale event-log snapshot.
6
+ related:
7
+ - /docs/api-reference/workflow-errors/workflow-world-error
8
+ - /docs/api-reference/workflow-errors/entity-conflict-error
9
+ ---
10
+
11
+ World implementations throw `PreconditionFailedError` when they reject an event creation because the client's event-log snapshot is stale: the log already held more events than the position the creation named. It corresponds to HTTP 412 Precondition Failed semantics.
12
+
13
+ No World in this repository throws it. A stale replay does not need to be refused: its log is a prefix rather than a prefix with a hole in it, replay is deterministic on a prefix, and the write it makes next comes back carrying the events it was pushed past (see [Stale reads](/docs/configuration/runtime-tuning#stale-reads-and-why-nothing-has-to-be-rejected)). The error and the runtime's handling of it remain for a World that would rather refuse than report. Such a World allocates positions somewhere other than the commit, so it cannot report a gap reliably. Event creations that carry no position are never rejected with it.
14
+
15
+ A World rejects only on evidence and accepts the creation whenever it cannot decide. This error always means the snapshot was stale, but not receiving it does not prove the snapshot was current.
16
+
17
+ <Callout>
18
+ The Workflow runtime handles this error by restarting the replay in the same invocation from a corrected event log. It re-invokes the run for a fresh replay only after spending its in-process restart budget. It never retries the rejected creation as-is because a replay working from a corrected log derives different events. You will only encounter it when interacting with World storage APIs directly.
19
+ </Callout>
20
+
21
+ A World may attach the events the client was missing to the rejection as `details`, which lets the runtime restart without re-reading the event log. This is optional, and the runtime falls back to a full reload when the details are absent or unusable.
22
+
23
+ ```typescript lineNumbers
24
+ import { PreconditionFailedError } from "workflow/errors"
25
+ declare const world: { events: { create(...args: any[]): Promise<any> } }; // @setup
26
+ declare const runId: string; // @setup
27
+ declare const event: any; // @setup
28
+
29
+ try {
30
+ await world.events.create(runId, event);
31
+ } catch (error) {
32
+ if (PreconditionFailedError.is(error)) { // [!code highlight]
33
+ console.log("Snapshot is stale; reload the event log and retry");
34
+ }
35
+ }
36
+ ```
37
+
38
+ ## API signature
39
+
40
+ ### Properties
41
+
42
+ <TSDoc
43
+ definition={`
44
+ interface PreconditionFailedError {
45
+ /** Delay in seconds before the operation should be retried. Present when the server sends a Retry-After header. */
46
+ retryAfter?: number;
47
+ /** Optional rejection payload. A world may put the events the client was missing here, as \`{ events, cursor }\`, so the runtime can restart its replay without re-reading the event log. */
48
+ details?: unknown;
49
+ /** The error message. */
50
+ message: string;
51
+ }
52
+ export default PreconditionFailedError;`}
53
+ />
54
+
55
+ ### Static methods
56
+
57
+ #### `PreconditionFailedError.is(value)`
58
+
59
+ Type-safe check for `PreconditionFailedError` instances. Preferred over `instanceof` because it works across module boundaries and VM contexts.
60
+
61
+ ```typescript
62
+ import { PreconditionFailedError } from "workflow/errors"
63
+ declare const error: unknown; // @setup
64
+
65
+ if (PreconditionFailedError.is(error)) {
66
+ // error is typed as PreconditionFailedError
67
+ }
68
+ ```
@@ -29,7 +29,7 @@ try {
29
29
  }
30
30
  ```
31
31
 
32
- ## API Signature
32
+ ## API signature
33
33
 
34
34
  ### Properties
35
35
 
@@ -42,7 +42,7 @@ interface RunExpiredError {
42
42
  export default RunExpiredError;`}
43
43
  />
44
44
 
45
- ### Static Methods
45
+ ### Static methods
46
46
 
47
47
  #### `RunExpiredError.is(value)`
48
48
 
@@ -0,0 +1,58 @@
1
+ ---
2
+ title: RunNotSupportedError
3
+ description: Thrown when a workflow run requires a newer workflow spec version than the installed SDK supports.
4
+ type: reference
5
+ summary: Catch RunNotSupportedError when stored run data requires a newer workflow package version.
6
+ related:
7
+ - /docs/foundations/versioning
8
+ ---
9
+
10
+ `RunNotSupportedError` is thrown when reading a workflow run whose data was written with a newer workflow spec version than the running SDK supports. This typically means the run was created by a newer version of the `workflow` package. Upgrade the package to process it.
11
+
12
+ ```typescript lineNumbers
13
+ import { RunNotSupportedError } from "workflow/errors"
14
+ declare function readRun(runId: string): Promise<unknown>; // @setup
15
+ declare const runId: string; // @setup
16
+
17
+ try {
18
+ await readRun(runId);
19
+ } catch (error) {
20
+ if (RunNotSupportedError.is(error)) { // [!code highlight]
21
+ console.error(
22
+ `Run requires spec v${error.runSpecVersion}, world supports v${error.worldSpecVersion}`
23
+ );
24
+ }
25
+ }
26
+ ```
27
+
28
+ ## API signature
29
+
30
+ ### Properties
31
+
32
+ <TSDoc
33
+ definition={`
34
+ interface RunNotSupportedError {
35
+ /** The spec version the run's stored data requires. */
36
+ runSpecVersion: number;
37
+ /** The spec version the current World supports. */
38
+ worldSpecVersion: number;
39
+ /** The error message. */
40
+ message: string;
41
+ }
42
+ export default RunNotSupportedError;`}
43
+ />
44
+
45
+ ### Static methods
46
+
47
+ #### `RunNotSupportedError.is(value)`
48
+
49
+ Type-safe check for `RunNotSupportedError` instances. Preferred over `instanceof` because it works across module boundaries and virtual machine contexts.
50
+
51
+ ```typescript
52
+ import { RunNotSupportedError } from "workflow/errors"
53
+ declare const error: unknown; // @setup
54
+
55
+ if (RunNotSupportedError.is(error)) {
56
+ // error is typed as RunNotSupportedError
57
+ }
58
+ ```
@@ -8,7 +8,7 @@ related:
8
8
  - /docs/api-reference/workflow-errors/workflow-not-registered-error
9
9
  ---
10
10
 
11
- `StepNotRegisteredError` is thrown when the runtime tries to execute a step function that is not registered in the current deployment. This is an infrastructure error not a user code error. It typically indicates a build or bundling issue that caused the step to not be included in the deployment.
11
+ `StepNotRegisteredError` is thrown when the runtime tries to execute a step function that is not registered in the current deployment. This is an infrastructure error, not a user code error. It typically indicates a build or bundling issue that caused the step to not be included in the deployment.
12
12
 
13
13
  When this error occurs, the step fails (like a `FatalError`) and control is passed back to the workflow function, which can handle the failure gracefully.
14
14
 
@@ -21,7 +21,7 @@ if (StepNotRegisteredError.is(error)) { // [!code highlight]
21
21
  }
22
22
  ```
23
23
 
24
- ## API Signature
24
+ ## API signature
25
25
 
26
26
  ### Properties
27
27
 
@@ -36,14 +36,14 @@ interface StepNotRegisteredError {
36
36
  export default StepNotRegisteredError;`}
37
37
  />
38
38
 
39
- ### Static Methods
39
+ ### Static methods
40
40
 
41
41
  #### `StepNotRegisteredError.is(value)`
42
42
 
43
- Type-safe check for `StepNotRegisteredError` instances. Preferred over `instanceof` because it works across module boundaries and VM contexts.
43
+ Type-safe check for `StepNotRegisteredError` instances. Preferred over `instanceof` because it works across module boundaries and virtual machine contexts.
44
44
 
45
45
  <Callout>
46
- The `.is()` method works in server-side Node.js code (API routes, middleware, hooks). Inside `"use workflow"` functions, step errors arrive deserialized from the event log and won't be actual `StepNotRegisteredError` instances use `error.message` matching instead. See the [troubleshooting page](/docs/errors/step-not-registered) for workflow-side error handling examples.
46
+ The `.is()` method works in server-side Node.js code (API routes, middleware, hooks). Inside `"use workflow"` functions, step errors arrive deserialized from the event log and won't be actual `StepNotRegisteredError` instances. Use `error.message` matching instead. See the [troubleshooting page](/docs/errors/step-not-registered) for workflow-side error handling examples.
47
47
  </Callout>
48
48
 
49
49
  ```typescript