workflow 5.0.0-beta.2 → 5.0.0-beta.21

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 (170) hide show
  1. package/dist/api-workflow.d.ts +1 -1
  2. package/dist/api-workflow.d.ts.map +1 -1
  3. package/dist/api-workflow.js +2 -2
  4. package/dist/api.d.ts +5 -1
  5. package/dist/api.d.ts.map +1 -1
  6. package/dist/api.js +14 -2
  7. package/dist/internal/builtins.d.ts +17 -0
  8. package/dist/internal/builtins.d.ts.map +1 -1
  9. package/dist/internal/builtins.js +65 -1
  10. package/dist/observability.d.ts +1 -1
  11. package/dist/observability.js +2 -2
  12. package/dist/runtime.d.ts +1 -1
  13. package/dist/runtime.d.ts.map +1 -1
  14. package/dist/runtime.js +2 -2
  15. package/docs/ai/index.mdx +27 -23
  16. package/docs/api-reference/index.mdx +24 -0
  17. package/docs/api-reference/meta.json +8 -0
  18. package/docs/api-reference/vitest/index.mdx +28 -7
  19. package/docs/api-reference/workflow/create-hook.mdx +38 -0
  20. package/docs/api-reference/workflow/create-webhook.mdx +1 -0
  21. package/docs/api-reference/workflow/experimental-set-attributes.mdx +65 -0
  22. package/docs/api-reference/workflow/fetch.mdx +5 -0
  23. package/docs/api-reference/workflow/index.mdx +3 -0
  24. package/docs/api-reference/workflow-ai/durable-agent.mdx +7 -45
  25. package/docs/api-reference/workflow-api/get-hook-by-token.mdx +7 -0
  26. package/docs/api-reference/workflow-api/get-run.mdx +6 -0
  27. package/docs/api-reference/workflow-api/index.mdx +6 -8
  28. package/docs/api-reference/workflow-api/resume-hook.mdx +57 -0
  29. package/docs/api-reference/workflow-api/start.mdx +13 -5
  30. package/docs/api-reference/workflow-astro/index.mdx +18 -0
  31. package/docs/api-reference/workflow-astro/meta.json +4 -0
  32. package/docs/api-reference/workflow-astro/workflow.mdx +45 -0
  33. package/docs/api-reference/workflow-errors/hook-conflict-error.mdx +60 -0
  34. package/docs/api-reference/workflow-errors/index.mdx +85 -0
  35. package/docs/api-reference/workflow-errors/meta.json +5 -0
  36. package/docs/api-reference/workflow-errors/run-not-supported-error.mdx +58 -0
  37. package/docs/api-reference/workflow-errors/workflow-error.mdx +52 -0
  38. package/docs/api-reference/workflow-errors/workflow-run-failed-error.mdx +16 -6
  39. package/docs/api-reference/workflow-errors/workflow-run-not-completed-error.mdx +58 -0
  40. package/docs/api-reference/workflow-errors/workflow-runtime-error.mdx +58 -0
  41. package/docs/api-reference/workflow-nest/configure-workflow-controller.mdx +33 -0
  42. package/docs/api-reference/workflow-nest/index.mdx +31 -0
  43. package/docs/api-reference/workflow-nest/meta.json +9 -0
  44. package/docs/api-reference/workflow-nest/nest-local-builder.mdx +64 -0
  45. package/docs/api-reference/workflow-nest/workflow-controller.mdx +40 -0
  46. package/docs/api-reference/workflow-nest/workflow-module.mdx +74 -0
  47. package/docs/api-reference/workflow-next/with-workflow.mdx +56 -2
  48. package/docs/api-reference/workflow-nitro/index.mdx +59 -0
  49. package/docs/api-reference/workflow-nuxt/index.mdx +47 -0
  50. package/docs/api-reference/workflow-observability/hydrate-data.mdx +35 -0
  51. package/docs/api-reference/workflow-observability/hydrate-resource-io.mdx +62 -0
  52. package/docs/api-reference/workflow-observability/index.mdx +64 -0
  53. package/docs/api-reference/workflow-observability/meta.json +11 -0
  54. package/docs/api-reference/workflow-observability/observability-revivers.mdx +50 -0
  55. package/docs/api-reference/workflow-observability/parse-class-name.mdx +41 -0
  56. package/docs/api-reference/workflow-observability/parse-step-name.mdx +40 -0
  57. package/docs/api-reference/workflow-observability/parse-workflow-name.mdx +55 -0
  58. package/docs/api-reference/workflow-runtime/create-world.mdx +39 -0
  59. package/docs/api-reference/workflow-runtime/get-world-handlers.mdx +44 -0
  60. package/docs/api-reference/{workflow-api → workflow-runtime}/get-world.mdx +7 -10
  61. package/docs/api-reference/workflow-runtime/health-check.mdx +50 -0
  62. package/docs/api-reference/workflow-runtime/index.mdx +43 -0
  63. package/docs/api-reference/workflow-runtime/meta.json +12 -0
  64. package/docs/api-reference/workflow-runtime/set-world.mdx +49 -0
  65. package/docs/api-reference/workflow-runtime/workflow-entrypoint.mdx +42 -0
  66. package/docs/api-reference/{workflow-api → workflow-runtime}/world/index.mdx +5 -8
  67. package/docs/api-reference/workflow-runtime/world/meta.json +4 -0
  68. package/docs/api-reference/{workflow-api → workflow-runtime}/world/queue.mdx +2 -2
  69. package/docs/api-reference/{workflow-api → workflow-runtime}/world/storage.mdx +11 -4
  70. package/docs/api-reference/{workflow-api → workflow-runtime}/world/streams.mdx +2 -2
  71. package/docs/api-reference/workflow-serde/index.mdx +0 -1
  72. package/docs/api-reference/workflow-serde/workflow-deserialize.mdx +1 -2
  73. package/docs/api-reference/workflow-serde/workflow-serialize.mdx +1 -2
  74. package/docs/api-reference/workflow-sveltekit/index.mdx +18 -0
  75. package/docs/api-reference/workflow-sveltekit/meta.json +4 -0
  76. package/docs/api-reference/workflow-sveltekit/workflow-plugin.mdx +42 -0
  77. package/docs/api-reference/workflow-vite/index.mdx +18 -0
  78. package/docs/api-reference/workflow-vite/meta.json +4 -0
  79. package/docs/api-reference/workflow-vite/workflow.mdx +48 -0
  80. package/docs/changelog/attributes-mvp.mdx +380 -0
  81. package/docs/changelog/eager-processing.mdx +269 -0
  82. package/docs/changelog/index.mdx +2 -1
  83. package/docs/changelog/lazy-event-creation.md +127 -0
  84. package/docs/changelog/meta.json +7 -1
  85. package/docs/changelog/resilient-start.mdx +31 -283
  86. package/docs/changelog/turbo-mode.md +87 -0
  87. package/docs/cookbook/advanced/child-workflows.mdx +315 -0
  88. package/docs/cookbook/advanced/meta.json +2 -3
  89. package/docs/cookbook/advanced/publishing-libraries.mdx +87 -29
  90. package/docs/cookbook/advanced/serializable-steps.mdx +17 -5
  91. package/docs/cookbook/advanced/upgrading-workflows.mdx +195 -0
  92. package/docs/cookbook/agent-patterns/agent-cancellation.mdx +156 -0
  93. package/docs/cookbook/agent-patterns/durable-agent.mdx +11 -184
  94. package/docs/cookbook/agent-patterns/human-in-the-loop.mdx +150 -173
  95. package/docs/cookbook/agent-patterns/meta.json +1 -7
  96. package/docs/cookbook/common-patterns/batching.mdx +44 -118
  97. package/docs/cookbook/common-patterns/idempotency.mdx +36 -52
  98. package/docs/cookbook/common-patterns/meta.json +4 -4
  99. package/docs/cookbook/common-patterns/rate-limiting.mdx +1 -1
  100. package/docs/cookbook/common-patterns/saga.mdx +128 -33
  101. package/docs/cookbook/common-patterns/scheduling.mdx +77 -193
  102. package/docs/cookbook/common-patterns/sequential-and-parallel.mdx +155 -0
  103. package/docs/cookbook/common-patterns/timeouts.mdx +100 -0
  104. package/docs/cookbook/common-patterns/workflow-composition.mdx +117 -0
  105. package/docs/cookbook/index.mdx +14 -17
  106. package/docs/cookbook/integrations/ai-sdk.mdx +330 -142
  107. package/docs/cookbook/integrations/chat-sdk.mdx +264 -151
  108. package/docs/cookbook/integrations/sandbox.mdx +482 -81
  109. package/docs/cookbook/meta.json +1 -1
  110. package/docs/deploying/building-a-world.mdx +1 -1
  111. package/docs/deploying/world/postgres-world.mdx +5 -3
  112. package/docs/deploying/world/vercel-world.mdx +2 -0
  113. package/docs/errors/abort-signal-timeout-in-workflow.mdx +80 -0
  114. package/docs/errors/corrupted-event-log.mdx +5 -5
  115. package/docs/errors/hook-conflict.mdx +56 -4
  116. package/docs/errors/index.mdx +9 -0
  117. package/docs/errors/replay-divergence.mdx +27 -0
  118. package/docs/errors/runtime-decryption-failed.mdx +77 -0
  119. package/docs/errors/step-executed-multiple-times.mdx +23 -0
  120. package/docs/errors/step-not-registered.mdx +1 -1
  121. package/docs/foundations/cancellation.mdx +459 -0
  122. package/docs/foundations/errors-and-retries.mdx +7 -3
  123. package/docs/foundations/hooks.mdx +29 -0
  124. package/docs/foundations/idempotency.mdx +236 -11
  125. package/docs/foundations/index.mdx +3 -3
  126. package/docs/foundations/meta.json +3 -2
  127. package/docs/foundations/serialization.mdx +78 -42
  128. package/docs/foundations/starting-workflows.mdx +6 -2
  129. package/docs/foundations/streaming.mdx +14 -23
  130. package/docs/foundations/versioning.mdx +263 -0
  131. package/docs/getting-started/astro.mdx +6 -0
  132. package/docs/getting-started/index.mdx +6 -7
  133. package/docs/getting-started/meta.json +1 -0
  134. package/docs/getting-started/nestjs.mdx +9 -0
  135. package/docs/getting-started/next.mdx +5 -3
  136. package/docs/getting-started/nitro.mdx +22 -0
  137. package/docs/getting-started/sveltekit.mdx +6 -0
  138. package/docs/getting-started/tanstack-start.mdx +241 -0
  139. package/docs/how-it-works/cancellation.mdx +287 -0
  140. package/docs/how-it-works/code-transform.mdx +2 -2
  141. package/docs/how-it-works/encryption.mdx +2 -2
  142. package/docs/how-it-works/event-sourcing.mdx +2 -2
  143. package/docs/how-it-works/meta.json +2 -1
  144. package/docs/internal/index.mdx +21 -0
  145. package/docs/internal/meta.json +10 -0
  146. package/docs/internal/nitro-native-build.mdx +38 -0
  147. package/docs/internal/nitro-web-ui.mdx +24 -0
  148. package/docs/internal/serializable-abort-controller.mdx +148 -0
  149. package/docs/migration-guides/migrating-from-aws-step-functions.mdx +63 -16
  150. package/docs/migration-guides/migrating-from-inngest.mdx +44 -22
  151. package/docs/migration-guides/migrating-from-temporal.mdx +43 -14
  152. package/docs/migration-guides/migrating-from-trigger-dev.mdx +59 -27
  153. package/docs/observability/attributes.mdx +87 -0
  154. package/docs/observability/index.mdx +25 -1
  155. package/docs/observability/meta.json +1 -1
  156. package/docs/observability/tracing.mdx +106 -0
  157. package/docs/testing/index.mdx +2 -2
  158. package/package.json +14 -13
  159. package/docs/api-reference/workflow-api/world/meta.json +0 -4
  160. package/docs/api-reference/workflow-api/world/observability.mdx +0 -164
  161. package/docs/cookbook/advanced/custom-serialization.mdx +0 -168
  162. package/docs/cookbook/advanced/durable-objects.mdx +0 -148
  163. package/docs/cookbook/advanced/isomorphic-packages.mdx +0 -145
  164. package/docs/cookbook/agent-patterns/stop-workflow.mdx +0 -216
  165. package/docs/cookbook/agent-patterns/tool-orchestration.mdx +0 -255
  166. package/docs/cookbook/agent-patterns/tool-streaming.mdx +0 -181
  167. package/docs/cookbook/common-patterns/child-workflows.mdx +0 -372
  168. package/docs/cookbook/common-patterns/content-router.mdx +0 -207
  169. package/docs/cookbook/common-patterns/fan-out.mdx +0 -208
  170. package/docs/foundations/common-patterns.mdx +0 -265
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: "workflow/nitro"
3
+ description: Nitro module for automatic workflow bundling and route registration.
4
+ type: overview
5
+ summary: Explore the Nitro module that enables workflow directive transformation in Nitro apps.
6
+ related:
7
+ - /docs/getting-started/nitro
8
+ ---
9
+
10
+ Nitro integration for Workflow SDK. The `workflow/nitro` entry point's default export is a [Nitro module](https://v3.nitro.build/guide/modules) — it has no callable API. You enable it by adding it to the `modules` array of your Nitro config and configure it via the `workflow` key.
11
+
12
+ ## Usage
13
+
14
+ ```typescript title="nitro.config.ts" lineNumbers
15
+ import { defineConfig } from "nitro";
16
+
17
+ export default defineConfig({
18
+ serverDir: "./server",
19
+ modules: ["workflow/nitro"], // [!code highlight]
20
+ });
21
+ ```
22
+
23
+ When enabled, the module:
24
+
25
+ - Transforms `"use workflow"` and `"use step"` directives during bundling.
26
+ - Builds the workflow, step, and webhook bundles, and rebuilds them on file changes in development.
27
+ - Registers the workflow runtime routes under `/.well-known/workflow/v1/`.
28
+ - Serves a redirect to the local observability dashboard at `/_workflow` in development.
29
+ - Configures Vercel function rules (queue triggers and `maxDuration`) for the workflow routes when deploying to Vercel.
30
+
31
+ ## Module Options
32
+
33
+ Options are read from the `workflow` key of your Nitro config. The option type is exported as `ModuleOptions`:
34
+
35
+ ```typescript title="nitro.config.ts" lineNumbers
36
+ import { defineConfig } from "nitro";
37
+ import type { ModuleOptions } from "workflow/nitro"; // [!code highlight]
38
+
39
+ const workflow: ModuleOptions = {
40
+ runtime: "nodejs22.x",
41
+ sourcemap: "inline",
42
+ };
43
+
44
+ export default defineConfig({
45
+ modules: ["workflow/nitro"],
46
+ workflow, // [!code highlight]
47
+ });
48
+ ```
49
+
50
+ | Option | Type | Default | Description |
51
+ | --- | --- | --- | --- |
52
+ | `dirs` | `string[]` | — | Directories to scan for workflows and steps. By default, the `workflows/` directory is scanned from the project root and all layer source directories. |
53
+ | `typescriptPlugin` | `boolean` | `false` | Adds the `workflow` TypeScript plugin to the generated `tsconfig.json` for IDE IntelliSense. |
54
+ | `runtime` | `string` | — | Node.js runtime version for Vercel Functions (e.g. `'nodejs22.x'`, `'nodejs24.x'`). Only applies when deploying to Vercel. |
55
+ | `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 — helps stay under the Vercel 250MB function size limit). Set it explicitly, or use the `WORKFLOW_SOURCEMAP` environment variable, to override in either environment. |
56
+
57
+ ## Vite-based Nitro
58
+
59
+ If you use Nitro through its Vite plugin (`nitro/vite`) instead of a standalone `nitro.config.ts`, use the [`workflow/vite`](/docs/api-reference/workflow-vite) entry point, which wraps this module as a Vite plugin and accepts the same `ModuleOptions`.
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: "workflow/nuxt"
3
+ description: Nuxt module for automatic workflow bundling and runtime configuration.
4
+ type: overview
5
+ summary: Explore the Nuxt module that enables workflow directive transformation in Nuxt apps.
6
+ related:
7
+ - /docs/getting-started/nuxt
8
+ ---
9
+
10
+ Nuxt integration for Workflow SDK. The `workflow/nuxt` entry point's default export is a Nuxt module — it has no callable API. You enable it by adding it to the `modules` array of your Nuxt config and configure it via the `workflow` key.
11
+
12
+ ## Usage
13
+
14
+ ```typescript title="nuxt.config.ts" lineNumbers
15
+ import { defineNuxtConfig } from "nuxt/config";
16
+
17
+ export default defineNuxtConfig({
18
+ modules: ["workflow/nuxt"], // [!code highlight]
19
+ compatibilityDate: "latest",
20
+ });
21
+ ```
22
+
23
+ When enabled, the module:
24
+
25
+ - Registers the [`workflow/nitro`](/docs/api-reference/workflow-nitro) module on Nuxt's Nitro server, which transforms `"use workflow"` and `"use step"` directives, builds the workflow bundles, and registers the workflow runtime routes under `/.well-known/workflow/v1/`.
26
+ - Configures Vite to bundle (rather than externalize) the Workflow SDK packages in SSR mode so workflow code is transformed correctly.
27
+ - Enables the `workflow` TypeScript plugin by default for IDE IntelliSense.
28
+
29
+ ## Module Options
30
+
31
+ Options are read from the `workflow` key of your Nuxt config. The option type is exported as `ModuleOptions`:
32
+
33
+ ```typescript title="nuxt.config.ts" lineNumbers
34
+ import { defineNuxtConfig } from "nuxt/config";
35
+
36
+ export default defineNuxtConfig({
37
+ modules: ["workflow/nuxt"],
38
+ workflow: {
39
+ typescriptPlugin: false, // [!code highlight]
40
+ },
41
+ compatibilityDate: "latest",
42
+ });
43
+ ```
44
+
45
+ | Option | Type | Default | Description |
46
+ | --- | --- | --- | --- |
47
+ | `typescriptPlugin` | `boolean` | `true` | Adds the `workflow` TypeScript plugin to the generated `tsconfig.json` for IDE IntelliSense. Set to `false` to disable it. |
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: hydrateData
3
+ description: Hydrate a single serialized value from workflow storage into a plain JavaScript value.
4
+ type: reference
5
+ summary: Use hydrateData to deserialize a single value when hydrateResourceIO's field mapping doesn't apply.
6
+ related:
7
+ - /docs/api-reference/workflow-observability/hydrate-resource-io
8
+ - /docs/api-reference/workflow-observability/observability-revivers
9
+ ---
10
+
11
+ Hydrates (deserializes) a single value that was stored by the workflow runtime. This is the lower-level building block behind [`hydrateResourceIO()`](/docs/api-reference/workflow-observability/hydrate-resource-io) — use it when you have a raw serialized value rather than a whole resource, such as a single field from an event payload.
12
+
13
+ ```typescript lineNumbers
14
+ import { hydrateData, observabilityRevivers } from "workflow/observability"; // [!code highlight]
15
+ declare const serialized: unknown; // @setup
16
+
17
+ const value = hydrateData(serialized, observabilityRevivers); // [!code highlight]
18
+ ```
19
+
20
+ ## API Signature
21
+
22
+ ### Parameters
23
+
24
+ | Parameter | Type | Description |
25
+ |-----------|------|-------------|
26
+ | `value` | `unknown` | The serialized value from workflow storage |
27
+ | `revivers` | `Revivers` | Reviver functions for deserialization. Use [`observabilityRevivers`](/docs/api-reference/workflow-observability/observability-revivers) for standard use. |
28
+
29
+ ### Returns
30
+
31
+ The hydrated plain JavaScript value. The input is handled by shape:
32
+
33
+ - Format-prefixed binary data (`Uint8Array`) is decoded and parsed from the [devalue](https://github.com/Rich-Harris/devalue) format
34
+ - Encrypted data is returned as-is (a raw `Uint8Array`) — see [Encrypted Data](/docs/api-reference/workflow-observability#encrypted-data)
35
+ - Already-plain values (numbers, strings, `null`) are returned unchanged
@@ -0,0 +1,62 @@
1
+ ---
2
+ title: hydrateResourceIO
3
+ description: Hydrate the serialized data fields of a run, step, hook, or event for display.
4
+ type: reference
5
+ summary: Use hydrateResourceIO with observabilityRevivers to deserialize step input/output for display in observability tools.
6
+ prerequisites:
7
+ - /docs/api-reference/workflow-runtime/get-world
8
+ related:
9
+ - /docs/api-reference/workflow-observability/observability-revivers
10
+ - /docs/api-reference/workflow-runtime/world/storage
11
+ ---
12
+
13
+ Hydrates (deserializes) the data fields of a resource returned by the [World SDK](/docs/api-reference/workflow-runtime/world) — a workflow run, step, hook, or event. Workflow data is serialized using the [devalue](https://github.com/Rich-Harris/devalue) format, so this is required before displaying step input/output in a UI.
14
+
15
+ The function dispatches on the resource shape: steps get `input`/`output` hydrated, hooks get `metadata`, events get `eventData`, and runs get `input`/`output`.
16
+
17
+ ```typescript lineNumbers
18
+ import { getWorld } from "workflow/runtime";
19
+ import { hydrateResourceIO, observabilityRevivers } from "workflow/observability"; // [!code highlight]
20
+ declare const runId: string; // @setup
21
+ declare const stepId: string; // @setup
22
+
23
+ const world = await getWorld();
24
+ const step = await world.steps.get(runId, stepId);
25
+ const hydrated = hydrateResourceIO(step, observabilityRevivers); // [!code highlight]
26
+ console.log(hydrated.input, hydrated.output);
27
+ ```
28
+
29
+ ## API Signature
30
+
31
+ ### Parameters
32
+
33
+ | Parameter | Type | Description |
34
+ |-----------|------|-------------|
35
+ | `resource` | `WorkflowRun \| Step \| Hook \| Event` | The resource with serialized data fields |
36
+ | `revivers` | `Revivers` | Reviver functions for deserialization. Use [`observabilityRevivers`](/docs/api-reference/workflow-observability/observability-revivers) for standard use. |
37
+
38
+ ### Returns
39
+
40
+ The same resource with its data fields hydrated into plain JavaScript values.
41
+
42
+ <Callout type="info">
43
+ Encrypted data fields pass through as raw `Uint8Array` values rather than being decrypted — see [Encrypted Data](/docs/api-reference/workflow-observability#encrypted-data).
44
+ </Callout>
45
+
46
+ ## Examples
47
+
48
+ ### Display a Run's Steps with Hydrated I/O
49
+
50
+ ```typescript lineNumbers
51
+ import { getWorld } from "workflow/runtime";
52
+ import { hydrateResourceIO, observabilityRevivers } from "workflow/observability"; // [!code highlight]
53
+ declare const runId: string; // @setup
54
+
55
+ const world = await getWorld();
56
+ const steps = await world.steps.list({ runId, resolveData: "all" });
57
+
58
+ for (const step of steps.data) {
59
+ const hydrated = hydrateResourceIO(step, observabilityRevivers); // [!code highlight]
60
+ console.log(step.stepName, hydrated.input, hydrated.output);
61
+ }
62
+ ```
@@ -0,0 +1,64 @@
1
+ ---
2
+ title: "workflow/observability"
3
+ description: Utilities to hydrate serialized step I/O and parse machine-readable workflow names for display.
4
+ type: overview
5
+ summary: Explore utilities for hydrating serialized workflow data and parsing display names in observability tools.
6
+ keywords:
7
+ - workflow/observability
8
+ - hydrateResourceIO
9
+ - observabilityRevivers
10
+ - hydrateData
11
+ - parseStepName
12
+ - parseWorkflowName
13
+ - parseClassName
14
+ - data hydration
15
+ - devalue deserialization
16
+ - display name parsing
17
+ ---
18
+
19
+ API reference for observability utilities from the `workflow/observability` package.
20
+
21
+ The observability package provides utilities for working with workflow data in observability and debugging tools — hydrating serialized step I/O for display, and parsing machine-readable names into display-friendly formats.
22
+
23
+ ```typescript lineNumbers
24
+ import { // [!code highlight]
25
+ hydrateResourceIO, // [!code highlight]
26
+ observabilityRevivers, // [!code highlight]
27
+ hydrateData, // [!code highlight]
28
+ parseStepName, // [!code highlight]
29
+ parseWorkflowName, // [!code highlight]
30
+ parseClassName, // [!code highlight]
31
+ } from "workflow/observability"; // [!code highlight]
32
+ ```
33
+
34
+ ## Data Hydration
35
+
36
+ <Cards>
37
+ <Card href="/docs/api-reference/workflow-observability/hydrate-resource-io" title="hydrateResourceIO()">
38
+ Hydrate the serialized data fields of a run, step, hook, or event for display.
39
+ </Card>
40
+ <Card href="/docs/api-reference/workflow-observability/observability-revivers" title="observabilityRevivers">
41
+ Standard revivers for deserializing workflow data types (Date, Map, Set, streams, etc.).
42
+ </Card>
43
+ <Card href="/docs/api-reference/workflow-observability/hydrate-data" title="hydrateData()">
44
+ Hydrate a single serialized value (lower-level than hydrateResourceIO).
45
+ </Card>
46
+ </Cards>
47
+
48
+ ## Name Parsing
49
+
50
+ <Cards>
51
+ <Card href="/docs/api-reference/workflow-observability/parse-step-name" title="parseStepName()">
52
+ Parse a machine-readable step name into display-friendly components.
53
+ </Card>
54
+ <Card href="/docs/api-reference/workflow-observability/parse-workflow-name" title="parseWorkflowName()">
55
+ Parse a machine-readable workflow name into display-friendly components.
56
+ </Card>
57
+ <Card href="/docs/api-reference/workflow-observability/parse-class-name" title="parseClassName()">
58
+ Parse a machine-readable class ID into display-friendly components.
59
+ </Card>
60
+ </Cards>
61
+
62
+ ## Encrypted Data
63
+
64
+ When a [World](/docs/api-reference/workflow-runtime/world) stores encrypted data, the hydration utilities intentionally leave encrypted values untouched: [`hydrateData()`](/docs/api-reference/workflow-observability/hydrate-data) and [`hydrateResourceIO()`](/docs/api-reference/workflow-observability/hydrate-resource-io) return encrypted fields as raw `Uint8Array` values so observability tools can detect them and decide how to render them (for example, the Workflow CLI shows an "Encrypted" placeholder). Decryption is handled by the runtime and the World implementation — see [Encryption](/docs/how-it-works/encryption) for how keys are managed.
@@ -0,0 +1,11 @@
1
+ {
2
+ "title": "workflow/observability",
3
+ "pages": [
4
+ "hydrate-resource-io",
5
+ "observability-revivers",
6
+ "hydrate-data",
7
+ "parse-step-name",
8
+ "parse-workflow-name",
9
+ "parse-class-name"
10
+ ]
11
+ }
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: observabilityRevivers
3
+ description: Standard reviver functions for deserializing workflow data types in observability tools.
4
+ type: reference
5
+ summary: Pass observabilityRevivers to hydrateResourceIO or hydrateData to deserialize standard workflow data types.
6
+ related:
7
+ - /docs/api-reference/workflow-observability/hydrate-resource-io
8
+ - /docs/api-reference/workflow-observability/hydrate-data
9
+ ---
10
+
11
+ A set of reviver functions that handle the workflow serialization format's workflow-specific types — streams, step/workflow function references, class instances, `AbortController`/`AbortSignal`, and `DOMException` — reviving them as display-friendly marker objects or strings. Built-in JavaScript types (`Date`, `Map`, `Set`, `RegExp`, etc.) are handled by the devalue format itself and need no revivers.
12
+
13
+ Pass it as the `revivers` argument to [`hydrateResourceIO()`](/docs/api-reference/workflow-observability/hydrate-resource-io) or [`hydrateData()`](/docs/api-reference/workflow-observability/hydrate-data).
14
+
15
+ ```typescript lineNumbers
16
+ import { hydrateResourceIO, observabilityRevivers } from "workflow/observability"; // [!code highlight]
17
+ import type { Step } from "@workflow/world";
18
+ declare const step: Step; // @setup
19
+
20
+ const hydrated = hydrateResourceIO(step, observabilityRevivers); // [!code highlight]
21
+ ```
22
+
23
+ ## API Signature
24
+
25
+ ```typescript
26
+ import type { Revivers } from "workflow/observability";
27
+
28
+ declare const observabilityRevivers: Revivers;
29
+ ```
30
+
31
+ Where `Revivers` is:
32
+
33
+ ```typescript
34
+ type Revivers = Record<string, (value: any) => any>;
35
+ ```
36
+
37
+ Each key is a serialized type tag, and each function revives a serialized value of that type. You can spread `observabilityRevivers` into a custom reviver map to override how specific types are displayed:
38
+
39
+ ```typescript lineNumbers
40
+ import { hydrateData, observabilityRevivers } from "workflow/observability";
41
+ declare const value: unknown; // @setup
42
+
43
+ const customRevivers = {
44
+ ...observabilityRevivers,
45
+ // Render stream references as plain strings instead of marker objects
46
+ ReadableStream: () => "<stream>",
47
+ };
48
+
49
+ const hydrated = hydrateData(value, customRevivers);
50
+ ```
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: parseClassName
3
+ description: Parse a machine-readable class ID into display-friendly components.
4
+ type: reference
5
+ summary: Use parseClassName to extract a display-friendly class name from a serialized class instance identifier.
6
+ related:
7
+ - /docs/api-reference/workflow-observability/parse-step-name
8
+ - /docs/api-reference/workflow-observability/parse-workflow-name
9
+ - /docs/api-reference/workflow-serde
10
+ ---
11
+
12
+ Serialized class instances reference their class with machine-readable IDs like `class//./src/models//User`. This function parses them into components suitable for display in a UI.
13
+
14
+ ```typescript lineNumbers
15
+ import { parseClassName } from "workflow/observability"; // [!code highlight]
16
+
17
+ const parsed = parseClassName("class//./src/models//User"); // [!code highlight]
18
+ // parsed?.shortName → "User"
19
+ // parsed?.moduleSpecifier → "./src/models"
20
+ // parsed?.functionName → "User"
21
+ ```
22
+
23
+ ## API Signature
24
+
25
+ ### Parameters
26
+
27
+ | Parameter | Type | Description |
28
+ |-----------|------|-------------|
29
+ | `name` | `string` | The machine-readable class ID |
30
+
31
+ ### Returns
32
+
33
+ `{ shortName: string; moduleSpecifier: string; functionName: string } | null`
34
+
35
+ | Property | Description |
36
+ |----------|-------------|
37
+ | `shortName` | The display name of the class (e.g. `"User"`). |
38
+ | `moduleSpecifier` | The module the class is defined in — a relative path (`./src/models`) or a package specifier (`point@0.0.1`). |
39
+ | `functionName` | The class name as recorded by the compiler. |
40
+
41
+ Returns `null` when the input is not a valid class ID.
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: parseStepName
3
+ description: Parse a machine-readable step name into display-friendly components.
4
+ type: reference
5
+ summary: Use parseStepName to extract a display-friendly short name from a step's machine-readable identifier.
6
+ related:
7
+ - /docs/api-reference/workflow-observability/parse-workflow-name
8
+ - /docs/api-reference/workflow-observability/parse-class-name
9
+ ---
10
+
11
+ Step names are stored as machine-readable identifiers like `step//./src/workflows/order//processPayment`. This function parses them into components suitable for display in a UI.
12
+
13
+ ```typescript lineNumbers
14
+ import { parseStepName } from "workflow/observability"; // [!code highlight]
15
+
16
+ const parsed = parseStepName("step//./src/workflows/order//processPayment"); // [!code highlight]
17
+ // parsed?.shortName → "processPayment"
18
+ // parsed?.moduleSpecifier → "./src/workflows/order"
19
+ // parsed?.functionName → "processPayment"
20
+ ```
21
+
22
+ ## API Signature
23
+
24
+ ### Parameters
25
+
26
+ | Parameter | Type | Description |
27
+ |-----------|------|-------------|
28
+ | `name` | `string` | The machine-readable step name (e.g. from `step.stepName`) |
29
+
30
+ ### Returns
31
+
32
+ `{ shortName: string; moduleSpecifier: string; functionName: string } | null`
33
+
34
+ | Property | Description |
35
+ |----------|-------------|
36
+ | `shortName` | The display name — the last segment of the function name. For nested steps like `processOrder/chargeCard`, this is `"chargeCard"`. |
37
+ | `moduleSpecifier` | The module the step is defined in — a relative path (`./src/workflows/order`) or a package specifier (`@myorg/tasks@2.0.0`). |
38
+ | `functionName` | The full function name including nesting (e.g. `processOrder/chargeCard`). |
39
+
40
+ Returns `null` when the input is not a valid step name.
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: parseWorkflowName
3
+ description: Parse a machine-readable workflow name into display-friendly components.
4
+ type: reference
5
+ summary: Use parseWorkflowName to extract a display-friendly short name from a run's workflowName identifier.
6
+ related:
7
+ - /docs/api-reference/workflow-observability/parse-step-name
8
+ - /docs/api-reference/workflow-observability/parse-class-name
9
+ ---
10
+
11
+ Workflow names are stored as machine-readable identifiers like `workflow//./src/workflows/order//processOrder`. This function parses them into components suitable for display in a UI — for example when listing runs from the [World SDK](/docs/api-reference/workflow-runtime/world/storage), where `run.workflowName` holds the machine-readable form.
12
+
13
+ ```typescript lineNumbers
14
+ import { parseWorkflowName } from "workflow/observability"; // [!code highlight]
15
+
16
+ const parsed = parseWorkflowName("workflow//./src/workflows/order//processOrder"); // [!code highlight]
17
+ // parsed?.shortName → "processOrder"
18
+ // parsed?.moduleSpecifier → "./src/workflows/order"
19
+ // parsed?.functionName → "processOrder"
20
+ ```
21
+
22
+ ## API Signature
23
+
24
+ ### Parameters
25
+
26
+ | Parameter | Type | Description |
27
+ |-----------|------|-------------|
28
+ | `name` | `string` | The machine-readable workflow name (e.g. from `run.workflowName`) |
29
+
30
+ ### Returns
31
+
32
+ `{ shortName: string; moduleSpecifier: string; functionName: string } | null`
33
+
34
+ | Property | Description |
35
+ |----------|-------------|
36
+ | `shortName` | The display name. For default exports, falls back to the module's short name (e.g. `"order"` for `./src/workflows/order`). |
37
+ | `moduleSpecifier` | The module the workflow is defined in — a relative path (`./src/workflows/order`) or a package specifier (`@myorg/flows@1.0.0`). |
38
+ | `functionName` | The full exported function name. |
39
+
40
+ Returns `null` when the input is not a valid workflow name.
41
+
42
+ ## Example: List Runs with Display Names
43
+
44
+ ```typescript lineNumbers
45
+ import { getWorld } from "workflow/runtime";
46
+ import { parseWorkflowName } from "workflow/observability"; // [!code highlight]
47
+
48
+ const world = await getWorld();
49
+ const runs = await world.runs.list({ resolveData: "none" });
50
+
51
+ for (const run of runs.data) {
52
+ const parsed = parseWorkflowName(run.workflowName); // [!code highlight]
53
+ console.log(`${parsed?.shortName ?? run.workflowName}: ${run.status}`);
54
+ }
55
+ ```
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: createWorld
3
+ description: Create a new World instance from environment configuration.
4
+ type: reference
5
+ summary: Use createWorld to instantiate a World from WORKFLOW_TARGET_WORLD environment configuration, bypassing the cached instance.
6
+ prerequisites:
7
+ - /docs/api-reference/workflow-runtime/get-world
8
+ related:
9
+ - /docs/api-reference/workflow-runtime/set-world
10
+ ---
11
+
12
+ Creates a new [World](/docs/api-reference/workflow-runtime/world) instance based on environment configuration. The `WORKFLOW_TARGET_WORLD` environment variable determines which World implementation is instantiated (for example the local development World or the Vercel production World).
13
+
14
+ Unlike [`getWorld()`](/docs/api-reference/workflow-runtime/get-world), which caches a singleton instance, `createWorld()` constructs a fresh instance on every call. Application code should almost always use `getWorld()` — `createWorld()` is for infrastructure code that manages World lifecycles itself.
15
+
16
+ ```typescript lineNumbers
17
+ import { createWorld } from "workflow/runtime";
18
+
19
+ const world = await createWorld(); // [!code highlight]
20
+ ```
21
+
22
+ ## API Signature
23
+
24
+ ### Parameters
25
+
26
+ This function does not accept any parameters. Configuration is read from environment variables.
27
+
28
+ ### Returns
29
+
30
+ Returns a `Promise<World>` with a newly constructed World instance.
31
+
32
+ <Callout type="info">
33
+ Tooling that needs to construct a World with explicit (non-environment) configuration should instantiate the specific World implementation directly and register it with [`setWorld()`](/docs/api-reference/workflow-runtime/set-world).
34
+ </Callout>
35
+
36
+ ## Related Functions
37
+
38
+ - [`getWorld()`](/docs/api-reference/workflow-runtime/get-world) - Resolve the cached World instance (preferred in application code).
39
+ - [`setWorld()`](/docs/api-reference/workflow-runtime/set-world) - Override the cached World instance.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: getWorldHandlers
3
+ description: Build-time-safe access to the World's queue handlers without binding to runtime environment variables.
4
+ type: reference
5
+ summary: Use getWorldHandlers at build time to access queue handler creation without caching an environment-bound World.
6
+ prerequisites:
7
+ - /docs/api-reference/workflow-runtime/get-world
8
+ ---
9
+
10
+ Returns a restricted view of the [World](/docs/api-reference/workflow-runtime/world) exposing only the members that are safe to use at build time: `createQueueHandler` and `specVersion`. Framework adapters use it while generating workflow route handlers, before the deployment's runtime environment variables exist.
11
+
12
+ Unlike [`getWorld()`](/docs/api-reference/workflow-runtime/get-world), this function does not cache a fully configured World instance — caching at build time would lock in incomplete environment configuration.
13
+
14
+ ```typescript lineNumbers
15
+ import { getWorldHandlers } from "workflow/runtime";
16
+
17
+ const handlers = await getWorldHandlers(); // [!code highlight]
18
+ console.log(handlers.specVersion);
19
+ ```
20
+
21
+ ## API Signature
22
+
23
+ ### Parameters
24
+
25
+ This function does not accept any parameters.
26
+
27
+ ### Returns
28
+
29
+ Returns a `Promise<WorldHandlers>`, where:
30
+
31
+ ```typescript
32
+ import type { World } from "@workflow/world";
33
+
34
+ type WorldHandlers = Pick<World, "createQueueHandler" | "specVersion">;
35
+ ```
36
+
37
+ <Callout type="warn">
38
+ This is SDK infrastructure used by framework adapters and the workflow entrypoint. Application code should use [`getWorld()`](/docs/api-reference/workflow-runtime/get-world) instead.
39
+ </Callout>
40
+
41
+ ## Related Functions
42
+
43
+ - [`getWorld()`](/docs/api-reference/workflow-runtime/get-world) - Resolve the full World instance at runtime.
44
+ - [`workflowEntrypoint()`](/docs/api-reference/workflow-runtime/workflow-entrypoint) - The route handler factory built on these handlers.
@@ -36,21 +36,18 @@ showSections={["returns"]}
36
36
 
