@workflow/world-testing 4.1.20 → 4.1.22

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.
@@ -44746,7 +44746,7 @@ var require_token_util = __commonJS({
44746
44746
  findProjectInfo: /* @__PURE__ */ __name(() => findProjectInfo, "findProjectInfo"),
44747
44747
  getTokenPayload: /* @__PURE__ */ __name(() => getTokenPayload, "getTokenPayload"),
44748
44748
  getVercelDataDir: /* @__PURE__ */ __name(() => getVercelDataDir, "getVercelDataDir"),
44749
- getVercelOidcToken: /* @__PURE__ */ __name(() => getVercelOidcToken5, "getVercelOidcToken"),
44749
+ getVercelOidcToken: /* @__PURE__ */ __name(() => getVercelOidcToken6, "getVercelOidcToken"),
44750
44750
  getVercelToken: /* @__PURE__ */ __name(() => getVercelToken2, "getVercelToken"),
44751
44751
  isExpired: /* @__PURE__ */ __name(() => isExpired, "isExpired"),
44752
44752
  loadToken: /* @__PURE__ */ __name(() => loadToken, "loadToken"),
@@ -44808,7 +44808,7 @@ var require_token_util = __commonJS({
44808
44808
  }
44809
44809
  }
44810
44810
  __name(getVercelToken2, "getVercelToken");
44811
- async function getVercelOidcToken5(authToken, projectId, teamId) {
44811
+ async function getVercelOidcToken6(authToken, projectId, teamId) {
44812
44812
  const url2 = `https://api.vercel.com/v1/projects/${projectId}/token?source=vercel-oidc-refresh${teamId ? `&teamId=${teamId}` : ""}`;
44813
44813
  const res = await fetch(url2, {
44814
44814
  method: "POST",
@@ -44825,7 +44825,7 @@ var require_token_util = __commonJS({
44825
44825
  assertVercelOidcTokenResponse(tokenRes);
44826
44826
  return tokenRes;
44827
44827
  }
44828
- __name(getVercelOidcToken5, "getVercelOidcToken");
44828
+ __name(getVercelOidcToken6, "getVercelOidcToken");
44829
44829
  function assertVercelOidcTokenResponse(res) {
44830
44830
  if (!res || typeof res !== "object") {
44831
44831
  throw new TypeError(
@@ -45000,13 +45000,13 @@ var require_get_vercel_oidc_token = __commonJS({
45000
45000
  var __toCommonJS2 = /* @__PURE__ */ __name((mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod), "__toCommonJS");
45001
45001
  var get_vercel_oidc_token_exports = {};
45002
45002
  __export2(get_vercel_oidc_token_exports, {
45003
- getVercelOidcToken: /* @__PURE__ */ __name(() => getVercelOidcToken5, "getVercelOidcToken"),
45003
+ getVercelOidcToken: /* @__PURE__ */ __name(() => getVercelOidcToken6, "getVercelOidcToken"),
45004
45004
  getVercelOidcTokenSync: /* @__PURE__ */ __name(() => getVercelOidcTokenSync2, "getVercelOidcTokenSync")
45005
45005
  });
45006
45006
  module2.exports = __toCommonJS2(get_vercel_oidc_token_exports);
45007
45007
  var import_get_context = require_get_context();
45008
45008
  var import_token_error = require_token_error();
45009
- async function getVercelOidcToken5(options) {
45009
+ async function getVercelOidcToken6(options) {
45010
45010
  let token = "";
45011
45011
  let err;
45012
45012
  try {
@@ -45036,7 +45036,7 @@ ${error48.message}`;
45036
45036
  }
45037
45037
  return token;
45038
45038
  }
45039
- __name(getVercelOidcToken5, "getVercelOidcToken");
45039
+ __name(getVercelOidcToken6, "getVercelOidcToken");
45040
45040
  function getVercelOidcTokenSync2() {
45041
45041
  const token = (0, import_get_context.getContext)().headers?.["x-vercel-oidc-token"] ?? process.env.VERCEL_OIDC_TOKEN;
45042
45042
  if (!token) {
@@ -50526,7 +50526,7 @@ init_dist();
50526
50526
  init_node();
50527
50527
 
50528
50528
  // ../core/dist/version.js
50529
- var version2 = "4.8.5";
50529
+ var version2 = "4.8.7";
50530
50530
 
50531
50531
  // ../core/dist/runtime/world.js
50532
50532
  var import_node_module = require("node:module");
@@ -51928,6 +51928,8 @@ function createQueue(config3) {
51928
51928
  const transport = new TypedJsonTransport();
51929
51929
  const generateId2 = monotonicFactory();
51930
51930
  const semaphore = new import_async_sema.Sema(WORKFLOW_LOCAL_QUEUE_CONCURRENCY);
51931
+ const closeController = new AbortController();
51932
+ const closeSignal = closeController.signal;
51931
51933
  const inflightMessages = /* @__PURE__ */ new Map();
51932
51934
  const directHandlers = /* @__PURE__ */ new Map();
51933
51935
  const queue = /* @__PURE__ */ __name(async (queueName, message, opts) => {
@@ -51986,6 +51988,7 @@ function createQueue(config3) {
51986
51988
  headers: new Headers(headers),
51987
51989
  body,
51988
51990
  agents: nodeHttpAgents,
51991
+ signal: closeSignal,
51989
51992
  headersTimeoutMs: agentOptions.headersTimeout,
51990
51993
  bodyTimeoutMs: agentOptions.bodyTimeout
51991
51994
  }) : (
@@ -51995,7 +51998,8 @@ function createQueue(config3) {
51995
51998
  duplex: "half",
51996
51999
  dispatcher: httpAgent,
51997
52000
  headers,
51998
- body
52001
+ body,
52002
+ signal: closeSignal
51999
52003
  })
52000
52004
  );
52001
52005
  }
@@ -52101,6 +52105,9 @@ function createQueue(config3) {
52101
52105
  directHandlers.set(prefix, handler);
52102
52106
  },
52103
52107
  async close() {
52108
+ if (closeSignal.aborted)
52109
+ return;
52110
+ closeController.abort();
52104
52111
  if (nodeHttpAgents)
52105
52112
  destroyNodeHttpAgents(nodeHttpAgents);
52106
52113
  await httpAgent?.close();
@@ -54267,6 +54274,36 @@ var WorkflowHttpTransport = SemanticConvention3("workflow.http.transport");
54267
54274
 
54268
54275
  // ../world-vercel/dist/http-core.js
54269
54276
  var REQUEST_TIMEOUT_MS = 6e4;
54277
+ var TRANSIENT_TRANSPORT_ERROR_CODES = /* @__PURE__ */ new Set([
54278
+ "UND_ERR_INFO",
54279
+ "UND_ERR_REQ_RETRY",
54280
+ "UND_ERR_SOCKET",
54281
+ "UND_ERR_CONNECT",
54282
+ "UND_ERR_CONNECT_TIMEOUT",
54283
+ "UND_ERR_HEADERS_TIMEOUT",
54284
+ "UND_ERR_BODY_TIMEOUT",
54285
+ "UND_ERR_CLOSED",
54286
+ "ECONNRESET",
54287
+ "ECONNREFUSED",
54288
+ "ENOTFOUND",
54289
+ "EAI_AGAIN",
54290
+ "EPIPE",
54291
+ "ETIMEDOUT"
54292
+ ]);
54293
+ function getTransientTransportCode(error48) {
54294
+ let current = error48;
54295
+ for (let depth = 0; current != null && depth < 8; depth++) {
54296
+ if (typeof current === "object" && "code" in current) {
54297
+ const code = current.code;
54298
+ if (typeof code === "string" && TRANSIENT_TRANSPORT_ERROR_CODES.has(code)) {
54299
+ return code;
54300
+ }
54301
+ }
54302
+ current = current?.cause;
54303
+ }
54304
+ return void 0;
54305
+ }
54306
+ __name(getTransientTransportCode, "getTransientTransportCode");
54270
54307
  var HTTP_DEBUG_ENABLED = typeof process !== "undefined" && typeof process.env.DEBUG === "string" && (process.env.DEBUG.includes("workflow:") || process.env.DEBUG === "*");
54271
54308
  var DIAGNOSTIC_HEADERS = [
54272
54309
  "x-vercel-id",
@@ -54367,7 +54404,7 @@ function httpClientSpanAttributes(args) {
54367
54404
  }
54368
54405
  __name(httpClientSpanAttributes, "httpClientSpanAttributes");
54369
54406
  async function instrumentedFetch(opts) {
54370
- const { method, url: url2, headers, body, dispatcher, peerService = "workflow-server", timeoutMs = REQUEST_TIMEOUT_MS, signal: callerSignal, injectTraceContext = true, cacheBust = true, logLabel, buildError, onTransportOutcome } = opts;
54407
+ const { method, url: url2, headers, body, dispatcher, peerService = "workflow-server", timeoutMs = REQUEST_TIMEOUT_MS, signal: callerSignal, injectTraceContext = true, cacheBust = true, logLabel, buildError, onTransportOutcome, deferTransportSuccessUntilBody = false } = opts;
54371
54408
  const label = logLabel ?? url2;
54372
54409
  return trace4(`http ${method}`, { kind: await getSpanKind3("CLIENT") }, async (span) => {
54373
54410
  span?.setAttributes(httpClientSpanAttributes({ method, url: url2, peerService }));
@@ -54407,26 +54444,56 @@ async function instrumentedFetch(opts) {
54407
54444
  const elapsed = Date.now() - start2;
54408
54445
  onTransportOutcome?.(error48);
54409
54446
  if (error48 instanceof Error && (error48.name === "TimeoutError" || error48.name === "AbortError")) {
54410
- const timeoutError = new WorkflowWorldError(`${method} ${label} timed out after ${elapsed}ms`, { url: url2, cause: error48 });
54447
+ const timeoutError = new WorkflowWorldError(`${method} ${label} timed out after ${elapsed}ms`, { url: url2, code: "TIMEOUT", cause: error48 });
54411
54448
  span?.setAttributes({ ...ErrorType2("TIMEOUT") });
54412
54449
  span?.recordException?.(timeoutError);
54413
54450
  throw timeoutError;
54414
54451
  }
54452
+ const transportCode = getTransientTransportCode(error48);
54453
+ if (transportCode) {
54454
+ const transportError2 = new WorkflowWorldError(`${method} ${label} transport failure after ${elapsed}ms (${transportCode})`, { url: url2, code: "TRANSPORT", cause: error48 });
54455
+ span?.setAttributes({ ...ErrorType2("TRANSPORT") });
54456
+ span?.recordException?.(transportError2);
54457
+ throw transportError2;
54458
+ }
54415
54459
  throw error48;
54416
54460
  }
54417
54461
  const ms2 = Date.now() - start2;
54418
- onTransportOutcome?.();
54462
+ if (!deferTransportSuccessUntilBody)
54463
+ onTransportOutcome?.();
54419
54464
  httpLog(method, label, response, ms2);
54420
54465
  span?.setAttributes({ ...HttpResponseStatusCode2(response.status) });
54421
54466
  if (!response.ok) {
54422
54467
  span?.setAttributes({ ...ErrorType2(`HTTP ${response.status}`) });
54423
54468
  logCurlRepro(method, url2, headers);
54424
54469
  if (buildError) {
54425
- const error49 = await buildError(response);
54470
+ let error49;
54471
+ try {
54472
+ error49 = await buildError(response);
54473
+ } catch (cause) {
54474
+ const transportCode = getTransientTransportCode(cause);
54475
+ if (transportCode) {
54476
+ if (deferTransportSuccessUntilBody) {
54477
+ onTransportOutcome?.(cause);
54478
+ }
54479
+ const transportError2 = new WorkflowWorldError(`${method} ${label} response body transport failure (${transportCode})`, { url: url2, code: "TRANSPORT", cause });
54480
+ span?.setAttributes({ ...ErrorType2("TRANSPORT") });
54481
+ span?.recordException?.(transportError2);
54482
+ throw transportError2;
54483
+ }
54484
+ if (deferTransportSuccessUntilBody) {
54485
+ onTransportOutcome?.(cause);
54486
+ }
54487
+ throw cause;
54488
+ }
54489
+ if (deferTransportSuccessUntilBody)
54490
+ onTransportOutcome?.();
54426
54491
  span?.recordException?.(error49);
54427
54492
  throw error49;
54428
54493
  }
54429
54494
  const text = await response.text().catch(() => "");
54495
+ if (deferTransportSuccessUntilBody)
54496
+ onTransportOutcome?.();
54430
54497
  const error48 = errorForResponse(response.status, `${method} ${label} -> HTTP ${response.status}: ${response.statusText}${text ? ` ${text}` : ""}${formatVercelDiagnostics(response.headers)}`, {
54431
54498
  url: url2,
54432
54499
  retryAfter: parseRetryAfter(response.headers.get("Retry-After"))
@@ -61571,42 +61638,13 @@ var import_oidc3 = __toESM(require_dist(), 1);
61571
61638
  init_dist();
61572
61639
 
61573
61640
  // ../world-vercel/dist/version.js
61574
- var version3 = "4.7.1";
61641
+ var version3 = "4.7.3";
61575
61642
 
61576
61643
  // ../world-vercel/dist/utils.js
61577
61644
  var WORKFLOW_SERVER_URL_OVERRIDE = "";
61578
61645
  var IDEMPOTENT_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
61579
61646
  var MAX_BODY_PARSE_RETRIES = 2;
61580
61647
  var BODY_PARSE_RETRY_BASE_MS = 100;
61581
- var TRANSIENT_TRANSPORT_ERROR_CODES = /* @__PURE__ */ new Set([
61582
- "UND_ERR_REQ_RETRY",
61583
- "UND_ERR_SOCKET",
61584
- "UND_ERR_CONNECT",
61585
- "UND_ERR_CONNECT_TIMEOUT",
61586
- "UND_ERR_HEADERS_TIMEOUT",
61587
- "UND_ERR_BODY_TIMEOUT",
61588
- "UND_ERR_CLOSED",
61589
- "ECONNRESET",
61590
- "ECONNREFUSED",
61591
- "ENOTFOUND",
61592
- "EAI_AGAIN",
61593
- "EPIPE",
61594
- "ETIMEDOUT"
61595
- ]);
61596
- function getTransientTransportCode(error48) {
61597
- let current = error48;
61598
- for (let depth = 0; current != null && depth < 5; depth++) {
61599
- if (typeof current === "object" && "code" in current) {
61600
- const code = current.code;
61601
- if (typeof code === "string" && TRANSIENT_TRANSPORT_ERROR_CODES.has(code)) {
61602
- return code;
61603
- }
61604
- }
61605
- current = current?.cause;
61606
- }
61607
- return void 0;
61608
- }
61609
- __name(getTransientTransportCode, "getTransientTransportCode");
61610
61648
  var getWorkflowServerUrlOverride = /* @__PURE__ */ __name(() => WORKFLOW_SERVER_URL_OVERRIDE || process.env.VERCEL_WORKFLOW_SERVER_URL || "", "getWorkflowServerUrlOverride");
61611
61649
  var DEFAULT_RESOLVE_DATA_OPTION2 = "all";
61612
61650
  function deserializeError(obj) {
@@ -62088,21 +62126,35 @@ function createQueue2(config3) {
62088
62126
  __name(createQueue2, "createQueue");
62089
62127
 
62090
62128
  // ../world-vercel/dist/resolve-latest-deployment.js
62129
+ var import_oidc4 = __toESM(require_dist(), 1);
62091
62130
  init_zod();
62092
62131
  var ResolveLatestDeploymentResponseSchema = object({
62093
62132
  id: string2()
62094
62133
  });
62134
+ async function resolveDeploymentIdentityToken(config3) {
62135
+ if (config3?.token)
62136
+ return config3.token;
62137
+ if (process.env.VERCEL === "1") {
62138
+ const oidcToken = await (0, import_oidc4.getVercelOidcToken)().catch(() => null);
62139
+ if (oidcToken)
62140
+ return oidcToken;
62141
+ }
62142
+ return resolveVercelApiToken(config3);
62143
+ }
62144
+ __name(resolveDeploymentIdentityToken, "resolveDeploymentIdentityToken");
62095
62145
  function createResolveLatestDeploymentId(config3) {
62096
62146
  return /* @__PURE__ */ __name(async function resolveLatestDeploymentId() {
62097
62147
  const currentDeploymentId = process.env.VERCEL_DEPLOYMENT_ID;
62098
62148
  if (!currentDeploymentId) {
62099
62149
  throw new Error("Cannot resolve latest deployment: VERCEL_DEPLOYMENT_ID environment variable is not set");
62100
62150
  }
62101
- const token = await resolveVercelApiToken(config3);
62151
+ const token = await resolveDeploymentIdentityToken(config3);
62102
62152
  if (!token) {
62103
62153
  throw new Error("Cannot resolve latest deployment: no OIDC token or VERCEL_TOKEN available");
62104
62154
  }
62105
- const url2 = `https://api.vercel.com/v1/workflow/resolve-latest-deployment/${encodeURIComponent(currentDeploymentId)}`;
62155
+ const teamId = config3?.projectConfig?.teamId;
62156
+ const query = teamId ? `?${new URLSearchParams({ teamId })}` : "";
62157
+ const url2 = `https://api.vercel.com/v1/workflow/resolve-latest-deployment/${encodeURIComponent(currentDeploymentId)}${query}`;
62106
62158
  const response = await instrumentedFetch({
62107
62159
  method: "GET",
62108
62160
  url: url2,
@@ -62119,7 +62171,8 @@ function createResolveLatestDeploymentId(config3) {
62119
62171
  } catch {
62120
62172
  body = "<unable to read response body>";
62121
62173
  }
62122
- return new Error(`Failed to resolve latest deployment for ${currentDeploymentId}: HTTP ${res.status} ${res.statusText}${body ? ` \u2014 ${body}` : ""}`);
62174
+ const hint = res.status === 404 ? ". The deployment exists but was not visible to the identity this request authenticated as, which means the request resolved to a different team. Set the World's `projectConfig.teamId` to scope it explicitly." : "";
62175
+ return new Error(`Failed to resolve latest deployment for ${currentDeploymentId}: HTTP ${res.status} ${res.statusText}${body ? ` \u2014 ${body}` : ""}${hint}`);
62123
62176
  }, "buildError")
62124
62177
  });
62125
62178
  const data = await response.json();
@@ -62400,7 +62453,7 @@ __name(readerToIterator, "readerToIterator");
62400
62453
  // ../world-vercel/dist/events-v4.js
62401
62454
  async function fetchV4(url2, init, config3, opName) {
62402
62455
  const dispatcher = getEventsDispatcher(config3);
62403
- return instrumentedFetch({
62456
+ const response = await instrumentedFetch({
62404
62457
  method: init.method,
62405
62458
  url: url2,
62406
62459
  headers: init.headers,
@@ -62411,9 +62464,41 @@ async function fetchV4(url2, init, config3, opName) {
62411
62464
  // service indefinitely, so without this every request routed onto it fails
62412
62465
  // until the compute instance is recycled — see noteEventsTransportOutcome.
62413
62466
  onTransportOutcome: /* @__PURE__ */ __name((error48) => noteEventsTransportOutcome(dispatcher, error48), "onTransportOutcome"),
62467
+ deferTransportSuccessUntilBody: true,
62414
62468
  timeoutMs: null,
62415
62469
  logLabel: opName,
62416
- buildError: /* @__PURE__ */ __name(async (response) => errorFromV4Response(response.status, headersToRecord(response.headers), await response.text(), opName, url2), "buildError")
62470
+ buildError: /* @__PURE__ */ __name(async (response2) => errorFromV4Response(response2.status, headersToRecord(response2.headers), await response2.text(), opName, url2), "buildError")
62471
+ });
62472
+ if (!response.body) {
62473
+ noteEventsTransportOutcome(dispatcher);
62474
+ return response;
62475
+ }
62476
+ const reader = response.body.getReader();
62477
+ const body = new ReadableStream({
62478
+ async pull(controller) {
62479
+ try {
62480
+ const chunk = await reader.read();
62481
+ if (chunk.done) {
62482
+ noteEventsTransportOutcome(dispatcher);
62483
+ controller.close();
62484
+ } else {
62485
+ controller.enqueue(chunk.value);
62486
+ }
62487
+ } catch (cause) {
62488
+ noteEventsTransportOutcome(dispatcher, cause);
62489
+ const transportCode = getTransientTransportCode(cause);
62490
+ controller.error(transportCode ? new WorkflowWorldError(`v4 ${opName}: response stream transport failure (${transportCode})`, { url: url2, code: "TRANSPORT", cause }) : cause);
62491
+ }
62492
+ },
62493
+ cancel(reason) {
62494
+ noteEventsTransportOutcome(dispatcher);
62495
+ return reader.cancel(reason);
62496
+ }
62497
+ });
62498
+ return new Response(body, {
62499
+ status: response.status,
62500
+ statusText: response.statusText,
62501
+ headers: response.headers
62417
62502
  });
62418
62503
  }
62419
62504
  __name(fetchV4, "fetchV4");
@@ -1,11 +1,6 @@
1
1
  {
2
2
  "version": "1.0.0",
3
3
  "steps": {
4
- "workflows/noop.ts": {
5
- "noop": {
6
- "stepId": "step//./workflows/noop//noop"
7
- }
8
- },
9
4
  "workflows/hooks.ts": {
10
5
  "writeEvent": {
11
6
  "stepId": "step//./workflows/hooks//writeEvent"
@@ -24,22 +19,16 @@
24
19
  "stepId": "step//./workflows/retriable-and-fatal//stepThatThrowsRetryableError"
25
20
  }
26
21
  },
27
- "workflow/dist/internal/builtins.js": {
28
- "__builtin_response_array_buffer": {
29
- "stepId": "__builtin_response_array_buffer"
30
- },
31
- "__builtin_response_json": {
32
- "stepId": "__builtin_response_json"
33
- },
34
- "__builtin_response_text": {
35
- "stepId": "__builtin_response_text"
36
- }
37
- },
38
22
  "workflows/event-limit.ts": {
39
23
  "tick": {
40
24
  "stepId": "step//./workflows/event-limit//tick"
41
25
  }
42
26
  },
27
+ "workflows/noop.ts": {
28
+ "noop": {
29
+ "stepId": "step//./workflows/noop//noop"
30
+ }
31
+ },
43
32
  "workflows/null-byte.ts": {
44
33
  "nullByteStep": {
45
34
  "stepId": "step//./workflows/null-byte//nullByteStep"
@@ -47,74 +36,22 @@
47
36
  },
48
37
  "workflow/dist/stdlib.js": {
49
38
  "fetch": {
50
- "stepId": "step//workflow@4.8.5//fetch"
39
+ "stepId": "step//workflow@4.8.7//fetch"
40
+ }
41
+ },
42
+ "workflow/dist/internal/builtins.js": {
43
+ "__builtin_response_array_buffer": {
44
+ "stepId": "__builtin_response_array_buffer"
45
+ },
46
+ "__builtin_response_json": {
47
+ "stepId": "__builtin_response_json"
48
+ },
49
+ "__builtin_response_text": {
50
+ "stepId": "__builtin_response_text"
51
51
  }
52
52
  }
53
53
  },
54
54
  "workflows": {
55
- "workflows/noop.ts": {
56
- "brokenWf": {
57
- "workflowId": "workflow//./workflows/noop//brokenWf",
58
- "graph": {
59
- "nodes": [
60
- {
61
- "id": "start",
62
- "type": "workflowStart",
63
- "data": {
64
- "label": "Start: brokenWf",
65
- "nodeKind": "workflow_start"
66
- }
67
- },
68
- {
69
- "id": "node_0",
70
- "type": "step",
71
- "data": {
72
- "label": "noop",
73
- "nodeKind": "step",
74
- "stepId": "step//./workflows/noop//noop"
75
- }
76
- },
77
- {
78
- "id": "node_1",
79
- "type": "step",
80
- "data": {
81
- "label": "noop",
82
- "nodeKind": "step",
83
- "stepId": "step//./workflows/noop//noop"
84
- }
85
- },
86
- {
87
- "id": "end",
88
- "type": "workflowEnd",
89
- "data": {
90
- "label": "Return",
91
- "nodeKind": "workflow_end"
92
- }
93
- }
94
- ],
95
- "edges": [
96
- {
97
- "id": "e_start_node_0",
98
- "source": "start",
99
- "target": "node_0",
100
- "type": "default"
101
- },
102
- {
103
- "id": "e_node_0_node_1",
104
- "source": "node_0",
105
- "target": "node_1",
106
- "type": "default"
107
- },
108
- {
109
- "id": "e_node_1_end",
110
- "source": "node_1",
111
- "target": "end",
112
- "type": "default"
113
- }
114
- ]
115
- }
116
- }
117
- },
118
55
  "workflows/hooks.ts": {
119
56
  "collectWithHook": {
120
57
  "workflowId": "workflow//./workflows/hooks//collectWithHook",
@@ -341,6 +278,69 @@
341
278
  }
342
279
  }
343
280
  },
281
+ "workflows/noop.ts": {
282
+ "brokenWf": {
283
+ "workflowId": "workflow//./workflows/noop//brokenWf",
284
+ "graph": {
285
+ "nodes": [
286
+ {
287
+ "id": "start",
288
+ "type": "workflowStart",
289
+ "data": {
290
+ "label": "Start: brokenWf",
291
+ "nodeKind": "workflow_start"
292
+ }
293
+ },
294
+ {
295
+ "id": "node_0",
296
+ "type": "step",
297
+ "data": {
298
+ "label": "noop",
299
+ "nodeKind": "step",
300
+ "stepId": "step//./workflows/noop//noop"
301
+ }
302
+ },
303
+ {
304
+ "id": "node_1",
305
+ "type": "step",
306
+ "data": {
307
+ "label": "noop",
308
+ "nodeKind": "step",
309
+ "stepId": "step//./workflows/noop//noop"
310
+ }
311
+ },
312
+ {
313
+ "id": "end",
314
+ "type": "workflowEnd",
315
+ "data": {
316
+ "label": "Return",
317
+ "nodeKind": "workflow_end"
318
+ }
319
+ }
320
+ ],
321
+ "edges": [
322
+ {
323
+ "id": "e_start_node_0",
324
+ "source": "start",
325
+ "target": "node_0",
326
+ "type": "default"
327
+ },
328
+ {
329
+ "id": "e_node_0_node_1",
330
+ "source": "node_0",
331
+ "target": "node_1",
332
+ "type": "default"
333
+ },
334
+ {
335
+ "id": "e_node_1_end",
336
+ "source": "node_1",
337
+ "target": "end",
338
+ "type": "default"
339
+ }
340
+ ]
341
+ }
342
+ }
343
+ },
344
344
  "workflows/null-byte.ts": {
345
345
  "nullByteWorkflow": {
346
346
  "workflowId": "workflow//./workflows/null-byte//nullByteWorkflow",