@workflow/world-local 4.0.1-beta.7 → 4.1.0-beta.29

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 (73) hide show
  1. package/dist/config.d.ts +15 -4
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +35 -9
  4. package/dist/config.js.map +1 -1
  5. package/dist/fs.d.ts +13 -0
  6. package/dist/fs.d.ts.map +1 -1
  7. package/dist/fs.js +108 -13
  8. package/dist/fs.js.map +1 -1
  9. package/dist/index.d.ts +10 -7
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +21 -9
  12. package/dist/index.js.map +1 -1
  13. package/dist/init.d.ts +91 -0
  14. package/dist/init.d.ts.map +1 -0
  15. package/dist/init.js +263 -0
  16. package/dist/init.js.map +1 -0
  17. package/dist/instrumentObject.d.ts +8 -0
  18. package/dist/instrumentObject.d.ts.map +1 -0
  19. package/dist/instrumentObject.js +66 -0
  20. package/dist/instrumentObject.js.map +1 -0
  21. package/dist/queue.d.ts +2 -1
  22. package/dist/queue.d.ts.map +1 -1
  23. package/dist/queue.js +84 -40
  24. package/dist/queue.js.map +1 -1
  25. package/dist/storage/events-storage.d.ts +7 -0
  26. package/dist/storage/events-storage.d.ts.map +1 -0
  27. package/dist/storage/events-storage.js +540 -0
  28. package/dist/storage/events-storage.js.map +1 -0
  29. package/dist/storage/filters.d.ts +26 -0
  30. package/dist/storage/filters.d.ts.map +1 -0
  31. package/dist/storage/filters.js +43 -0
  32. package/dist/storage/filters.js.map +1 -0
  33. package/dist/storage/helpers.d.ts +14 -0
  34. package/dist/storage/helpers.d.ts.map +1 -0
  35. package/dist/storage/helpers.js +34 -0
  36. package/dist/storage/helpers.js.map +1 -0
  37. package/dist/storage/hooks-storage.d.ts +12 -0
  38. package/dist/storage/hooks-storage.d.ts.map +1 -0
  39. package/dist/storage/hooks-storage.js +89 -0
  40. package/dist/storage/hooks-storage.js.map +1 -0
  41. package/dist/storage/index.d.ts +12 -0
  42. package/dist/storage/index.d.ts.map +1 -0
  43. package/dist/storage/index.js +32 -0
  44. package/dist/storage/index.js.map +1 -0
  45. package/dist/storage/legacy.d.ts +13 -0
  46. package/dist/storage/legacy.d.ts.map +1 -0
  47. package/dist/storage/legacy.js +73 -0
  48. package/dist/storage/legacy.js.map +1 -0
  49. package/dist/storage/runs-storage.d.ts +7 -0
  50. package/dist/storage/runs-storage.d.ts.map +1 -0
  51. package/dist/storage/runs-storage.js +59 -0
  52. package/dist/storage/runs-storage.js.map +1 -0
  53. package/dist/storage/steps-storage.d.ts +7 -0
  54. package/dist/storage/steps-storage.d.ts.map +1 -0
  55. package/dist/storage/steps-storage.js +58 -0
  56. package/dist/storage/steps-storage.js.map +1 -0
  57. package/dist/storage.d.ts +9 -2
  58. package/dist/storage.d.ts.map +1 -1
  59. package/dist/storage.js +8 -437
  60. package/dist/storage.js.map +1 -1
  61. package/dist/streamer.d.ts +1 -1
  62. package/dist/streamer.d.ts.map +1 -1
  63. package/dist/streamer.js +146 -22
  64. package/dist/streamer.js.map +1 -1
  65. package/dist/telemetry.d.ts +28 -0
  66. package/dist/telemetry.d.ts.map +1 -0
  67. package/dist/telemetry.js +71 -0
  68. package/dist/telemetry.js.map +1 -0
  69. package/dist/test-helpers.d.ts +43 -0
  70. package/dist/test-helpers.d.ts.map +1 -0
  71. package/dist/test-helpers.js +89 -0
  72. package/dist/test-helpers.js.map +1 -0
  73. package/package.json +10 -9
