@workflow/world-testing 5.0.0-beta.3 → 5.0.0-beta.30

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.
@@ -1,18 +1,36 @@
1
1
  import fs from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
2
4
  import { serve } from '@hono/node-server';
5
+ import { createWorldFromModule, } from '@workflow/core/runtime';
6
+ import { getWorldImport } from '@workflow/utils';
3
7
  import { Hono } from 'hono';
4
8
  import { getHookByToken, getRun, resumeHook, start } from 'workflow/api';
5
- import { getWorld } from 'workflow/runtime';
9
+ import { getWorld, setWorld } from 'workflow/runtime';
6
10
  import * as z from 'zod';
7
11
  import { POST as flowPOST } from '../.well-known/workflow/v1/flow.mjs';
8
12
  import manifest from '../.well-known/workflow/v1/manifest.json' with {
9
13
  type: 'json'
10
14
  };
11
- import { POST as stepPOST } from '../.well-known/workflow/v1/step.mjs';
12
15
  if (!process.env.WORKFLOW_TARGET_WORLD) {
13
16
  console.error('Error: WORKFLOW_TARGET_WORLD environment variable is not set.');
14
17
  process.exit(1);
15
18
  }
19
+ function normalizeTargetWorldSpecifier(targetWorld) {
20
+ if (targetWorld.startsWith('./') || targetWorld.startsWith('../')) {
21
+ return pathToFileURL(resolve(process.cwd(), targetWorld)).href;
22
+ }
23
+ return getWorldImport({ WORKFLOW_TARGET_WORLD: targetWorld });
24
+ }
25
+ async function initializeTestWorld() {
26
+ const targetWorld = process.env.WORKFLOW_TARGET_WORLD;
27
+ if (!targetWorld) {
28
+ throw new Error('WORKFLOW_TARGET_WORLD environment variable is not set.');
29
+ }
30
+ const mod = (await import(normalizeTargetWorldSpecifier(targetWorld)));
31
+ setWorld(await createWorldFromModule(mod));
32
+ }
33
+ await initializeTestWorld();
16
34
  const Invoke = z
17
35
  .object({
18
36
  file: z.enum(Object.keys(manifest.workflows)),
@@ -29,12 +47,37 @@ const Invoke = z
29
47
  workflow: manifest.workflows[file][workflow],
30
48
  };
31
49
  });
50
+ // Track flow handler invocations per run for testing inline execution
51
+ const flowInvocationCounts = new Map();
32
52
  const app = new Hono()