37
37
  ## World SDK
38
38
 
39
- The World object provides access to several entity interfaces. See the [World SDK](/docs/api-reference/workflow-api/world) reference for complete documentation:
39
+ The World object provides access to several entity interfaces. See the [World SDK](/docs/api-reference/workflow-runtime/world) reference for complete documentation:
40
40
 
41
41
  <Cards>
42
- <Card href="/docs/api-reference/workflow-api/world/storage" title="Storage">
42
+ <Card href="/docs/api-reference/workflow-runtime/world/storage" title="Storage">
43
43
  Query runs, steps, hooks, and the underlying event log.
44
44
  </Card>
45
- <Card href="/docs/api-reference/workflow-api/world/streams" title="Streams">
45
+ <Card href="/docs/api-reference/workflow-runtime/world/streams" title="Streams">
46
46
  Read, write, and manage data streams.
47
47
  </Card>
48
- <Card href="/docs/api-reference/workflow-api/world/queue" title="Queue">
48
+ <Card href="/docs/api-reference/workflow-runtime/world/queue" title="Queue">
49
49
  Low-level queue dispatch (internal SDK infrastructure).
50
50
  </Card>
51
- <Card href="/docs/api-reference/workflow-api/world/observability" title="Observability">
52
- Hydrate step I/O, parse display names, decrypt data.
53
- </Card>
54
51
  </Cards>