package/dist/streamer.js CHANGED
@@ -1,51 +1,138 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import path from 'node:path';
3
3
  import { monotonicFactory } from 'ulid';
4
- import { listJSONFiles, readBuffer, write } from './fs.js';
4
+ import { z } from 'zod';
5
+ import { listJSONFiles, readBuffer, readJSON, write, writeJSON } from './fs.js';
5
6
  // Create a monotonic ULID factory that ensures ULIDs are always increasing
6
7
  // even when generated within the same millisecond
7
8
  const monotonicUlid = monotonicFactory(() => Math.random());
9
+ // Schema for the run-to-streams mapping file
10
+ const RunStreamsSchema = z.object({
11
+ streams: z.array(z.string()),
12
+ });
8
13
  export function serializeChunk(chunk) {
9
14
  const eofByte = Buffer.from([chunk.eof ? 1 : 0]);
10
15
  return Buffer.concat([eofByte, chunk.chunk]);
11
16
  }
12
17
  export function deserializeChunk(serialized) {
13
18
  const eof = serialized[0] === 1;
14
- const chunk = serialized.subarray(1);
19
+ // Create a copy instead of a view to prevent ArrayBuffer detachment
20
+ const chunk = Buffer.from(serialized.subarray(1));
15
21
  return { eof, chunk };
16
22
  }