33
- .post('/.well-known/workflow/v1/flow', (ctx) => {
53
+ .post('/.well-known/workflow/v1/flow', async (ctx) => {
54
+ // Clone the request to read the body for tracking without consuming it.
55
+ // We must increment the invocation counter *before* awaiting flowPOST,
56
+ // otherwise the workflow may complete (and the test may observe the
57
+ // completed status) before the counter is bumped, producing a flaky
58
+ // `expected 0 to be 1` failure when the test immediately queries
59
+ // /_flow-invocations after seeing the run as completed.
60
+ const cloned = ctx.req.raw.clone();
61
+ try {
62
+ const body = (await cloned.json());
63
+ const runId = typeof body?.runId === 'string'
64
+ ? body.runId
65
+ : typeof body.payload
66
+ ?.runId === 'string'
67
+ ? body.payload.runId
68
+ : undefined;
69
+ if (runId) {
70
+ flowInvocationCounts.set(runId, (flowInvocationCounts.get(runId) ?? 0) + 1);
71
+ }
72
+ }
73
+ catch {
74
+ // Health check or non-JSON messages — ignore
75
+ }
34
76
  return flowPOST(ctx.req.raw);
35
77
  })
36
- .post('/.well-known/workflow/v1/step', (ctx) => {
37
- return stepPOST(ctx.req.raw);
78
+ .get('/_flow-invocations/:runId', (ctx) => {
79
+ const count = flowInvocationCounts.get(ctx.req.param('runId')) ?? 0;
80
+ return ctx.json({ count });
38
81
  })
39
82
  .get('/_manifest', (ctx) => ctx.json(manifest))
40
83
  .post('/invoke', async (ctx) => {
@@ -71,6 +114,30 @@ const app = new Hono()
71
114
  const runId = ctx.req.param('runId');
72
115
  const run = getRun(runId);
73
116
  return new Response(run.getReadable());
117
+ })
118
+ .get('/runs/:runId/events', async (ctx) => {
119
+ const runId = ctx.req.param('runId');
120
+ const world = await getWorld();
121
+ const allEvents = [];
122
+ let cursor;
123
+ while (true) {
124
+ const page = await world.events.list({
125
+ runId,
126
+ pagination: { sortOrder: 'asc', cursor },
127
+ });
128
+ for (const e of page.data) {
129
+ allEvents.push({
130
+ eventType: e.eventType,
131
+ correlationId: e.correlationId,
132
+ });
133
+ }
134
+ if (!page.hasMore)
135
+ break;
136
+ cursor = page.cursor ?? undefined;
137
+ if (!cursor)
138
+ break;
139
+ }
140
+ return ctx.json({ events: allEvents });
74
141
  });
75
142
  serve({
76
143
  fetch: app.fetch,
@@ -98,4 +165,4 @@ serve({
98
165
  control.end();
99
166
  }
100
167
  });
101
- //# sourceMappingURL=server.mjs.map
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2ZXIubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFDTCxxQkFBcUIsR0FFdEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7QUFDekIsT0FBTyxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLFFBQVEsTUFBTSwwQ0FBMEMsQ0FBQztJQUM5RCxJQUFJLEVBQUUsTUFBTTtDQUNiLENBQUM7QUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQ1gsK0RBQStELENBQ2hFLENBQUM7SUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDZCQUE2QixDQUFDLFdBQW1CO0lBQ3hELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMs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SyxFQUFFLENBQUMsSUFBSSxDQUN0QixHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLEVBQzlDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxDQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMsQ0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgc2VydmUgfSBmcm9tICdAaG9uby9ub2RlLXNlcnZlcic7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JsZEZyb21Nb2R1bGUsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbmltcG9ydCB7IGdldFdvcmxkSW1wb3J0IH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IEhvbm8gfSBmcm9tICdob25vJztcbmltcG9ydCB7IGdldEhvb2tCeVRva2VuLCBnZXRSdW4sIHJlc3VtZUhvb2ssIHN0YXJ0IH0gZnJvbSAnd29ya2Zsb3cvYXBpJztcbmltcG9ydCB7IGdldFdvcmxkLCBzZXRXb3JsZCB9IGZyb20gJ3dvcmtmbG93L3J1bnRpbWUnO1xuaW1wb3J0ICogYXMgeiBmcm9tICd6b2QnO1xuaW1wb3J0IHsgUE9TVCBhcyBmbG93UE9TVCB9IGZyb20gJy4uLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cubWpzJztcbmltcG9ydCBtYW5pZmVzdCBmcm9tICcuLi8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJyB3aXRoIHtcbiAgdHlwZTogJ2pzb24nLFxufTtcblxuaWYgKCFwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnRXJyb3I6IFdPUktGTE9XX1RBUkdFVF9XT1JMRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LidcbiAgKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUYXJnZXRXb3JsZFNwZWNpZmllcih0YXJnZXRXb3JsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRhcmdldFdvcmxkLnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0V29ybGQuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChyZXNvbHZlKHByb2Nlc3MuY3dkKCksIHRhcmdldFdvcmxkKSkuaHJlZjtcbiAgfVxuICByZXR1cm4gZ2V0V29ybGRJbXBvcnQoeyBXT1JLRkxPV19UQVJHRVRfV09STEQ6IHRhcmdldFdvcmxkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplVGVzdFdvcmxkKCkge1xuICBjb25zdCB0YXJnZXRXb3JsZCA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRDtcbiAgaWYgKCF0YXJnZXRXb3JsZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignV09SS0ZMT1dfVEFSR0VUX1dPUkxEIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQuJyk7XG4gIH1cblxuICBjb25zdCBtb2QgPSAoYXdhaXQgaW1wb3J0KFxuICAgIG5vcm1hbGl6ZVRhcmdldFdvcmxkU3BlY2lmaWVyKHRhcmdldFdvcmxkKVxuICApKSBhcyBXb3JsZEZhY3RvcnlNb2R1bGU7XG4gIHNldFdvcmxkKGF3YWl0IGNyZWF0ZVdvcmxkRnJvbU1vZHVsZShtb2QpKTtcbn1cblxuYXdhaXQgaW5pdGlhbGl6ZVRlc3RXb3JsZCgpO1xuXG50eXBlIEZpbGVzID0ga2V5b2YgdHlwZW9mIG1hbmlmZXN0LndvcmtmbG93cztcbnR5cGUgV29ya2Zsb3dzPEYgZXh0ZW5kcyBGaWxlcz4gPSBrZXlvZiAodHlwZW9mIG1hbmlmZXN0LndvcmtmbG93cylbRl07XG50eXBlIE5vbkVtcHR5QXJyYXk8VD4gPSBbVCwgLi4uVFtdXTtcblxuY29uc3QgSW52b2tlID0gelxuICAub2JqZWN0KHtcbiAgICBmaWxlOiB6LmVudW0oT2JqZWN0LmtleXMobWFuaWZlc3Qud29ya2Zsb3dzKSBhcyBOb25FbXB0eUFycmF5PEZpbGVzPiksXG4gICAgd29ya2Zsb3c6IHouc3RyaW5nKCksXG4gICAgYXJnczogei51bmtub3duKCkuYXJyYXkoKS5kZWZhdWx0KFtdKSxcbiAgfSlcbiAgLnRyYW5zZm9ybSgob2JqKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IG9iai5maWxlIGFzIGtleW9mIHR5cGVvZiBtYW5pZmVzdC53b3JrZmxvd3M7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB6XG4gICAgICAuZW51bShcbiAgICAgICAgT2JqZWN0LmtleXMobWFuaWZlc3Qud29ya2Zsb3dzW2ZpbGVdKSBhcyBOb25FbXB0eUFycmF5PFxuICAgICAgICAgIFdvcmtmbG93czx0eXBlb2YgZmlsZT5cbiAgICAgICAgPlxuICAgICAgKVxuICAgICAgLnBhcnNlKG9iai53b3JrZmxvdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IG9iai5hcmdzLFxuICAgICAgd29ya2Zsb3c6IG1hbmlmZXN0LndvcmtmbG93c1tmaWxlXVt3b3JrZmxvd10sXG4gICAgfTtcbiAgfSk7XG5cbi8vIFRyYWNrIGZsb3cgaGFuZGxlciBpbnZvY2F0aW9ucyBwZXIgcnVuIGZvciB0ZXN0aW5nIGlubGluZSBleGVjdXRpb25cbmNvbnN0IGZsb3dJbnZvY2F0aW9uQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuY29uc3QgYXBwID0gbmV3IEhvbm8oKVxuICAucG9zdCgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgLy8gQ2xvbmUgdGhlIHJlcXVlc3QgdG8gcmVhZCB0aGUgYm9keSBmb3IgdHJhY2tpbmcgd2l0aG91dCBjb25zdW1pbmcgaXQuXG4gICAgLy8gV2UgbXVzdCBpbmNyZW1lbnQgdGhlIGludm9jYXRpb24gY291bnRlciAqYmVmb3JlKiBhd2FpdGluZyBmbG93UE9TVCxcbiAgICAvLyBvdGhlcndpc2UgdGhlIHdvcmtmbG93IG1heSBjb21wbGV0ZSAoYW5kIHRoZSB0ZXN0IG1heSBvYnNlcnZlIHRoZVxuICAgIC8vIGNvbXBsZXRlZCBzdGF0dXMpIGJlZm9yZSB0aGUgY291bnRlciBpcyBidW1wZWQsIHByb2R1Y2luZyBhIGZsYWt5XG4gICAgLy8gYGV4cGVjdGVkIDAgdG8gYmUgMWAgZmFpbHVyZSB3aGVuIHRoZSB0ZXN0IGltbWVkaWF0ZWx5IHF1ZXJpZXNcbiAgICAvLyAvX2Zsb3ctaW52b2NhdGlvbnMgYWZ0ZXIgc2VlaW5nIHRoZSBydW4gYXMgY29tcGxldGVkLlxuICAgIGNvbnN0IGNsb25lZCA9IGN0eC5yZXEucmF3LmNsb25lKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgY2xvbmVkLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBydW5JZCA9XG4gICAgICAgIHR5cGVvZiBib2R5Py5ydW5JZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGJvZHkucnVuSWRcbiAgICAgICAgICA6IHR5cGVvZiAoYm9keS5wYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgID8ucnVuSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/ICgoYm9keS5wYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5ydW5JZCBhcyBzdHJpbmcpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JZCkge1xuICAgICAgICBmbG93SW52b2NhdGlvbkNvdW50cy5zZXQoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgKGZsb3dJbnZvY2F0aW9uQ291bnRzLmdldChydW5JZCkgPz8gMCkgKyAxXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBIZWFsdGggY2hlY2sgb3Igbm9uLUpTT04gbWVzc2FnZXMg4oCUIGlnbm9yZVxuICAgIH1cbiAgICByZXR1cm4gZmxvd1BPU1QoY3R4LnJlcS5yYXcpO1xuICB9KVxuICAuZ2V0KCcvX2Zsb3ctaW52b2NhdGlvbnMvOnJ1bklkJywgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gZmxvd0ludm9jYXRpb25Db3VudHMuZ2V0KGN0eC5yZXEucGFyYW0oJ3J1bklkJykpID8/IDA7XG4gICAgcmV0dXJuIGN0eC5qc29uKHsgY291bnQgfSk7XG4gIH0pXG4gIC5nZXQoJy9fbWFuaWZlc3QnLCAoY3R4KSA9PiBjdHguanNvbihtYW5pZmVzdCkpXG4gIC5wb3N0KCcvaW52b2tlJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCBjdHgucmVxLmpzb24oKS50aGVuKEludm9rZS5wYXJzZSk7XG4gICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHN0YXJ0KGpzb24ud29ya2Zsb3csIGpzb24uYXJncyk7XG5cbiAgICByZXR1cm4gY3R4Lmpzb24oeyBydW5JZDogaGFuZGxlci5ydW5JZCB9KTtcbiAgfSlcbiAgLnBvc3QoJy9ob29rcy86dG9rZW4nLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgaG9vayA9IGF3YWl0IGdldEhvb2tCeVRva2VuKGN0eC5yZXEucGFyYW0oJ3Rva2VuJykpO1xuICAgIGNvbnN0IHsgcnVuSWQgfSA9IGF3YWl0IHJlc3VtZUhvb2soaG9vay50b2tlbiwge1xuICAgICAgLi4uKGF3YWl0IGN0eC5yZXEuanNvbigpKSxcbiAgICAgIG1ldGFkYXRhOiBob29rLm1ldGFkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBjdHguanNvbih7IHJ1bklkLCBob29rSWQ6IGhvb2suaG9va0lkIH0pO1xuICB9KVxuICAuZ2V0KCcvcnVucy86cnVuSWQnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KGN0eC5yZXEucGFyYW0oJ3J1bklkJykpO1xuICAgIC8vIEN1c3RvbSBKU09OIHNlcmlhbGl6YXRpb24gdG8gaGFuZGxlIFVpbnQ4QXJyYXkgYXMgYmFzZTY0XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJ1biwgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX190eXBlOiAnVWludDhBcnJheScsXG4gICAgICAgICAgZGF0YTogQnVmZmVyLmZyb20odmFsdWUpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGpzb24sIHtcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIH0pO1xuICB9KVxuICAuZ2V0KCcvcnVucy86cnVuSWQvcmVhZGFibGUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgcnVuSWQgPSBjdHgucmVxLnBhcmFtKCdydW5JZCcpO1xuICAgIGNvbnN0IHJ1biA9IGdldFJ1bihydW5JZCk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShydW4uZ2V0UmVhZGFibGUoKSk7XG4gIH0pXG4gIC5nZXQoJy9ydW5zLzpydW5JZC9ldmVudHMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgcnVuSWQgPSBjdHgucmVxLnBhcmFtKCdydW5JZCcpO1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICBjb25zdCBhbGxFdmVudHM6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGNvcnJlbGF0aW9uSWQ/OiBzdHJpbmcgfVtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjogeyBzb3J0T3JkZXI6ICdhc2MnLCBjdXJzb3IgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlIG9mIHBhZ2UuZGF0YSkge1xuICAgICAgICBhbGxFdmVudHMucHVzaCh7XG4gICAgICAgICAgZXZlbnRUeXBlOiBlLmV2ZW50VHlwZSxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFwYWdlLmhhc01vcmUpIGJyZWFrO1xuICAgICAgY3Vyc29yID0gcGFnZS5jdXJzb3IgPz8gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjdXJzb3IpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY3R4Lmpzb24oeyBldmVudHM6IGFsbEV2ZW50cyB9KTtcbiAgfSk7XG5cbnNlcnZlKFxuICB7XG4gICAgZmV0Y2g6IGFwcC5mZXRjaCxcbiAgICBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMCxcbiAgfSxcbiAgYXN5bmMgKGluZm8pID0+IHtcbiAgICBjb25zb2xlLmxvZyhg8J+RgiBsaXN0ZW5pbmcgb24gaHR0cDovLyR7aW5mby5hZGRyZXNzfToke2luZm8ucG9ydH1gKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICBwcm9jZXNzLmVudi5QT1JUID0gaW5mby5wb3J0LnRvU3RyaW5nKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgd29ya2Zsb3dzXSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdC53b3JrZmxvd3MpKSB7XG4gICAgICBmb3IgKGNvbnN0IHdvcmtmbG93TmFtZSBvZiBPYmplY3Qua2V5cyhcbiAgICAgICAgd29ya2Zsb3dzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICApKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAkIGN1cmwgLVggUE9TVCBodHRwOi8vbG9jYWxob3N0OiR7aW5mby5wb3J0fS9pbnZva2UgLWQgJyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpbGU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICB3b3JrZmxvdzogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICl9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgaWYgKHdvcmxkLnN0YXJ0KSB7XG4gICAgICBjb25zb2xlLmxvZyhgc3RhcnRpbmcgYmFja2dyb3VuZCB0YXNrcy4uLmApO1xuICAgICAgYXdhaXQgd29ybGQuc3RhcnQoKS50aGVuKFxuICAgICAgICAoKSA9PiBjb25zb2xlLmxvZygnYmFja2dyb3VuZCB0YXNrcyBzdGFydGVkLicpLFxuICAgICAgICAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCfinZcgZXJyb3Igc3RhcnRpbmcgYmFja2dyb3VuZCB0YXNrczonLCBlcnIpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5DT05UUk9MX0ZEID09PSAnMycpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSgnJywgeyBmZDogMyB9KTtcbiAgICAgIGNvbnRyb2wud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoeyBzdGF0ZTogJ2xpc3RlbmluZycsIGluZm8gfSl9XFxuYCk7XG4gICAgICBjb250cm9sLmVuZCgpO1xuICAgIH1cbiAgfVxuKTtcbiJdfQ==
@@ -12,7 +12,9 @@ type Files = keyof typeof manifest.workflows;
12
12
  type Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];
13
13
  export declare function startServer(opts: {
14
14
  world: string;
15
+ env?: Record<string, string | undefined>;
15
16
  }): Promise<{
17
+ getOutput: () => string;
16
18
  state: "listening";
17
19
  info: {
18
20
  port: number;
@@ -22,70 +24,75 @@ export declare function createFetcher(control: Control): {
22
24
  invoke<F extends Files, W extends Workflows<F>>(file: F, workflow: W, args: unknown[]): Promise<{
23
25
  runId: string;
24
26
  }>;
27
+ getFlowInvocationCount(runId: string): Promise<number>;
25
28
  getRun(id: string): Promise<{
26
29
  runId: string;
27
30
  deploymentId: string;
28
31
  workflowName: string;
29
- input: unknown;
32
+ attributes: Record<string, string>;
30
33
  createdAt: Date;
31
34
  updatedAt: Date;
32
35
  status: "pending" | "running";
33
- output: undefined;
34
- error: undefined;
35
- completedAt: undefined;
36
36
  specVersion?: number | undefined;
37
37
  executionContext?: Record<string, any> | undefined;
38
+ input?: unknown;
39
+ errorCode?: string | undefined;
38
40
  expiredAt?: Date | undefined;
39
41
  startedAt?: Date | undefined;
42
+ output?: undefined;
43
+ error?: undefined;
44
+ completedAt?: undefined;
40
45
  } | {
41
46
  runId: string;
42
47
  deploymentId: string;
43
48
  workflowName: string;
44
- input: unknown;
49
+ attributes: Record<string, string>;
45
50
  createdAt: Date;
46
51
  updatedAt: Date;
47
52
  status: "cancelled";
48
- output: undefined;
49
- error: undefined;
50
53
  completedAt: Date;
51
54
  specVersion?: number | undefined;
52
55
  executionContext?: Record<string, any> | undefined;
56
+ input?: unknown;
57
+ errorCode?: string | undefined;
53
58
  expiredAt?: Date | undefined;
54
59
  startedAt?: Date | undefined;
60
+ output?: undefined;
61
+ error?: undefined;
55
62
  } | {
56
63
  runId: string;
57
64
  deploymentId: string;
58
65
  workflowName: string;
59
- input: unknown;
66
+ attributes: Record<string, string>;
60
67
  createdAt: Date;
61
68
  updatedAt: Date;
62
69
  status: "completed";
63
70
  output: unknown;
64
- error: undefined;
65
71
  completedAt: Date;
66
72
  specVersion?: number | undefined;
67
73
  executionContext?: Record<string, any> | undefined;
74
+ input?: unknown;
75
+ errorCode?: string | undefined;
68
76
  expiredAt?: Date | undefined;
69
77
  startedAt?: Date | undefined;
78
+ error?: undefined;
70
79
  } | {
71
80
  runId: string;
72
81
  deploymentId: string;
73
82
  workflowName: string;
74
- input: unknown;
83
+ attributes: Record<string, string>;
75
84
  createdAt: Date;
76
85
  updatedAt: Date;
77
86
  status: "failed";
78
- output: undefined;
79
- error: {
80
- message: string;
81
- stack?: string | undefined;
82
- code?: string | undefined;
83
- };
87
+ error: unknown;
84
88
  completedAt: Date;
85
89
  specVersion?: number | undefined;
86
90
  executionContext?: Record<string, any> | undefined;
91
+ input?: unknown;
92
+ errorCode?: string | undefined;
87
93
  expiredAt?: Date | undefined;
88
94
  startedAt?: Date | undefined;
95
+ output?: undefined;
89
96
  }>;
90
97
  getReadable(id: string): Promise<ReadableStream<Uint8Array>>;
91
98
  resumeHook<T extends TypedHook<any, any>>(token: string, payload: Omit<NoInfer<TypedHook.Input<T>>, "metadata">): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.mts","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,QAAQ,MAAM,0CAA0C,CAAC;AAErE,eAAO,MAAM,OAAO;;;;;iBAKlB,CAAC;AACH,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAEvC,KAAK,KAAK,GAAG,MAAM,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC7C,KAAK,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,MAAM,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvE,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;GA4CxD;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO;WAE7B,CAAC,SAAS,KAAK,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,QAC5C,CAAC,YACG,CAAC,QACL,OAAO,EAAE;;;eAeA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAmBD,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;eAcjD,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,SACrC,MAAM,WACJ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;EAoB3D"}
1
+ {"version":3,"file":"util.d.mts","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,QAAQ,MAAM,0CAA0C,CAAC;AAErE,eAAO,MAAM,OAAO;;;;;iBAKlB,CAAC;AACH,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAEvC,KAAK,KAAK,GAAG,MAAM,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC7C,KAAK,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,MAAM,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvE,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;;;;;;GAwDA;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO;WAE7B,CAAC,SAAS,KAAK,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,QAC5C,CAAC,YACG,CAAC,QACL,OAAO,EAAE;;;kCAemB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;eAO3C,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAmBD,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;eAcjD,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,SACrC,MAAM,WACJ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;EAoB3D"}
package/dist/src/util.mjs CHANGED
@@ -23,17 +23,25 @@ export async function startServer(opts) {
23
23
  ...process.env,
24
24
  WORKFLOW_TARGET_WORLD: opts.world,
25
25
  CONTROL_FD: '3',
26
+ ...(opts.env ?? {}),
26
27
  },
27
28
  });
28
29
  onTestFinished(() => {
29
30
  proc.kill();
30
31
  });
31
32
  const stdio = [];
33
+ // Accumulated raw server output — used by tests that want to inspect
34
+ // debug logs (e.g., count runtime iterations, event loads, etc.).
35
+ const outputBuffer = [];
32
36
  proc.stdout?.on('data', (chunk) => {
33
- stdio.push({ stream: chalk.white, chunk: chunk.toString() });
37
+ const str = chunk.toString();
38
+ stdio.push({ stream: chalk.white, chunk: str });
39
+ outputBuffer.push(str);
34
40
  });
35
41
  proc.stderr?.on('data', (chunk) => {
36
- stdio.push({ stream: chalk.red, chunk: chunk.toString() });
42
+ const str = chunk.toString();
43
+ stdio.push({ stream: chalk.red, chunk: str });
44
+ outputBuffer.push(str);
37
45
  });
38
46
  onTestFailed(() => {
39
47
  console.log('=== SERVER STDIO ===');
@@ -46,7 +54,11 @@ export async function startServer(opts) {
46
54
  const fd3 = proc.stdio[3];
47
55
  assert(fd3, 'fd3 should be defined');
48
56
  for await (const chunk of fd3.pipe(jsonlines.parse())) {
49
- return Control.parse(chunk);
57
+ const control = Control.parse(chunk);
58
+ return {
59
+ ...control,
60
+ getOutput: () => outputBuffer.join(''),
61
+ };
50
62
  }
51
63
  throw new Error('Server did not start correctly');
52
64
  }
@@ -67,6 +79,11 @@ export function createFetcher(control) {
67
79
  });
68
80
  return data;
69
81
  },
82
+ async getFlowInvocationCount(runId) {
83
+ const x = await fetch(`http://localhost:${control.info.port}/_flow-invocations/${encodeURIComponent(runId)}`);
84
+ const data = (await x.json());
85
+ return data.count;
86
+ },
70
87
  async getRun(id) {
71
88
  const x = await fetch(`http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}`);
72
89
  const text = await x.text();
@@ -107,4 +124,4 @@ export function createFetcher(control) {
107
124
  },
108
125
  };
109
126
  }
110
- //# sourceMappingURL=util.mjs.map
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5tanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sS0FBNkIsTUFBTSxPQUFPLENBQUM7QUFDbEQsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU5RCxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUd6QixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QixLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDN0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDYixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtLQUNqQixDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBTUgsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQUMsSUFHakM7SUFDQyxJQUFJLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUxRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDNUIsVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMs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QyxVQUFVLENBQ2QsS0FBYSxFQUNiLE9BQXNEO1lBRXRELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUNyQixvQkFBb0IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsS0FBSyxFQUFFLEVBQ3REO2dCQUNFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2lCQUNuQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7YUFDOUIsQ0FDRixDQUFDO1lBQ0YsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztZQUM1RSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUN6RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcCBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IFdvcmtmbG93UnVuU2NoZW1hIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsaywgeyB0eXBlIENoYWxrSW5zdGFuY2UgfSBmcm9tICdjaGFsayc7XG5pbXBvcnQganNvbmxpbmVzIGZyb20gJ2pzb25saW5lcyc7XG5pbXBvcnQgeyBhc3NlcnQsIG9uVGVzdEZhaWxlZCwgb25UZXN0RmluaXNoZWQgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHR5cGUgeyBUeXBlZEhvb2sgfSBmcm9tICd3b3JrZmxvdyc7XG5pbXBvcnQgKiBhcyB6IGZyb20gJ3pvZCc7XG5pbXBvcnQgdHlwZSBtYW5pZmVzdCBmcm9tICcuLi8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJztcblxuZXhwb3J0IGNvbnN0IENvbnRyb2wgPSB6Lm9iamVjdCh7XG4gIHN0YXRlOiB6LmxpdGVyYWwoJ2xpc3RlbmluZycpLFxuICBpbmZvOiB6Lm9iamVjdCh7XG4gICAgcG9ydDogei5udW1iZXIoKSxcbiAgfSksXG59KTtcbnR5cGUgQ29udHJvbCA9IHouaW5mZXI8dHlwZW9mIENvbnRyb2w+O1xuXG50eXBlIEZpbGVzID0ga2V5b2YgdHlwZW9mIG1hbmlmZXN0LndvcmtmbG93cztcbnR5cGUgV29ya2Zsb3dzPEYgZXh0ZW5kcyBGaWxlcz4gPSBrZXlvZiAodHlwZW9mIG1hbmlmZXN0LndvcmtmbG93cylbRl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcihvcHRzOiB7XG4gIHdvcmxkOiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG59KSB7XG4gIGxldCBzZXJ2ZXJQYXRoID0gbmV3IFVSTCgnLi9zZXJ2ZXIubXRzJywgaW1wb3J0Lm1ldGEudXJsKTtcblxuICBpZiAoIWV4aXN0c1N5bmMoc2VydmVyUGF0aCkpIHtcbiAgICBzZXJ2ZXJQYXRoID0gbmV3IFVSTCgnLi9zZXJ2ZXIubWpzJywgaW1wb3J0Lm1ldGEudXJsKTtcbiAgfVxuXG4gIGNvbnN0IHByb2MgPSBjcC5zcGF3bignbm9kZScsIFtmaWxlVVJMVG9QYXRoKHNlcnZlclBhdGgpXSwge1xuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIGVudjoge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBXT1JLRkxPV19UQVJHRVRfV09STEQ6IG9wdHMud29ybGQsXG4gICAgICBDT05UUk9MX0ZEOiAnMycsXG4gICAgICAuLi4ob3B0cy5lbnYgPz8ge30pLFxuICAgIH0sXG4gIH0pO1xuICBvblRlc3RGaW5pc2hlZCgoKSA9PiB7XG4gICAgcHJvYy5raWxsKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0ZGlvID0gW10gYXMgeyBzdHJlYW06IENoYWxrSW5zdGFuY2U7IGNodW5rOiBzdHJpbmcgfVtdO1xuICAvLyBBY2N1bXVsYXRlZCByYXcgc2VydmVyIG91dHB1dCDigJQgdXNlZCBieSB0ZXN0cyB0aGF0IHdhbnQgdG8gaW5zcGVjdFxuICAvLyBkZWJ1ZyBsb2dzIChlLmcuLCBjb3VudCBydW50aW1lIGl0ZXJhdGlvbnMsIGV2ZW50IGxvYWRzLCBldGMuKS5cbiAgY29uc3Qgb3V0cHV0QnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBjb25zdCBzdHIgPSBjaHVuay50b1N0cmluZygpO1xuICAgIHN0ZGlvLnB1c2goeyBzdHJlYW06IGNoYWxrLndoaXRlLCBjaHVuazogc3RyIH0pO1xuICAgIG91dHB1dEJ1ZmZlci5wdXNoKHN0cik7XG4gIH0pO1xuICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBjb25zdCBzdHIgPSBjaHVuay50b1N0cmluZygpO1xuICAgIHN0ZGlvLnB1c2goeyBzdHJlYW06IGNoYWxrLnJlZCwgY2h1bms6IHN0ciB9KTtcbiAgICBvdXRwdXRCdWZmZXIucHVzaChzdHIpO1xuICB9KTtcblxuICBvblRlc3RGYWlsZWQoKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCc9PT0gU0VSVkVSIFNURElPID09PScpO1xuICAgIGxldCBidWZmZXIgPSAnJztcbiAgICBmb3IgKGNvbnN0IHsgc3RyZWFtLCBjaHVuayB9IG9mIHN0ZGlvKSB7XG4gICAgICBidWZmZXIgKz0gc3RyZWFtLmludmVyc2UoY2h1bmspO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhidWZmZXIpO1xuICB9KTtcblxuICBjb25zdCBmZDMgPSBwcm9jLnN0ZGlvWzNdO1xuICBhc3NlcnQoZmQzLCAnZmQzIHNob3VsZCBiZSBkZWZpbmVkJyk7XG5cbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBmZDMucGlwZShqc29ubGluZXMucGFyc2UoKSkpIHtcbiAgICBjb25zdCBjb250cm9sID0gQ29udHJvbC5wYXJzZShjaHVuayk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbnRyb2wsXG4gICAgICBnZXRPdXRwdXQ6ICgpID0+IG91dHB1dEJ1ZmZlci5qb2luKCcnKSxcbiAgICB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgZGlkIG5vdCBzdGFydCBjb3JyZWN0bHknKTtcbn1cblxuY29uc3QgSW52b2tlID0gei5vYmplY3QoeyBydW5JZDogei5jb2VyY2Uuc3RyaW5nKCkgfSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGZXRjaGVyKGNvbnRyb2w6IENvbnRyb2wpIHtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpbnZva2U8RiBleHRlbmRzIEZpbGVzLCBXIGV4dGVuZHMgV29ya2Zsb3dzPEY+PihcbiAgICAgIGZpbGU6IEYsXG4gICAgICB3b3JrZmxvdzogVyxcbiAgICAgIGFyZ3M6IHVua25vd25bXVxuICAgICkge1xuICAgICAgY29uc3QgeCA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7Y29udHJvbC5pbmZvLnBvcnR9L2ludm9rZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGUsIHdvcmtmbG93LCBhcmdzIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgeC5qc29uKCkudGhlbihJbnZva2UucGFyc2UpO1xuICAgICAgb25UZXN0RmFpbGVkKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignV29ya2Zsb3cgcnVuOicsIGRhdGEucnVuSWQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIGFzeW5jIGdldEZsb3dJbnZvY2F0aW9uQ291bnQocnVuSWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICBjb25zdCB4ID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7Y29udHJvbC5pbmZvLnBvcnR9L19mbG93LWludm9jYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHJ1bklkKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCB4Lmpzb24oKSkgYXMgeyBjb3VudDogbnVtYmVyIH07XG4gICAgICByZXR1cm4gZGF0YS5jb3VudDtcbiAgICB9LFxuICAgIGFzeW5jIGdldFJ1bihpZDogc3RyaW5nKSB7XG4gICAgICBjb25zdCB4ID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7Y29udHJvbC5pbmZvLnBvcnR9L3J1bnMvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgeC50ZXh0KCk7XG4gICAgICAvLyBDdXN0b20gSlNPTiByZXZpdmVyIHRvIGRlY29kZSBiYXNlNjQgYmFjayB0byBVaW50OEFycmF5XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZSh0ZXh0LCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICh2YWx1ZSBhcyBhbnkpLl9fdHlwZSA9PT0gJ1VpbnQ4QXJyYXknICYmXG4gICAgICAgICAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodmFsdWUgYXMgYW55KS5kYXRhLCAnYmFzZTY0JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFdvcmtmbG93UnVuU2NoZW1hLnBhcnNlQXN5bmMoZGF0YSk7XG4gICAgfSxcbiAgICBhc3luYyBnZXRSZWFkYWJsZShpZDogc3RyaW5nKTogUHJvbWlzZTxSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pj4ge1xuICAgICAgY29uc3QgeCA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cDovL2xvY2FsaG9zdDoke2NvbnRyb2wuaW5mby5wb3J0fS9ydW5zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0vcmVhZGFibGVgXG4gICAgICApO1xuICAgICAgaWYgKCF4Lm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGdldCByZWFkYWJsZSBzdHJlYW06ICR7eC5zdGF0dXN9ICR7eC5zdGF0dXNUZXh0fWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICgheC5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYm9keSBpbiByZXNwb25zZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHguYm9keTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc3VtZUhvb2s8VCBleHRlbmRzIFR5cGVkSG9vazxhbnksIGFueT4+KFxuICAgICAgdG9rZW46IHN0cmluZyxcbiAgICAgIHBheWxvYWQ6IE9taXQ8Tm9JbmZlcjxUeXBlZEhvb2suSW5wdXQ8VD4+LCAnbWV0YWRhdGEnPlxuICAgICkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7Y29udHJvbC5pbmZvLnBvcnR9L2hvb2tzLyR7dG9rZW59YCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJlcy5hcnJheUJ1ZmZlcigpLmNhdGNoKCgpID0+IHt9KTsgLy8gRHJhaW4gdGhlIGJvZHkgdG8gYXZvaWQgcmVzb3VyY2UgbGVha3NcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlc3VtZSBob29rOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -67,4 +67,4 @@ async function writeEvent(writable, event, payload) {
67
67
  payload,
68
68
  })}\r\n`));
69
69
  }
70
- //# sourceMappingURL=hooks.js.map
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi93b3JrZmxvd3MvaG9va3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsMENBY0M7QUF6QkQseUNBQXlEO0FBQ3pELHVDQUF5QjtBQUVaLFFBQUEsSUFBSSxHQUFHLElBQUEsaUJBQVUsRUFBQztJQUM3QixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNmLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO1FBQ2hCLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQzVCLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0tBQ3RCLENBQUM7Q0FDSCxDQUFDLENBQUM7QUFFSSxLQUFLLFVBQVUsZUFBZSxDQUFDLEtBQWEsRUFBRSxVQUFrQjtJQUNyRSxjQUFjLENBQUM7SUFFZixNQUFNLElBQUksR0FBRyxZQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxNQUFNLFNBQVMsR0FBNkMsRUFBRSxDQUFDO0lBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUEsa0JBQVcsR0FBRSxDQUFDO0lBQ3pCLE1BQU0sVUFBVSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNwQyxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLFVBQVUsQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxLQUFLLENBQUMsSUFBSTtZQUFFLE1BQU07SUFDeEIsQ0FBQztJQUVELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUN2QixDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FDdkIsUUFBd0IsRUFDeEIsS0FBYSxFQUNiLE9BQWlCO0lBRWpCLFVBQVUsQ0FBQztJQUVYLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUNoQixJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FDdEIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hCLEtBQUs7UUFDTCxPQUFPO0tBQ1IsQ0FBQyxNQUFNLENBQ1QsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmluZUhvb2ssIGdldFdyaXRhYmxlIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUnO1xuaW1wb3J0ICogYXMgeiBmcm9tICd6b2QnO1xuXG5leHBvcnQgY29uc3QgSG9vayA9IGRlZmluZUhvb2soe1xuICBzY2hlbWE6IHoub2JqZWN0KHtcbiAgICBkYXRhOiB6LnN0cmluZygpLFxuICAgIGRvbmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgbWV0YWRhdGE6IHoudW5rbm93bigpLFxuICB9KSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdFdpdGhIb29rKHRva2VuOiBzdHJpbmcsIGN1c3RvbURhdGE6IHN0cmluZykge1xuICAndXNlIHdvcmtmbG93JztcblxuICBjb25zdCBob29rID0gSG9vay5jcmVhdGUoeyB0b2tlbiwgbWV0YWRhdGE6IHsgY3VzdG9tRGF0YSB9IH0pO1xuICBjb25zdCBjb2xsZWN0ZWQ6IFBhcmFtZXRlcnM8KHR5cGVvZiBIb29rKVsncmVzdW1lJ10+WzFdW10gPSBbXTtcbiAgY29uc3Qgd2YgPSBnZXRXcml0YWJsZSgpO1xuICBhd2FpdCB3cml0ZUV2ZW50KHdmLCAnaG9va0NyZWF0ZWQnKTtcbiAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBob29rKSB7XG4gICAgYXdhaXQgd3JpdGVFdmVudCh3ZiwgJ2hvb2tSZXN1bWVkJywgZXZlbnQpO1xuICAgIGNvbGxlY3RlZC5wdXNoKGV2ZW50KTtcbiAgICBpZiAoZXZlbnQuZG9uZSkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4geyBjb2xsZWN0ZWQgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVFdmVudChcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtLFxuICBldmVudDogc3RyaW5nLFxuICBwYXlsb2FkPzogdW5rbm93blxuKSB7XG4gICd1c2Ugc3RlcCc7XG5cbiAgY29uc29sZS5sb2coJ3dyaXRpbmcgZXZlbnQnLCBldmVudCwgcGF5bG9hZCk7XG4gIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICBhd2FpdCB3cml0ZXIud3JpdGUoXG4gICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFxuICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgIH0pfVxcclxcbmBcbiAgICApXG4gICk7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/world-testing",
3
- "version": "5.0.0-beta.3",
3
+ "version": "5.0.0-beta.30",
4
4
  "description": "Testing utilities and World implementation for Workflow SDK",
5
5
  "main": "dist/src/index.mjs",
6
6
  "files": [
@@ -16,19 +16,21 @@
16
16
  "directory": "packages/world-testing"
17
17
  },
18
18
  "dependencies": {
19
- "@hono/node-server": "1.19.9",
19
+ "@hono/node-server": "1.19.13",
20
20
  "chalk": "5.6.2",
21
- "hono": "4.12.3",
21
+ "hono": "4.12.25",
22
22
  "jsonlines": "0.1.1",
23
- "zod": "4.3.6",
24
- "@workflow/core": "5.0.0-beta.3",
25
- "workflow": "5.0.0-beta.3",
26
- "@workflow/cli": "5.0.0-beta.3",
27
- "@workflow/world": "5.0.0-beta.1"
23
+ "zod": "~4.3.6",
24
+ "@workflow/cli": "5.0.0-beta.30",
25
+ "@workflow/core": "5.0.0-beta.30",
26
+ "@workflow/utils": "5.0.0-beta.6",
27
+ "@workflow/world": "5.0.0-beta.18",
28
+ "@workflow/world-local": "5.0.0-beta.26",
29
+ "workflow": "5.0.0-beta.30"
28
30
  },
29
31
  "devDependencies": {
30
- "@types/node": "22.19.0",
31
32
  "@types/jsonlines": "0.1.5",
33
+ "@types/node": "22.19.0",
32
34
  "vitest": "^4.0.18",
33
35
  "@workflow/tsconfig": "5.0.0-beta.0"
34
36
  },
@@ -41,6 +43,6 @@
41
43
  "build": "wf build && node scripts/generate-well-known-dts.mjs && tsc && cp .well-known/workflow/v1/*.mjs dist/.well-known/workflow/v1/",
42
44
  "clean": "tsc --build --clean && rm -rf dist .well-known* .workflow-data",
43
45
  "start": "node --watch src/server.mts",
44
- "test": "vitest"
46
+ "test": "vitest run"
45
47
  }
46
48
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"addition.mjs","sourceRoot":"","sources":["../../src/addition.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,uBAAuB,EACvB,UAAU,EACV,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function addition(world: string) {\n test('runs an addition', { timeout: 30_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/addition.ts',\n 'addition',\n [1, 2]\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n expect(run.output).toBeInstanceOf(Uint8Array);\n return run;\n },\n {\n interval: 200,\n timeout: 25_000,\n }\n );\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toEqual(3);\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.mjs","sourceRoot":"","sources":["../../src/errors.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,IAAI,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,kCAAkC,EAClC,gCAAgC,EAChC,EAAE,CACH,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAsB;gBAC7C,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,MAAM,0BAA0B,CAC9C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAQ,CAAC;QACV,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE;gBACf,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC5B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAChC;SACF,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function errors(world: string) {\n test('retriable and fatal errors', { timeout: 59_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/retriable-and-fatal.ts',\n 'retryableAndFatalErrorWorkflow',\n []\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run).toMatchObject<Partial<typeof run>>({\n status: 'completed',\n });\n return run;\n },\n {\n interval: 200,\n timeout: 50_000,\n }\n );\n const output = (await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n )) as any;\n expect(output).toEqual({\n gotFatalError: true,\n retryableResult: {\n attempt: 2,\n duration: expect.any(Number),\n stepStartedAt: expect.any(Date),\n },\n });\n expect(output.retryableResult.duration).toBeGreaterThanOrEqual(2000);\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.mjs","sourceRoot":"","sources":["../../src/hooks.mts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport type { Hook } from '../workflows/hooks.ts';\nimport { jsonlines } from './jsonlines.mjs';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function hooks(world: string) {\n test('hooks', { timeout: 60_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const token = Date.now().toString(36);\n const customData = `my-custom-data-${token}`;\n const result = await server.invoke(\n 'workflows/hooks.ts',\n 'collectWithHook',\n [token, customData]\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const readable = await server.getReadable(result.runId);\n const events = jsonlines(readable);\n const hookCreated = Promise.withResolvers<void>();\n const hookResumedEvents = [] as unknown[];\n\n (async () => {\n for await (const obj of events) {\n if (obj?.event === 'hookCreated') {\n hookCreated.resolve();\n continue;\n }\n\n if (obj?.event === 'hookResumed') {\n hookResumedEvents.push(obj.payload);\n continue;\n }\n\n console.log('unhandled event', obj);\n }\n })().catch(() => {\n // ignore errors for reading stream\n });\n\n await hookCreated.promise;\n\n (async () => {\n await server.resumeHook<typeof Hook>(token, {\n data: 'first payload',\n });\n await server.resumeHook<typeof Hook>(token, {\n data: 'second payload',\n });\n await server.resumeHook<typeof Hook>(token, {\n data: 'third payload',\n done: true,\n });\n })();\n\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run).toMatchObject<Partial<typeof run>>({\n status: 'completed',\n });\n return run;\n },\n {\n interval: 200,\n timeout: 59_000,\n }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toEqual({\n collected: [\n {\n data: 'first payload',\n metadata: { customData },\n },\n {\n data: 'second payload',\n metadata: { customData },\n },\n {\n data: 'third payload',\n metadata: { customData },\n done: true,\n },\n ],\n });\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"idempotency.mjs","sourceRoot":"","sources":["../../src/idempotency.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAsB;gBAC7C,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function idempotency(world: string) {\n test('idempotency', { timeout: 60_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke('workflows/noop.ts', 'brokenWf', [1, 2]);\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run).toMatchObject<Partial<typeof run>>({\n status: 'completed',\n });\n return run;\n },\n {\n interval: 200,\n timeout: 59_000,\n }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n\n expect(output).toEqual({\n numbers: Array.from({ length: 20 }, () => expect.any(Number)),\n });\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,CAAC,OAAO,CAAC,CAAC;IACf,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,MAAM,CAAC,OAAO,CAAC,CAAC;AAClB,CAAC","sourcesContent":["import { addition } from './addition.mjs';\nimport { errors } from './errors.mjs';\nimport { hooks } from './hooks.mjs';\nimport { idempotency } from './idempotency.mjs';\nimport { nullByte } from './null-byte.mjs';\n\nexport function createTestSuite(pkgName: string) {\n addition(pkgName);\n idempotency(pkgName);\n hooks(pkgName);\n nullByte(pkgName);\n errors(pkgName);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsonlines.mjs","sourceRoot":"","sources":["../../src/jsonlines.mts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,QAAoC;IACnE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACpC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,KAAK,SAAS,CAAC,CAAC,eAAe;QAC7B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,IAAI,CAAC;YACf,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM;QACR,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["export async function* jsonlines(readable: ReadableStream<Uint8Array>) {\n const decoder = new TextDecoder();\n const reader = readable.getReader();\n let buffer = '';\n\n const bufferedLines = () => {\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n return lines;\n };\n\n async function* bufferedObjects() {\n const lines = bufferedLines();\n for (const line of lines) {\n try {\n yield JSON.parse(line);\n } catch {}\n }\n }\n\n while (true) {\n const read = await reader.read();\n if (read.value) {\n const text = decoder.decode(read.value, { stream: true });\n buffer += text;\n yield* bufferedObjects();\n }\n if (read.done) {\n break;\n }\n }\n\n yield* bufferedObjects();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"null-byte.mjs","sourceRoot":"","sources":["../../src/null-byte.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,wBAAwB,EACxB,kBAAkB,EAClB,EAAE,CACH,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function nullByte(world: string) {\n test('supports null bytes in step results', { timeout: 12_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/null-byte.ts',\n 'nullByteWorkflow',\n []\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n expect(run.output).toBeInstanceOf(Uint8Array);\n return run;\n },\n {\n interval: 200,\n timeout: 10_000,\n }\n );\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toEqual('null byte \\0');\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.mjs","sourceRoot":"","sources":["../../src/server.mts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { getHookByToken, getRun, resumeHook, start } from 'workflow/api';\nimport { getWorld } from 'workflow/runtime';\nimport * as z from 'zod';\nimport { POST as flowPOST } from '../.well-known/workflow/v1/flow.mjs';\nimport manifest from '../.well-known/workflow/v1/manifest.json' with {\n type: 'json',\n};\nimport { POST as stepPOST } from '../.well-known/workflow/v1/step.mjs';\n\nif (!process.env.WORKFLOW_TARGET_WORLD) {\n console.error(\n 'Error: WORKFLOW_TARGET_WORLD environment variable is not set.'\n );\n process.exit(1);\n}\n\ntype Files = keyof typeof manifest.workflows;\ntype Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];\ntype NonEmptyArray<T> = [T, ...T[]];\n\nconst Invoke = z\n .object({\n file: z.enum(Object.keys(manifest.workflows) as NonEmptyArray<Files>),\n workflow: z.string(),\n args: z.unknown().array().default([]),\n })\n .transform((obj) => {\n const file = obj.file as keyof typeof manifest.workflows;\n const workflow = z\n .enum(\n Object.keys(manifest.workflows[file]) as NonEmptyArray<\n Workflows<typeof file>\n >\n )\n .parse(obj.workflow);\n return {\n args: obj.args,\n workflow: manifest.workflows[file][workflow],\n };\n });\n\nconst app = new Hono()\n .post('/.well-known/workflow/v1/flow', (ctx) => {\n return flowPOST(ctx.req.raw);\n })\n .post('/.well-known/workflow/v1/step', (ctx) => {\n return stepPOST(ctx.req.raw);\n })\n .get('/_manifest', (ctx) => ctx.json(manifest))\n .post('/invoke', async (ctx) => {\n const json = await ctx.req.json().then(Invoke.parse);\n const handler = await start(json.workflow, json.args);\n\n return ctx.json({ runId: handler.runId });\n })\n .post('/hooks/:token', async (ctx) => {\n const hook = await getHookByToken(ctx.req.param('token'));\n const { runId } = await resumeHook(hook.token, {\n ...(await ctx.req.json()),\n metadata: hook.metadata,\n });\n return ctx.json({ runId, hookId: hook.hookId });\n })\n .get('/runs/:runId', async (ctx) => {\n const world = await getWorld();\n const run = await world.runs.get(ctx.req.param('runId'));\n // Custom JSON serialization to handle Uint8Array as base64\n const json = JSON.stringify(run, (_key, value) => {\n if (value instanceof Uint8Array) {\n return {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n }\n return value;\n });\n return new Response(json, {\n headers: { 'Content-Type': 'application/json' },\n });\n })\n .get('/runs/:runId/readable', async (ctx) => {\n const runId = ctx.req.param('runId');\n const run = getRun(runId);\n return new Response(run.getReadable());\n });\n\nserve(\n {\n fetch: app.fetch,\n port: Number(process.env.PORT) || 0,\n },\n async (info) => {\n console.log(`👂 listening on http://${info.address}:${info.port}`);\n console.log('');\n\n process.env.PORT = info.port.toString();\n\n for (const [filename, workflows] of Object.entries(manifest.workflows)) {\n for (const workflowName of Object.keys(\n workflows as Record<string, unknown>\n )) {\n console.log(\n `$ curl -X POST http://localhost:${info.port}/invoke -d '${JSON.stringify(\n {\n file: filename,\n workflow: workflowName,\n }\n )}'`\n );\n }\n }\n\n const world = await getWorld();\n if (world.start) {\n console.log(`starting background tasks...`);\n await world.start().then(\n () => console.log('background tasks started.'),\n (err) => console.error('❗ error starting background tasks:', err)\n );\n }\n\n if (process.env.CONTROL_FD === '3') {\n const control = fs.createWriteStream('', { fd: 3 });\n control.write(`${JSON.stringify({ state: 'listening', info })}\\n`);\n control.end();\n }\n }\n);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.mjs","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"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","sourcesContent":["import cp from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { WorkflowRunSchema } from '@workflow/world';\nimport chalk, { type ChalkInstance } from 'chalk';\nimport jsonlines from 'jsonlines';\nimport { assert, onTestFailed, onTestFinished } from 'vitest';\nimport type { TypedHook } from 'workflow';\nimport * as z from 'zod';\nimport type manifest from '../.well-known/workflow/v1/manifest.json';\n\nexport const Control = z.object({\n state: z.literal('listening'),\n info: z.object({\n port: z.number(),\n }),\n});\ntype Control = z.infer<typeof Control>;\n\ntype Files = keyof typeof manifest.workflows;\ntype Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];\n\nexport async function startServer(opts: { world: string }) {\n let serverPath = new URL('./server.mts', import.meta.url);\n\n if (!existsSync(serverPath)) {\n serverPath = new URL('./server.mjs', import.meta.url);\n }\n\n const proc = cp.spawn('node', [fileURLToPath(serverPath)], {\n stdio: ['ignore', 'pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n WORKFLOW_TARGET_WORLD: opts.world,\n CONTROL_FD: '3',\n },\n });\n onTestFinished(() => {\n proc.kill();\n });\n\n const stdio = [] as { stream: ChalkInstance; chunk: string }[];\n proc.stdout?.on('data', (chunk) => {\n stdio.push({ stream: chalk.white, chunk: chunk.toString() });\n });\n proc.stderr?.on('data', (chunk) => {\n stdio.push({ stream: chalk.red, chunk: chunk.toString() });\n });\n\n onTestFailed(() => {\n console.log('=== SERVER STDIO ===');\n let buffer = '';\n for (const { stream, chunk } of stdio) {\n buffer += stream.inverse(chunk);\n }\n console.log(buffer);\n });\n\n const fd3 = proc.stdio[3];\n assert(fd3, 'fd3 should be defined');\n\n for await (const chunk of fd3.pipe(jsonlines.parse())) {\n return Control.parse(chunk);\n }\n\n throw new Error('Server did not start correctly');\n}\n\nconst Invoke = z.object({ runId: z.coerce.string() });\n\nexport function createFetcher(control: Control) {\n return {\n async invoke<F extends Files, W extends Workflows<F>>(\n file: F,\n workflow: W,\n args: unknown[]\n ) {\n const x = await fetch(`http://localhost:${control.info.port}/invoke`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ file, workflow, args }),\n });\n const data = await x.json().then(Invoke.parse);\n onTestFailed(() => {\n console.error('Workflow run:', data.runId);\n });\n return data;\n },\n async getRun(id: string) {\n const x = await fetch(\n `http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}`\n );\n const text = await x.text();\n // Custom JSON reviver to decode base64 back to Uint8Array\n const data = JSON.parse(text, (_key, value) => {\n if (\n value !== null &&\n typeof value === 'object' &&\n (value as any).__type === 'Uint8Array' &&\n typeof (value as any).data === 'string'\n ) {\n return new Uint8Array(Buffer.from((value as any).data, 'base64'));\n }\n return value;\n });\n return WorkflowRunSchema.parseAsync(data);\n },\n async getReadable(id: string): Promise<ReadableStream<Uint8Array>> {\n const x = await fetch(\n `http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}/readable`\n );\n if (!x.ok) {\n throw new Error(\n `Failed to get readable stream: ${x.status} ${x.statusText}`\n );\n }\n if (!x.body) {\n throw new Error('No body in response');\n }\n return x.body;\n },\n async resumeHook<T extends TypedHook<any, any>>(\n token: string,\n payload: Omit<NoInfer<TypedHook.Input<T>>, 'metadata'>\n ) {\n const res = await fetch(\n `http://localhost:${control.info.port}/hooks/${token}`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify(payload),\n }\n );\n res.arrayBuffer().catch(() => {}); // Drain the body to avoid resource leaks\n if (!res.ok) {\n throw new Error(\n `Failed to resume hook: ${res.status} ${res.statusText}`\n );\n }\n },\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../workflows/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,0CAcC;AAzBD,yCAAyD;AACzD,uCAAyB;AAEZ,QAAA,IAAI,GAAG,IAAA,iBAAU,EAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC5B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;KACtB,CAAC;CACH,CAAC,CAAC;AAEI,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,UAAkB;IACrE,cAAc,CAAC;IAEf,MAAM,IAAI,GAAG,YAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,GAA6C,EAAE,CAAC;IAC/D,MAAM,EAAE,GAAG,IAAA,kBAAW,GAAE,CAAC;IACzB,MAAM,UAAU,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,IAAI;YAAE,MAAM;IACxB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,QAAwB,EACxB,KAAa,EACb,OAAiB;IAEjB,UAAU,CAAC;IAEX,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACpC,MAAM,MAAM,CAAC,KAAK,CAChB,IAAI,WAAW,EAAE,CAAC,MAAM,CACtB,GAAG,IAAI,CAAC,SAAS,CAAC;QAChB,KAAK;QACL,OAAO;KACR,CAAC,MAAM,CACT,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { defineHook, getWritable } from '@workflow/core';\nimport * as z from 'zod';\n\nexport const Hook = defineHook({\n schema: z.object({\n data: z.string(),\n done: z.boolean().optional(),\n metadata: z.unknown(),\n }),\n});\n\nexport async function collectWithHook(token: string, customData: string) {\n 'use workflow';\n\n const hook = Hook.create({ token, metadata: { customData } });\n const collected: Parameters<(typeof Hook)['resume']>[1][] = [];\n const wf = getWritable();\n await writeEvent(wf, 'hookCreated');\n for await (const event of hook) {\n await writeEvent(wf, 'hookResumed', event);\n collected.push(event);\n if (event.done) break;\n }\n\n return { collected };\n}\n\nasync function writeEvent(\n writable: WritableStream,\n event: string,\n payload?: unknown\n) {\n 'use step';\n\n console.log('writing event', event, payload);\n const writer = writable.getWriter();\n await writer.write(\n new TextEncoder().encode(\n `${JSON.stringify({\n event,\n payload,\n })}\\r\\n`\n )\n );\n}\n"]}