55
52
 
56
53
  ## Data Hydration
@@ -64,7 +61,7 @@ const step = await world.steps.get(runId, stepId);
64
61
  const hydrated = hydrateResourceIO(step, observabilityRevivers); // [!code highlight]
65
62
  ```
66
63
 
67
- See [Observability Utilities](/docs/api-reference/workflow-api/world/observability) for the full hydration, parsing, and encryption API.
64
+ See [`workflow/observability`](/docs/api-reference/workflow-observability) for the full hydration and parsing API.
68
65
 
69
66
  ### List Workflow Runs (Display Names)
70
67
 
@@ -72,7 +69,7 @@ List workflow runs and derive human-readable names from the `workflowName` field
72
69
 
73
70
  ```typescript lineNumbers
74
71
  import { getWorld } from "workflow/runtime";
75
- import { parseWorkflowName } from "@workflow/utils/parse-name"; // [!code highlight]
72
+ import { parseWorkflowName } from "workflow/observability"; // [!code highlight]
76
73
 
77
74
  export async function GET(req: Request) {
78
75
  const url = new URL(req.url);
@@ -113,7 +110,7 @@ export async function GET(req: Request) {
113
110
 
114
111
  <Callout type="info">
115
112
  The `workflowName` field contains a machine-readable identifier like `workflow//./src/workflows/order//processOrder`.
116
- Use `parseWorkflowName()` from `@workflow/utils/parse-name` to extract the `shortName` (e.g., `"processOrder"`)
113
+ Use [`parseWorkflowName()`](/docs/api-reference/workflow-observability/parse-workflow-name) to extract the `shortName` (e.g., `"processOrder"`)
117
114
  and `moduleSpecifier` for display in your UI.
118
115
  </Callout>
119
116
 
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: healthCheck
3
+ description: Verify a deployment's workflow infrastructure by sending a message through the queue pipeline.
4
+ type: reference
5
+ summary: Use healthCheck to verify the workflow endpoint of a deployment processes queue messages end-to-end.
6
+ prerequisites:
7
+ - /docs/api-reference/workflow-runtime/get-world
8
+ ---
9
+
10
+ Performs an end-to-end health check of a deployment's workflow infrastructure by sending a message through the queue pipeline and verifying it is processed by the workflow endpoint. Because it goes through the queue rather than direct HTTP, it works even when the deployment is behind Deployment Protection on Vercel.
11
+
12
+ ```typescript lineNumbers
13
+ import { getWorld, healthCheck } from "workflow/runtime";
14
+
15
+ const world = await getWorld();
16
+ const result = await healthCheck(world, "workflow"); // [!code highlight]
17
+
18
+ if (!result.healthy) {
19
+ console.error("Workflow infrastructure unhealthy:", result.error);
20
+ }
21
+ ```
22
+
23
+ ## API Signature
24
+
25
+ ### Parameters
26
+
27
+ | Parameter | Type | Description |
28
+ |-----------|------|-------------|
29
+ | `world` | `World` | The World instance to send the health check through |
30
+ | `endpoint` | `"workflow" \| "step"` | Which endpoint to check |
31
+ | `options` | `HealthCheckOptions & { namespace?: string }` | Optional configuration |
32
+
33
+ Where `HealthCheckOptions` is:
34
+
35
+ | Option | Type | Description |
36
+ |--------|------|-------------|
37
+ | `timeout` | `number` | Milliseconds to wait for the health check response. Default: `30000`. |
38
+ | `deploymentId` | `string` | Deployment to target. Falls back to `process.env.VERCEL_DEPLOYMENT_ID`. |
39
+
40
+ ### Returns
41
+
42
+ Returns a `Promise<HealthCheckResult>`:
43
+
44
+ | Property | Type | Description |
45
+ |----------|------|-------------|
46
+ | `healthy` | `boolean` | Whether the endpoint processed the health check message |
47
+ | `error` | `string \| undefined` | Error message when the check failed |
48
+ | `latencyMs` | `number \| undefined` | Round-trip latency when the check succeeded |
49
+ | `specVersion` | `number \| undefined` | Workflow spec version of the responding deployment |
50
+ | `workflowCoreVersion` | `string \| undefined` | `@workflow/core` version of the responding deployment |