17
23
  export function createStreamer(basedir) {
18
24
  const streamEmitter = new EventEmitter();
25
+ // Track which streams have already been registered for a run (in-memory cache)
26
+ const registeredStreams = new Set();
27
+ // Helper to record the runId <> streamId association
28
+ async function registerStreamForRun(runId, streamName) {
29
+ const cacheKey = `${runId}:${streamName}`;
30
+ if (registeredStreams.has(cacheKey)) {
31
+ return; // Already registered in this session
32
+ }
33
+ const runStreamsPath = path.join(basedir, 'streams', 'runs', `${runId}.json`);
34
+ // Read existing streams for this run
35
+ const existing = await readJSON(runStreamsPath, RunStreamsSchema);
36
+ const streams = existing?.streams ?? [];
37
+ // Add stream if not already present
38
+ if (!streams.includes(streamName)) {
39
+ streams.push(streamName);
40
+ await writeJSON(runStreamsPath, { streams }, { overwrite: true });
41
+ }
42
+ registeredStreams.add(cacheKey);
43
+ }
44
+ // Helper to convert a chunk to a Buffer
45
+ function toBuffer(chunk) {
46
+ if (typeof chunk === 'string') {
47
+ return Buffer.from(new TextEncoder().encode(chunk));
48
+ }
49
+ else if (chunk instanceof Buffer) {
50
+ return chunk;
51
+ }
52
+ else {
53
+ return Buffer.from(chunk);
54
+ }
55
+ }
19
56
  return {
20
- async writeToStream(name, chunk) {
21
- const chunkId = `strm_${monotonicUlid()}`;
22
- if (typeof chunk === 'string') {
23
- chunk = new TextEncoder().encode(chunk);
24
- }
57
+ async writeToStream(name, _runId, chunk) {
58
+ // Generate ULID synchronously BEFORE any await to preserve call order.
59
+ // This ensures that chunks written in sequence maintain their order even
60
+ // when runId is a promise that multiple writes are waiting on.
61
+ const chunkId = `chnk_${monotonicUlid()}`;
62
+ // Await runId if it's a promise to ensure proper flushing
63
+ const runId = await _runId;
64
+ // Register this stream for the run
65
+ await registerStreamForRun(runId, name);
66
+ // Convert chunk to buffer for serialization
67
+ const chunkBuffer = toBuffer(chunk);
25
68
  const serialized = serializeChunk({
26
- chunk: Buffer.from(chunk),
69
+ chunk: chunkBuffer,
27
70
  eof: false,
28
71
  });
29
72
  const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
30
73
  await write(chunkPath, serialized);
31
- // Emit real-time event
32
- const chunkData = typeof chunk === 'string'
33
- ? new TextEncoder().encode(chunk)
34
- : chunk instanceof Buffer
35
- ? new Uint8Array(chunk)
36
- : chunk;
74
+ // Emit real-time event with Uint8Array (create copy to prevent ArrayBuffer detachment)
75
+ const chunkData = Uint8Array.from(chunkBuffer);
37
76
  streamEmitter.emit(`chunk:${name}`, {
38
77
  streamName: name,
39
78
  chunkData,
40
79
  chunkId,
41
80
  });
42
81
  },
43
- async closeStream(name) {
44
- const chunkId = `strm_${monotonicUlid()}`;
82
+ async writeToStreamMulti(name, _runId, chunks) {
83
+ if (chunks.length === 0)
84
+ return;
85
+ // Generate all ULIDs synchronously BEFORE any await to preserve call order.
86
+ // This ensures that chunks maintain their order even when runId is a promise.
87
+ const chunkIds = chunks.map(() => `chnk_${monotonicUlid()}`);
88
+ // Await runId if it's a promise
89
+ const runId = await _runId;
90
+ // Register this stream for the run
91
+ await registerStreamForRun(runId, name);
92
+ // Prepare chunk data for parallel writes
93
+ const chunkBuffers = chunks.map((chunk) => toBuffer(chunk));
94
+ // Write all chunks in parallel for efficiency, but track individual completion
95
+ const writePromises = chunkBuffers.map(async (chunkBuffer, i) => {
96
+ const chunkId = chunkIds[i];
97
+ const serialized = serializeChunk({
98
+ chunk: chunkBuffer,
99
+ eof: false,
100
+ });
101
+ const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
102
+ await write(chunkPath, serialized);
103
+ // Return data needed for event emission
104
+ return {
105
+ chunkId,
106
+ chunkData: Uint8Array.from(chunkBuffer),
107
+ };
108
+ });
109
+ // Emit events in order, waiting for each chunk's write to complete
110
+ // This ensures events are emitted in order while writes happen in parallel
111
+ for (const writePromise of writePromises) {
112
+ const { chunkId, chunkData } = await writePromise;
113
+ streamEmitter.emit(`chunk:${name}`, {
114
+ streamName: name,
115
+ chunkData,
116
+ chunkId,
117
+ });
118
+ }
119
+ },
120
+ async closeStream(name, _runId) {
121
+ // Generate ULID synchronously BEFORE any await to preserve call order.
122
+ const chunkId = `chnk_${monotonicUlid()}`;
123
+ // Await runId if it's a promise to ensure proper flushing
124
+ const runId = await _runId;
125
+ // Register this stream for the run (in case writeToStream wasn't called)
126
+ await registerStreamForRun(runId, name);
45
127
  const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}.json`);
46
128
  await write(chunkPath, serializeChunk({ chunk: Buffer.from([]), eof: true }));
47
129
  streamEmitter.emit(`close:${name}`, { streamName: name });
48
130
  },
131
+ async listStreamsByRunId(runId) {
132
+ const runStreamsPath = path.join(basedir, 'streams', 'runs', `${runId}.json`);
133
+ const data = await readJSON(runStreamsPath, RunStreamsSchema);
134
+ return data?.streams ?? [];
135
+ },
49
136
  async readFromStream(name, startIndex = 0) {
50
137
  const chunksDir = path.join(basedir, 'streams', 'chunks');
51
138
  let removeListeners = () => { };
@@ -56,25 +143,44 @@ export function createStreamer(basedir) {
56
143
  // Buffer for chunks that arrive via events during disk reading
57
144
  const bufferedEventChunks = [];
58
145
  let isReadingFromDisk = true;
146
+ // Buffer close event if it arrives during disk reading
147
+ let pendingClose = false;
59
148
  const chunkListener = (event) => {
60
149
  deliveredChunkIds.add(event.chunkId);
150
+ // Skip empty chunks to maintain consistency with disk reading behavior
151
+ // Empty chunks are not enqueued when read from disk (see line 184-186)
152
+ if (event.chunkData.byteLength === 0) {
153
+ return;
154
+ }
61
155
  if (isReadingFromDisk) {
62
156
  // Buffer chunks that arrive during disk reading to maintain order
157
+ // Create a copy to prevent ArrayBuffer detachment when enqueued later
63
158
  bufferedEventChunks.push({
64
159
  chunkId: event.chunkId,
65
- chunkData: event.chunkData,
160
+ chunkData: Uint8Array.from(event.chunkData),
66
161
  });
67
162
  }
68
163
  else {
69
164
  // After disk reading is complete, deliver chunks immediately
70
- controller.enqueue(event.chunkData);
165
+ // Create a copy to prevent ArrayBuffer detachment
166
+ controller.enqueue(Uint8Array.from(event.chunkData));
71
167
  }
72
168
  };
73
169
  const closeListener = () => {
170
+ // Buffer close event if disk reading is still in progress
171
+ if (isReadingFromDisk) {
172
+ pendingClose = true;
173
+ return;
174
+ }
74
175
  // Remove listeners before closing
75
176
  streamEmitter.off(`chunk:${name}`, chunkListener);
76
177
  streamEmitter.off(`close:${name}`, closeListener);
77
- controller.close();
178
+ try {
179
+ controller.close();
180
+ }
181
+ catch {
182
+ // Ignore if controller is already closed (e.g., from cancel() or EOF)
183
+ }
78
184
  };
79
185
  removeListeners = closeListener;
80
186
  // Set up listeners FIRST to avoid missing events
@@ -101,7 +207,8 @@ export function createStreamer(basedir) {
101
207
  break;
102
208
  }
103
209
  if (chunk.chunk.byteLength) {
104
- controller.enqueue(chunk.chunk);
210
+ // Create a copy to prevent ArrayBuffer detachment
211
+ controller.enqueue(Uint8Array.from(chunk.chunk));
105
212
  }
106
213
  }
107
214
  // Finished reading from disk - now deliver buffered event chunks in chronological order
@@ -109,13 +216,30 @@ export function createStreamer(basedir) {
109
216
  // Sort buffered chunks by ULID (chronological order)
110
217
  bufferedEventChunks.sort((a, b) => a.chunkId.localeCompare(b.chunkId));
111
218
  for (const buffered of bufferedEventChunks) {
112
- controller.enqueue(buffered.chunkData);
219
+ // Create a copy for defense in depth (already copied at storage, but be extra safe)
220
+ controller.enqueue(Uint8Array.from(buffered.chunkData));
113
221
  }
114
222
  if (isComplete) {
115
223
  removeListeners();
116
- controller.close();
224
+ try {
225
+ controller.close();
226
+ }
227
+ catch {
228
+ // Ignore if controller is already closed (e.g., from closeListener event)
229
+ }
117
230
  return;
118
231
  }
232
+ // Process any pending close event that arrived during disk reading
233
+ if (pendingClose) {
234
+ streamEmitter.off(`chunk:${name}`, chunkListener);
235
+ streamEmitter.off(`close:${name}`, closeListener);
236
+ try {
237
+ controller.close();
238
+ }
239
+ catch {
240
+ // Ignore if controller is already closed
241
+ }
242
+ }
119
243
  },
120
244
  cancel() {
121
245
  removeListeners();
@@ -1 +1 @@
1
- {"version":3,"file":"streamer.js","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamer.js","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Span, SpanKind, SpanOptions } from '@opentelemetry/api';
2
+ /**
3
+ * Wrap an async function with a trace span.
4
+ * No-op if OpenTelemetry is not available.
5
+ */
6
+ export declare function trace<T>(spanName: string, ...args: [fn: (span?: Span) => Promise<T>] | [opts: SpanOptions, fn: (span?: Span) => Promise<T>]): Promise<T>;
7
+ /**
8
+ * Get SpanKind enum value by name.
9
+ * Returns undefined if OpenTelemetry is not available.
10
+ */
11
+ export declare function getSpanKind(field: keyof typeof SpanKind): Promise<SpanKind | undefined>;
12
+ /** The remote service name for Datadog service maps (Datadog-specific: peer.service) */
13
+ export declare const PeerService: (value: string) => {
14
+ [k: string]: string;
15
+ };
16
+ /** RPC system identifier (standard OTEL: rpc.system) */
17
+ export declare const RpcSystem: (value: string) => {
18
+ [k: string]: string;
19
+ };
20
+ /** RPC service name (standard OTEL: rpc.service) */
21
+ export declare const RpcService: (value: string) => {
22
+ [k: string]: string;
23
+ };
24
+ /** RPC method name (standard OTEL: rpc.method) */
25
+ export declare const RpcMethod: (value: string) => {
26
+ [k: string]: string;
27
+ };
28
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAuBtE;;;GAGG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,IAAI,EACH,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACjC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACvD,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,OAAO,QAAQ,GAC3B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAI/B;AASD,wFAAwF;AACxF,eAAO,MAAM,WAAW;;CAA6C,CAAC;AAEtE,wDAAwD;AACxD,eAAO,MAAM,SAAS;;CAA2C,CAAC;AAElE,oDAAoD;AACpD,eAAO,MAAM,UAAU;;CAA4C,CAAC;AAEpE,kDAAkD;AAClD,eAAO,MAAM,SAAS;;CAA2C,CAAC"}
@@ -0,0 +1,71 @@
1
+ // Lazy load OpenTelemetry API to make it optional
2
+ let otelApiPromise = null;
3
+ async function getOtelApi() {
4
+ if (!otelApiPromise) {
5
+ otelApiPromise = import('@opentelemetry/api').catch(() => null);
6
+ }
7
+ return otelApiPromise;
8
+ }
9
+ let tracerPromise = null;
10
+ async function getTracer() {
11
+ if (!tracerPromise) {
12
+ tracerPromise = getOtelApi().then((otel) => otel ? otel.trace.getTracer('workflow') : null);
13
+ }
14
+ return tracerPromise;
15
+ }
16
+ /**
17
+ * Wrap an async function with a trace span.
18
+ * No-op if OpenTelemetry is not available.
19
+ */
20
+ export async function trace(spanName, ...args) {
21
+ const [tracer, otel] = await Promise.all([getTracer(), getOtelApi()]);
22
+ const { fn, opts } = typeof args[0] === 'function'
23
+ ? { fn: args[0], opts: {} }
24
+ : { fn: args[1], opts: args[0] };
25
+ if (!fn)
26
+ throw new Error('Function to trace must be provided');
27
+ if (!tracer || !otel) {
28
+ return await fn();
29
+ }
30
+ return tracer.startActiveSpan(spanName, opts, async (span) => {
31
+ try {
32
+ const result = await fn(span);
33
+ span.setStatus({ code: otel.SpanStatusCode.OK });
34
+ return result;
35
+ }
36
+ catch (e) {
37
+ span.setStatus({
38
+ code: otel.SpanStatusCode.ERROR,
39
+ message: e.message,
40
+ });
41
+ throw e;
42
+ }
43
+ finally {
44
+ span.end();
45
+ }
46
+ });
47
+ }
48
+ /**
49
+ * Get SpanKind enum value by name.
50
+ * Returns undefined if OpenTelemetry is not available.
51
+ */
52
+ export async function getSpanKind(field) {
53
+ const otel = await getOtelApi();
54
+ if (!otel)
55
+ return undefined;
56
+ return otel.SpanKind[field];
57
+ }
58
+ // Semantic conventions for World/Storage tracing
59
+ // Standard OTEL conventions for peer service mapping
60
+ function SemanticConvention(...names) {
61
+ return (value) => Object.fromEntries(names.map((name) => [name, value]));
62
+ }
63
+ /** The remote service name for Datadog service maps (Datadog-specific: peer.service) */
64
+ export const PeerService = SemanticConvention('peer.service');
65
+ /** RPC system identifier (standard OTEL: rpc.system) */
66
+ export const RpcSystem = SemanticConvention('rpc.system');
67
+ /** RPC service name (standard OTEL: rpc.service) */
68
+ export const RpcService = SemanticConvention('rpc.service');
69
+ /** RPC method name (standard OTEL: rpc.method) */
70
+ export const RpcMethod = SemanticConvention('rpc.method');
71
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { Hook, SerializedData, Step, Storage, WorkflowRun } from '@workflow/world';
2
+ /**
3
+ * Test helper functions for creating and updating storage entities through events.
4
+ * These helpers simplify test setup by providing a convenient API for common operations.
5
+ */
6
+ /**
7
+ * Create a new workflow run through the run_created event.
8
+ */
9
+ export declare function createRun(storage: Storage, data: {
10
+ deploymentId: string;
11
+ workflowName: string;
12
+ input: SerializedData;
13
+ executionContext?: Record<string, unknown>;
14
+ }): Promise<WorkflowRun>;
15
+ /**
16
+ * Update a workflow run's status through lifecycle events.
17
+ */
18
+ export declare function updateRun(storage: Storage, runId: string, eventType: 'run_started' | 'run_completed' | 'run_failed', eventData?: Record<string, unknown>): Promise<WorkflowRun>;
19
+ /**
20
+ * Create a new step through the step_created event.
21
+ */
22
+ export declare function createStep(storage: Storage, runId: string, data: {
23
+ stepId: string;
24
+ stepName: string;
25
+ input: SerializedData;
26
+ }): Promise<Step>;
27
+ /**
28
+ * Update a step's status through lifecycle events.
29
+ */
30
+ export declare function updateStep(storage: Storage, runId: string, stepId: string, eventType: 'step_started' | 'step_completed' | 'step_failed', eventData?: Record<string, unknown>): Promise<Step>;
31
+ /**
32
+ * Create a new hook through the hook_created event.
33
+ */
34
+ export declare function createHook(storage: Storage, runId: string, data: {
35
+ hookId: string;
36
+ token: string;
37
+ metadata?: SerializedData;
38
+ }): Promise<Hook>;
39
+ /**
40
+ * Dispose a hook through the hook_disposed event.
41
+ */
42
+ export declare function disposeHook(storage: Storage, runId: string, hookId: string): Promise<void>;
43
+ //# sourceMappingURL=test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,OAAO,EACP,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AAEH;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,GACA,OAAO,CAAC,WAAW,CAAC,CAUtB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,aAAa,GAAG,eAAe,GAAG,YAAY,EACzD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,WAAW,CAAC,CAUtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC;CACvB,GACA,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,cAAc,GAAG,gBAAgB,GAAG,aAAa,EAC5D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GACA,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,89 @@
1
+ import { SPEC_VERSION_CURRENT } from '@workflow/world';
2
+ /**
3
+ * Test helper functions for creating and updating storage entities through events.
4
+ * These helpers simplify test setup by providing a convenient API for common operations.
5
+ */
6
+ /**
7
+ * Create a new workflow run through the run_created event.
8
+ */
9
+ export async function createRun(storage, data) {
10
+ const result = await storage.events.create(null, {
11
+ eventType: 'run_created',
12
+ specVersion: SPEC_VERSION_CURRENT,
13
+ eventData: data,
14
+ });
15
+ if (!result.run) {
16
+ throw new Error('Expected run to be created');
17
+ }
18
+ return result.run;
19
+ }
20
+ /**
21
+ * Update a workflow run's status through lifecycle events.
22
+ */
23
+ export async function updateRun(storage, runId, eventType, eventData) {
24
+ const result = await storage.events.create(runId, {
25
+ eventType,
26
+ specVersion: SPEC_VERSION_CURRENT,
27
+ eventData,
28
+ });
29
+ if (!result.run) {
30
+ throw new Error('Expected run to be updated');
31
+ }
32
+ return result.run;
33
+ }
34
+ /**
35
+ * Create a new step through the step_created event.
36
+ */
37
+ export async function createStep(storage, runId, data) {
38
+ const result = await storage.events.create(runId, {
39
+ eventType: 'step_created',
40
+ specVersion: SPEC_VERSION_CURRENT,
41
+ correlationId: data.stepId,
42
+ eventData: { stepName: data.stepName, input: data.input },
43
+ });
44
+ if (!result.step) {
45
+ throw new Error('Expected step to be created');
46
+ }
47
+ return result.step;
48
+ }
49
+ /**
50
+ * Update a step's status through lifecycle events.
51
+ */
52
+ export async function updateStep(storage, runId, stepId, eventType, eventData) {
53
+ const result = await storage.events.create(runId, {
54
+ eventType,
55
+ specVersion: SPEC_VERSION_CURRENT,
56
+ correlationId: stepId,
57
+ eventData,
58
+ });
59
+ if (!result.step) {
60
+ throw new Error('Expected step to be updated');
61
+ }
62
+ return result.step;
63
+ }
64
+ /**
65
+ * Create a new hook through the hook_created event.
66
+ */
67
+ export async function createHook(storage, runId, data) {
68
+ const result = await storage.events.create(runId, {
69
+ eventType: 'hook_created',
70
+ specVersion: SPEC_VERSION_CURRENT,
71
+ correlationId: data.hookId,
72
+ eventData: { token: data.token, metadata: data.metadata },
73
+ });
74
+ if (!result.hook) {
75
+ throw new Error('Expected hook to be created');
76
+ }
77
+ return result.hook;
78
+ }
79
+ /**
80
+ * Dispose a hook through the hook_disposed event.
81
+ */
82
+ export async function disposeHook(storage, runId, hookId) {
83
+ await storage.events.create(runId, {
84
+ eventType: 'hook_disposed',
85
+ specVersion: SPEC_VERSION_CURRENT,
86
+ correlationId: hookId,
87
+ });
88
+ }
89
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/world-local",
3
- "version": "4.0.1-beta.7",
3
+ "version": "4.1.0-beta.29",
4
4
  "description": "Local development World implementation for Workflow DevKit",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,20 +23,21 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@vercel/queue": "0.0.0-alpha.23",
27
- "ulid": "^3.0.1",
28
- "undici": "^6.19.0",
26
+ "@vercel/queue": "0.0.0-alpha.36",
27
+ "async-sema": "3.1.1",
28
+ "ulid": "3.0.1",
29
+ "undici": "6.22.0",
29
30
  "zod": "4.1.11",
30
- "@workflow/utils": "4.0.1-beta.2",
31
- "@workflow/world": "4.0.1-beta.4"
31
+ "@workflow/errors": "4.1.0-beta.14",
32
+ "@workflow/utils": "4.1.0-beta.11",
33
+ "@workflow/world": "4.1.0-beta.2"
32
34
  },
33
35
  "devDependencies": {
34
- "@opentelemetry/api": "^1.9.0",
35
- "@types/ms": "^0.7.34",
36
+ "@opentelemetry/api": "1.9.0",
37
+ "@types/ms": "0.7.34",
36
38
  "@types/node": "22.19.0",
37
39
  "ms": "2.1.3",
38
40
  "vitest": "^3.2.4",
39
- "@workflow/errors": "4.0.1-beta.4",
40
41
  "@workflow/tsconfig": "4.0.1-beta.0"
41
42
  },
42
43
  "peerDependencies": {