@workflow/core 4.2.0-beta.73 → 4.2.0-beta.75

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.
@@ -0,0 +1,406 @@
1
+ /**
2
+ * Polyfill for the TC39 Uint8Array base64/hex proposal (Stage 4).
3
+ *
4
+ * Implements:
5
+ * - Uint8Array.prototype.toBase64([options])
6
+ * - Uint8Array.prototype.toHex()
7
+ * - Uint8Array.fromBase64(string[, options])
8
+ * - Uint8Array.fromHex(string)
9
+ * - Uint8Array.prototype.setFromBase64(string[, options])
10
+ * - Uint8Array.prototype.setFromHex(string)
11
+ *
12
+ * @see https://tc39.es/proposal-arraybuffer-base64/spec/
13
+ */
14
+ // Standard base64 alphabet
15
+ const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
16
+ // Reverse lookup table: char code -> index (for standard base64 alphabet)
17
+ const BASE64_LOOKUP = new Uint8Array(128).fill(255);
18
+ for (let i = 0; i < BASE64_CHARS.length; i++) {
19
+ BASE64_LOOKUP[BASE64_CHARS.charCodeAt(i)] = i;
20
+ }
21
+ // ASCII whitespace characters per spec: TAB, LF, FF, CR, SPACE
22
+ function isAsciiWhitespace(code) {
23
+ return (code === 0x09 ||
24
+ code === 0x0a ||
25
+ code === 0x0c ||
26
+ code === 0x0d ||
27
+ code === 0x20);
28
+ }
29
+ function skipAsciiWhitespace(str, index) {
30
+ while (index < str.length && isAsciiWhitespace(str.charCodeAt(index))) {
31
+ index++;
32
+ }
33
+ return index;
34
+ }
35
+ function decodeBase64Chunk(chunk, throwOnExtraBits) {
36
+ const chunkLength = chunk.length;
37
+ let padded = chunk;
38
+ if (chunkLength === 2) {
39
+ padded = chunk + 'AA';
40
+ }
41
+ else if (chunkLength === 3) {
42
+ padded = chunk + 'A';
43
+ }
44
+ // Decode 4 base64 chars to 3 bytes
45
+ const b0 = BASE64_LOOKUP[padded.charCodeAt(0)];
46
+ const b1 = BASE64_LOOKUP[padded.charCodeAt(1)];
47
+ const b2 = BASE64_LOOKUP[padded.charCodeAt(2)];
48
+ const b3 = BASE64_LOOKUP[padded.charCodeAt(3)];
49
+ const byte0 = (b0 << 2) | (b1 >> 4);
50
+ const byte1 = ((b1 & 0x0f) << 4) | (b2 >> 2);
51
+ const byte2 = ((b2 & 0x03) << 6) | b3;
52
+ if (chunkLength === 2) {
53
+ if (throwOnExtraBits && byte1 !== 0) {
54
+ throw new SyntaxError('Extra bits in base64 chunk');
55
+ }
56
+ return [byte0];
57
+ }
58
+ if (chunkLength === 3) {
59
+ if (throwOnExtraBits && byte2 !== 0) {
60
+ throw new SyntaxError('Extra bits in base64 chunk');
61
+ }
62
+ return [byte0, byte1];
63
+ }
64
+ return [byte0, byte1, byte2];
65
+ }
66
+ function fromBase64(str, alphabet, lastChunkHandling, maxLength) {
67
+ if (maxLength === undefined) {
68
+ maxLength = Number.MAX_SAFE_INTEGER;
69
+ }
70
+ if (maxLength === 0) {
71
+ return { read: 0, bytes: [], error: null };
72
+ }
73
+ let read = 0;
74
+ const bytes = [];
75
+ let chunk = '';
76
+ let chunkLength = 0;
77
+ let index = 0;
78
+ const length = str.length;
79
+ while (true) {
80
+ index = skipAsciiWhitespace(str, index);
81
+ if (index === length) {
82
+ if (chunkLength > 0) {
83
+ if (lastChunkHandling === 'stop-before-partial') {
84
+ return { read, bytes, error: null };
85
+ }
86
+ if (lastChunkHandling === 'loose') {
87
+ if (chunkLength === 1) {
88
+ return {
89
+ read,
90
+ bytes,
91
+ error: new SyntaxError('Invalid base64: lone character in final chunk'),
92
+ };
93
+ }
94
+ bytes.push(...decodeBase64Chunk(chunk, false));
95
+ }
96
+ else {
97
+ // strict
98
+ return {
99
+ read,
100
+ bytes,
101
+ error: new SyntaxError('Invalid base64: incomplete chunk in strict mode'),
102
+ };
103
+ }
104
+ }
105
+ return { read: length, bytes, error: null };
106
+ }
107
+ let char = str[index];
108
+ index++;
109
+ if (char === '=') {
110
+ if (chunkLength < 2) {
111
+ return {
112
+ read,
113
+ bytes,
114
+ error: new SyntaxError('Invalid base64: padding in unexpected place'),
115
+ };
116
+ }
117
+ index = skipAsciiWhitespace(str, index);
118
+ if (chunkLength === 2) {
119
+ if (index === length) {
120
+ if (lastChunkHandling === 'stop-before-partial') {
121
+ return { read, bytes, error: null };
122
+ }
123
+ return {
124
+ read,
125
+ bytes,
126
+ error: new SyntaxError('Invalid base64: missing second padding character'),
127
+ };
128
+ }
129
+ char = str[index];
130
+ if (char === '=') {
131
+ index = skipAsciiWhitespace(str, index + 1);
132
+ }
133
+ }
134
+ if (index < length) {
135
+ return {
136
+ read,
137
+ bytes,
138
+ error: new SyntaxError('Invalid base64: unexpected characters after padding'),
139
+ };
140
+ }
141
+ const throwOnExtraBits = lastChunkHandling === 'strict';
142
+ try {
143
+ bytes.push(...decodeBase64Chunk(chunk, throwOnExtraBits));
144
+ }
145
+ catch (e) {
146
+ return { read, bytes, error: e };
147
+ }
148
+ return { read: length, bytes, error: null };
149
+ }
150
+ if (alphabet === 'base64url') {
151
+ if (char === '+' || char === '/') {
152
+ return {
153
+ read,
154
+ bytes,
155
+ error: new SyntaxError(`Invalid base64url: unexpected character '${char}'`),
156
+ };
157
+ }
158
+ if (char === '-') {
159
+ char = '+';
160
+ }
161
+ else if (char === '_') {
162
+ char = '/';
163
+ }
164
+ }
165
+ // Validate character is in the standard base64 alphabet
166
+ const code = char.charCodeAt(0);
167
+ if (code >= 128 || BASE64_LOOKUP[code] === 255) {
168
+ return {
169
+ read,
170
+ bytes,
171
+ error: new SyntaxError(`Invalid base64: unexpected character '${str[index - 1]}'`),
172
+ };
173
+ }
174
+ // Check if adding this character would exceed maxLength
175
+ const remaining = maxLength - bytes.length;
176
+ if ((remaining === 1 && chunkLength === 2) ||
177
+ (remaining === 2 && chunkLength === 3)) {
178
+ return { read, bytes, error: null };
179
+ }
180
+ chunk += char;
181
+ chunkLength = chunk.length;
182
+ if (chunkLength === 4) {
183
+ bytes.push(...decodeBase64Chunk(chunk));
184
+ chunk = '';
185
+ chunkLength = 0;
186
+ read = index;
187
+ if (bytes.length === maxLength) {
188
+ return { read, bytes, error: null };
189
+ }
190
+ }
191
+ }
192
+ }
193
+ function fromHex(str, maxLength) {
194
+ if (maxLength === undefined) {
195
+ maxLength = Number.MAX_SAFE_INTEGER;
196
+ }
197
+ const length = str.length;
198
+ const bytes = [];
199
+ let read = 0;
200
+ if (length % 2 !== 0) {
201
+ return {
202
+ read: 0,
203
+ bytes: [],
204
+ error: new SyntaxError('Invalid hex: string length must be even'),
205
+ };
206
+ }
207
+ while (read < length && bytes.length < maxLength) {
208
+ const hexits = str.substring(read, read + 2);
209
+ if (!/^[0-9a-fA-F]{2}$/.test(hexits)) {
210
+ return {
211
+ read,
212
+ bytes,
213
+ error: new SyntaxError(`Invalid hex: unexpected character at position ${read}`),
214
+ };
215
+ }
216
+ read += 2;
217
+ bytes.push(Number.parseInt(hexits, 16));
218
+ }
219
+ return { read, bytes, error: null };
220
+ }
221
+ function toBase64(uint8, options) {
222
+ const alphabet = options?.alphabet ?? 'base64';
223
+ if (alphabet !== 'base64' && alphabet !== 'base64url') {
224
+ throw new TypeError(`Invalid alphabet: expected "base64" or "base64url", got "${alphabet}"`);
225
+ }
226
+ const omitPadding = Boolean(options?.omitPadding);
227
+ let result = '';
228
+ const len = uint8.length;
229
+ for (let i = 0; i < len; i += 3) {
230
+ const b0 = uint8[i];
231
+ const b1 = i + 1 < len ? uint8[i + 1] : 0;
232
+ const b2 = i + 2 < len ? uint8[i + 2] : 0;
233
+ result += BASE64_CHARS[(b0 >> 2) & 0x3f];
234
+ result += BASE64_CHARS[((b0 & 0x03) << 4) | ((b1 >> 4) & 0x0f)];
235
+ if (i + 1 < len) {
236
+ result += BASE64_CHARS[((b1 & 0x0f) << 2) | ((b2 >> 6) & 0x03)];
237
+ }
238
+ else if (!omitPadding) {
239
+ result += '=';
240
+ }
241
+ if (i + 2 < len) {
242
+ result += BASE64_CHARS[b2 & 0x3f];
243
+ }
244
+ else if (!omitPadding) {
245
+ result += '=';
246
+ }
247
+ }
248
+ if (alphabet === 'base64url') {
249
+ result = result.replace(/\+/g, '-').replace(/\//g, '_');
250
+ }
251
+ return result;
252
+ }
253
+ function toHex(uint8) {
254
+ let out = '';
255
+ for (let i = 0; i < uint8.length; i++) {
256
+ out += uint8[i].toString(16).padStart(2, '0');
257
+ }
258
+ return out;
259
+ }
260
+ /**
261
+ * Installs the Uint8Array base64/hex polyfill onto the given
262
+ * Uint8Array constructor and prototype. This is designed to be
263
+ * used inside the workflow VM context, operating on the VM's
264
+ * own Uint8Array rather than the host's.
265
+ */
266
+ export function installUint8ArrayBase64(Uint8ArrayCtor) {
267
+ const proto = Uint8ArrayCtor.prototype;
268
+ const ctor = Uint8ArrayCtor;
269
+ // Uint8Array.prototype.toBase64([options])
270
+ if (!proto.toBase64) {
271
+ Object.defineProperty(proto, 'toBase64', {
272
+ value: function toBase64Method(options) {
273
+ if (!(this instanceof Uint8ArrayCtor)) {
274
+ throw new TypeError('this is not a Uint8Array');
275
+ }
276
+ return toBase64(this, options);
277
+ },
278
+ writable: true,
279
+ enumerable: false,
280
+ configurable: true,
281
+ });
282
+ }
283
+ // Uint8Array.prototype.toHex()
284
+ if (!proto.toHex) {
285
+ Object.defineProperty(proto, 'toHex', {
286
+ value: function toHexMethod() {
287
+ if (!(this instanceof Uint8ArrayCtor)) {
288
+ throw new TypeError('this is not a Uint8Array');
289
+ }
290
+ return toHex(this);
291
+ },
292
+ writable: true,
293
+ enumerable: false,
294
+ configurable: true,
295
+ });
296
+ }
297
+ // Uint8Array.prototype.setFromBase64(string[, options])
298
+ if (!proto.setFromBase64) {
299
+ Object.defineProperty(proto, 'setFromBase64', {
300
+ value: function setFromBase64Method(str, options) {
301
+ if (!(this instanceof Uint8ArrayCtor)) {
302
+ throw new TypeError('this is not a Uint8Array');
303
+ }
304
+ if (typeof str !== 'string') {
305
+ throw new TypeError('expected a string');
306
+ }
307
+ const alphabet = options?.alphabet ?? 'base64';
308
+ if (alphabet !== 'base64' && alphabet !== 'base64url') {
309
+ throw new TypeError(`Invalid alphabet: expected "base64" or "base64url", got "${alphabet}"`);
310
+ }
311
+ const lastChunkHandling = options?.lastChunkHandling ?? 'loose';
312
+ if (lastChunkHandling !== 'loose' &&
313
+ lastChunkHandling !== 'strict' &&
314
+ lastChunkHandling !== 'stop-before-partial') {
315
+ throw new TypeError(`Invalid lastChunkHandling: expected "loose", "strict", or "stop-before-partial", got "${lastChunkHandling}"`);
316
+ }
317
+ const result = fromBase64(str, alphabet, lastChunkHandling, this.length);
318
+ const bytes = result.bytes;
319
+ const written = bytes.length;
320
+ for (let i = 0; i < written; i++) {
321
+ this[i] = bytes[i];
322
+ }
323
+ if (result.error) {
324
+ throw result.error;
325
+ }
326
+ return { read: result.read, written };
327
+ },
328
+ writable: true,
329
+ enumerable: false,
330
+ configurable: true,
331
+ });
332
+ }
333
+ // Uint8Array.prototype.setFromHex(string)
334
+ if (!proto.setFromHex) {
335
+ Object.defineProperty(proto, 'setFromHex', {
336
+ value: function setFromHexMethod(str) {
337
+ if (!(this instanceof Uint8ArrayCtor)) {
338
+ throw new TypeError('this is not a Uint8Array');
339
+ }
340
+ if (typeof str !== 'string') {
341
+ throw new TypeError('expected a string');
342
+ }
343
+ const result = fromHex(str, this.length);
344
+ const bytes = result.bytes;
345
+ const written = bytes.length;
346
+ for (let i = 0; i < written; i++) {
347
+ this[i] = bytes[i];
348
+ }
349
+ if (result.error) {
350
+ throw result.error;
351
+ }
352
+ return { read: result.read, written };
353
+ },
354
+ writable: true,
355
+ enumerable: false,
356
+ configurable: true,
357
+ });
358
+ }
359
+ // Uint8Array.fromBase64(string[, options])
360
+ if (!ctor.fromBase64) {
361
+ Object.defineProperty(Uint8ArrayCtor, 'fromBase64', {
362
+ value: function fromBase64Static(str, options) {
363
+ if (typeof str !== 'string') {
364
+ throw new TypeError('expected a string');
365
+ }
366
+ const alphabet = options?.alphabet ?? 'base64';
367
+ if (alphabet !== 'base64' && alphabet !== 'base64url') {
368
+ throw new TypeError(`Invalid alphabet: expected "base64" or "base64url", got "${alphabet}"`);
369
+ }
370
+ const lastChunkHandling = options?.lastChunkHandling ?? 'loose';
371
+ if (lastChunkHandling !== 'loose' &&
372
+ lastChunkHandling !== 'strict' &&
373
+ lastChunkHandling !== 'stop-before-partial') {
374
+ throw new TypeError(`Invalid lastChunkHandling: expected "loose", "strict", or "stop-before-partial", got "${lastChunkHandling}"`);
375
+ }
376
+ const result = fromBase64(str, alphabet, lastChunkHandling);
377
+ if (result.error) {
378
+ throw result.error;
379
+ }
380
+ return new Uint8ArrayCtor(result.bytes);
381
+ },
382
+ writable: true,
383
+ enumerable: false,
384
+ configurable: true,
385
+ });
386
+ }
387
+ // Uint8Array.fromHex(string)
388
+ if (!ctor.fromHex) {
389
+ Object.defineProperty(Uint8ArrayCtor, 'fromHex', {
390
+ value: function fromHexStatic(str) {
391
+ if (typeof str !== 'string') {
392
+ throw new TypeError('expected a string');
393
+ }
394
+ const result = fromHex(str);
395
+ if (result.error) {
396
+ throw result.error;
397
+ }
398
+ return new Uint8ArrayCtor(result.bytes);
399
+ },
400
+ writable: true,
401
+ enumerable: false,
402
+ configurable: true,
403
+ });
404
+ }
405
+ }
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWludDhhcnJheS1iYXNlNjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdm0vdWludDhhcnJheS1iYXNlNjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBeUNILDJCQUEyQjtBQUMzQixNQUFNLFlBQVksR0FDaEIsa0VBQWtFLENBQUM7QUFFckUsMEVBQTBFO0FBQzFFLE1BQU0sYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzdDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sQ0FDTCxJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJO1FBQ2IsSUFBSSxLQUFLLElBQUk7UUFDYixJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJLENBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ3JELE9BQU8sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEUsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYSxFQUNiLGdCQUEwQjtJQUUxQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lB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
@@ -13,6 +13,10 @@ Creates a webhook that can be used to suspend and resume a workflow run upon rec
13
13
 
14
14
  Webhooks provide a way for external systems to send HTTP requests directly to your workflow. Unlike hooks which accept arbitrary payloads, webhooks work with standard HTTP `Request` objects and can return HTTP `Response` objects.
15
15
 
16
+ <Callout type="warn">
17
+ `createWebhook()` creates a public endpoint at `/.well-known/workflow/v1/webhook/:token`, and the token in that URL is the only authorization performed for incoming requests resuming that webhook. This is convenient for prototypes and simple resume links because it avoids creating another route, but if you need stronger security, prefer [`createHook()`](/docs/api-reference/workflow/create-hook) behind your own route and authorize the request before calling [`resumeHook()`](/docs/api-reference/workflow-api/resume-hook) to avoid unauthenticated workflow resumptions.
18
+ </Callout>
19
+
16
20
  ```ts lineNumbers
17
21
  import { createWebhook } from "workflow"
18
22
 
@@ -20,7 +20,7 @@ npm i workflow
20
20
 
21
21
  ## Functions
22
22
 
23
- Workflow DevKit contains the following functions you can use inside your workflow functions:
23
+ Workflow SDK contains the following functions you can use inside your workflow functions:
24
24
 
25
25
  <Cards>
26
26
  <Card href="/docs/api-reference/workflow/get-workflow-metadata" title="getWorkflowMetadata()">
@@ -51,7 +51,7 @@ Workflow DevKit contains the following functions you can use inside your workflo
51
51
 
52
52
  ## Error Classes
53
53
 
54
- Workflow DevKit includes error classes that can be thrown in a workflow or step to change the error exit strategy of a workflow.
54
+ Workflow SDK includes error classes that can be thrown in a workflow or step to change the error exit strategy of a workflow.
55
55
 
56
56
  <Cards>
57
57
  <Card href="/docs/api-reference/workflow/fatal-error" title="FatalError()">
@@ -10,7 +10,7 @@ related:
10
10
  - /docs/api-reference/workflow/retryable-error
11
11
  ---
12
12
 
13
- By default, errors thrown inside steps are retried. Additionally, Workflow DevKit provides two new types of errors you can use to customize retries.
13
+ By default, errors thrown inside steps are retried. Additionally, Workflow SDK provides two new types of errors you can use to customize retries.
14
14
 
15
15
  ## Default Retrying
16
16
 
@@ -219,7 +219,11 @@ While hooks are powerful, they require you to manually handle HTTP requests and
219
219
  2. Provides an automatically addressable `url` property pointing to the generated webhook endpoint
220
220
  3. Handles sending HTTP [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) objects back to the caller
221
221
 
222
- When using Workflow DevKit, webhooks are automatically wired up at `/.well-known/workflow/v1/webhook/:token` without any additional setup.
222
+ When using Workflow SDK, webhooks are automatically wired up at `/.well-known/workflow/v1/webhook/:token` without any additional setup.
223
+
224
+ <Callout type="warn">
225
+ `createWebhook()` exposes a public route at `/.well-known/workflow/v1/webhook/:token`, and the token in that URL is the only authorization performed for incoming requests. This is convenient for prototypes and a simple developer experience because you can share the webhook URL (endpoint) without creating another route, but if you need stronger security, prefer [`createHook()`](/docs/api-reference/workflow/create-hook) behind your own route and authorize the request before calling [`resumeHook()`](/docs/api-reference/workflow-api/resume-hook) to avoid unauthenticated workflow resumptions.
226
+ </Callout>
223
227
 
224
228
  <Callout type="info">
225
229
  See the full API reference for [`createWebhook()`](/docs/api-reference/workflow/create-webhook) for all available options.
@@ -9,7 +9,7 @@ related:
9
9
  - /docs/errors/serialization-failed
10
10
  ---
11
11
 
12
- All function arguments and return values passed between workflow and step functions must be serializable. Workflow DevKit uses a custom serialization system built on top of [devalue](https://github.com/sveltejs/devalue). This system supports standard JSON types, as well as a few additional popular Web API types.
12
+ All function arguments and return values passed between workflow and step functions must be serializable. Workflow SDK uses a custom serialization system built on top of [devalue](https://github.com/sveltejs/devalue). This system supports standard JSON types, as well as a few additional popular Web API types.
13
13
 
14
14
  <Callout type="info">
15
15
  The serialization system ensures that all data persists correctly across workflow suspensions and resumptions, enabling durable execution.
@@ -98,7 +98,7 @@ export async function handleWebhookWorkflow() {
98
98
 
99
99
  ### Using `fetch` in Workflows
100
100
 
101
- Because `Request` and `Response` are serializable, Workflow DevKit provides a `fetch` function that can be used directly in workflow functions:
101
+ Because `Request` and `Response` are serializable, Workflow SDK provides a `fetch` function that can be used directly in workflow functions:
102
102
 
103
103
  ```typescript title="workflows/api-call.ts" lineNumbers
104
104
  import { fetch } from "workflow"; // [!code highlight]
@@ -105,7 +105,7 @@ Because streams are live and continue receiving chunks, negative `startIndex` va
105
105
 
106
106
  ## Streams as Data Types
107
107
 
108
- [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) and [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream) are standard Web Streams API types that Workflow DevKit makes serializable. These are not custom types - they follow the web standard - but Workflow DevKit adds the ability to pass them between functions while maintaining their streaming capabilities.
108
+ [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) and [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream) are standard Web Streams API types that Workflow SDK makes serializable. These are not custom types - they follow the web standard - but Workflow SDK adds the ability to pass them between functions while maintaining their streaming capabilities.
109
109
 
110
110
  Unlike regular values that are fully serialized to the [event log](/docs/how-it-works/event-sourcing), streams maintain their streaming capabilities when passed between functions.
111
111
 
@@ -117,7 +117,7 @@ Unlike regular values that are fully serialized to the [event log](/docs/how-it-
117
117
  <Callout type="info">
118
118
  **How Streams Persist Across Workflow Suspensions**
119
119
 
120
- Streams in Workflow DevKit are backed by persistent, resumable storage provided by the "world" implementation. This is what enables streams to maintain their state even when workflows suspend and resume:
120
+ Streams in Workflow SDK are backed by persistent, resumable storage provided by the "world" implementation. This is what enables streams to maintain their state even when workflows suspend and resume:
121
121
 
122
122
  - **Vercel deployments**: Streams are backed by a performant Redis-based stream
123
123
  - **Local development**: Stream chunks are stored in the filesystem
@@ -593,6 +593,7 @@ Stream errors don't trigger automatic retries for the producer step. Design your
593
593
  - [`sleep()` API Reference](/docs/api-reference/workflow/sleep) - Pause workflow execution for a duration
594
594
  - [`start()` API Reference](/docs/api-reference/workflow-api/start) - Start workflows and access the `Run` object
595
595
  - [`getRun()` API Reference](/docs/api-reference/workflow-api/get-run) - Retrieve runs and their streams later
596
+ - [world.streams](/docs/api-reference/workflow-api/world/streams) - Low-level stream read/write/close via World SDK
596
597
  - [DurableAgent](/docs/api-reference/workflow-ai/durable-agent) - AI agents with built-in streaming support
597
598
  - [Errors and Retries](/docs/foundations/errors-and-retries) - Understanding error handling and retry behavior
598
599
  - [Serialization](/docs/foundations/serialization) - Understanding what data types can be passed in workflows
@@ -43,7 +43,7 @@ export async function processOrderWorkflow(orderId: string) {
43
43
 
44
44
  **Key Characteristics:**
45
45
 
46
- - Runs in a sandboxed environment without full Node.js access
46
+ - Runs in a sandboxed environment without full Node.js access (see [Workflow Globals](/docs/api-reference/workflow-globals) for what's available)
47
47
  - All step results are persisted to the [event log](/docs/how-it-works/event-sourcing)
48
48
  - Must be **deterministic** to allow resuming after failures
49
49
 
@@ -203,5 +203,5 @@ While you can organize workflow and step functions however you like, we find tha
203
203
  You can choose to organize your steps into a single `steps.ts` file or separate files within a `steps` folder. The `shared` folder is a good place to put common steps that are used by multiple workflows.
204
204
 
205
205
  <Callout type="info">
206
- Splitting up steps and workflows will also help avoid most bundler related bugs with the Workflow DevKit.
206
+ Splitting up steps and workflows will also help avoid most bundler related bugs with the Workflow SDK.
207
207
  </Callout>
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: How the Directives Work
3
- description: Deep dive into the internals of how Workflow DevKit directives transform your code.
3
+ description: Deep dive into the internals of how Workflow SDK directives transform your code.
4
4
  type: conceptual
5
5
  summary: Learn how the compiler transforms directive-annotated code into three execution modes.
6
6
  prerequisites:
@@ -10,10 +10,10 @@ related:
10
10
  ---
11
11
 
12
12
  <Callout>
13
- This is an advanced guide that dives into internals of the Workflow DevKit directive and is not required reading to use workflows. To simply use the Workflow DevKit, check out the [getting started](/docs/getting-started) guides for your framework.
13
+ This is an advanced guide that dives into internals of the Workflow SDK directive and is not required reading to use workflows. To simply use the Workflow SDK, check out the [getting started](/docs/getting-started) guides for your framework.
14
14
  </Callout>
15
15
 
16
- Workflows use special directives to mark code for transformation by the Workflow DevKit compiler. This page explains how `"use workflow"` and `"use step"` directives work, what transformations are applied, and why they're necessary for durable execution.
16
+ Workflows use special directives to mark code for transformation by the Workflow SDK compiler. This page explains how `"use workflow"` and `"use step"` directives work, what transformations are applied, and why they're necessary for durable execution.
17
17
 
18
18
  ## Directives Overview
19
19
 
@@ -210,7 +210,7 @@ The IDs are generated exactly like in workflow mode to ensure they can be direct
210
210
 
211
211
  ## Generated Files
212
212
 
213
- When you build your application, the Workflow DevKit generates three handler files in `.well-known/workflow/v1/`:
213
+ When you build your application, the Workflow SDK generates three handler files in `.well-known/workflow/v1/`:
214
214
 
215
215
  ### `flow.js`
216
216
 
@@ -268,7 +268,7 @@ Contains webhook handling logic for delivering external data to running workflow
268
268
 
269
269
  ## Why Three Modes?
270
270
 
271
- The multi-mode transformation enables the Workflow DevKit's durable execution model:
271
+ The multi-mode transformation enables the Workflow SDK's durable execution model:
272
272
 
273
273
  1. **Step Mode** (required) - Bundles executable step functions that can access the full runtime
274
274
  2. **Workflow Mode** (required) - Creates orchestration logic that can replay from event logs
@@ -320,7 +320,7 @@ The compiler generates stable IDs for workflows and steps based on file paths an
320
320
  - **Portable**: Works across different runtimes and deployments
321
321
 
322
322
  <Callout type="info">
323
- Although IDs can change when files are moved or functions are renamed, Workflow DevKit function assume atomic versioning in the World. This means changing IDs won't break old workflows from running, but will prevent run from being upgraded and will cause your workflow/step names to change in the observability across deployments.
323
+ Although IDs can change when files are moved or functions are renamed, Workflow SDK function assume atomic versioning in the World. This means changing IDs won't break old workflows from running, but will prevent run from being upgraded and will cause your workflow/step names to change in the observability across deployments.
324
324
  </Callout>
325
325
 
326
326
  ## Framework Integration
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Encryption
3
- description: Learn how Workflow DevKit encrypts user data end-to-end in the event log.
3
+ description: Learn how Workflow SDK encrypts user data end-to-end in the event log.
4
4
  type: conceptual
5
5
  summary: Understand how workflow and step data is encrypted at rest.
6
6
  prerequisites:
@@ -11,10 +11,10 @@ related:
11
11
  ---
12
12
 
13
13
  <Callout>
14
- This guide explains how Workflow DevKit encrypts user data in the event log. Understanding these details is not required to use workflows — encryption is automatic and requires no code changes. For getting started, see the [getting started](/docs/getting-started) guides for your framework.
14
+ This guide explains how Workflow SDK encrypts user data in the event log. Understanding these details is not required to use workflows — encryption is automatic and requires no code changes. For getting started, see the [getting started](/docs/getting-started) guides for your framework.
15
15
  </Callout>
16
16
 
17
- Workflow DevKit supports automatic end-to-end encryption of all user data before it is written to the event log. When a `World` implementation provides encryption support, it is safe to pass sensitive data — such as API keys, tokens, or user credentials — as workflow inputs, step arguments, and return values. The storage backend only ever sees ciphertext.
17
+ Workflow SDK supports automatic end-to-end encryption of all user data before it is written to the event log. When a `World` implementation provides encryption support, it is safe to pass sensitive data — such as API keys, tokens, or user credentials — as workflow inputs, step arguments, and return values. The storage backend only ever sees ciphertext.
18
18
 
19
19
  Encryption support varies by `World` implementation. See the [Worlds](/worlds) page to check which worlds support this feature. `World` implementations opt into encryption by providing a `getEncryptionKeyForRun()` method — the core runtime will use it automatically when present.
20
20