@workflow/web 5.0.0-beta.51 → 5.0.0-beta.53

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.
@@ -48833,27 +48833,25 @@ function isNodeHttpEnabled(env2 = process.env) {
48833
48833
  async function reenqueueActiveRuns(runs, enqueue, label, namespace2) {
48834
48834
  const workflowQueuePrefix = getQueueTopicPrefix("workflow", resolveQueueNamespace(namespace2));
48835
48835
  let reenqueued = 0;
48836
- for (const status of ["pending", "running"]) {
48837
- let cursor;
48838
- let hasMore = true;
48839
- while (hasMore) {
48840
- const page = await runs.list({
48841
- status,
48842
- resolveData: "none",
48843
- pagination: { cursor }
48844
- });
48845
- for (const run2 of page.data) {
48846
- try {
48847
- const queueName = `${workflowQueuePrefix}${run2.workflowName}`;
48848
- await enqueue(queueName, { runId: run2.runId });
48849
- reenqueued++;
48850
- } catch (err) {
48851
- console.warn(`[${label}] Failed to re-enqueue run ${run2.runId}: ${err}`);
48852
- }
48836
+ let cursor;
48837
+ let hasMore = true;
48838
+ while (hasMore) {
48839
+ const page = await runs.list({
48840
+ status: ["pending", "running"],
48841
+ resolveData: "none",
48842
+ pagination: { cursor }
48843
+ });
48844
+ for (const run2 of page.data) {
48845
+ try {
48846
+ const queueName = `${workflowQueuePrefix}${run2.workflowName}`;
48847
+ await enqueue(queueName, { runId: run2.runId });
48848
+ reenqueued++;
48849
+ } catch (err) {
48850
+ console.warn(`[${label}] Failed to re-enqueue run ${run2.runId}: ${err}`);
48853
48851
  }
48854
- hasMore = page.hasMore;
48855
- cursor = page.cursor ?? void 0;
48856
48852
  }
48853
+ hasMore = page.hasMore;
48854
+ cursor = page.cursor ?? void 0;
48857
48855
  }
48858
48856
  if (reenqueued > 0 && isDebugEnabled$1()) {
48859
48857
  console.debug(`[${label}] Re-enqueued ${reenqueued} active run(s) on startup`);
@@ -54985,7 +54983,7 @@ function replaceEncryptedAndExpiredWithMarkers(resource) {
54985
54983
  }
54986
54984
  async function hydrateResourceIOAsync(resource, key) {
54987
54985
  const { hydrateDataWithKey: hydrateDataWithKey2, deriveRunPayloadKeys: deriveRunPayloadKeys2 } = await Promise.resolve().then(() => serializationFormat);
54988
- const { ensureZstdDecoderRegistered } = await import("./zstd-browser-decoder-Ce8lEOjC.js");
54986
+ const { ensureZstdDecoderRegistered } = await import("./zstd-browser-decoder-DUCK00sT.js");
54989
54987
  ensureZstdDecoderRegistered();
54990
54988
  const cryptoKey = key ? await deriveRunPayloadKeys2(key) : void 0;
54991
54989
  const revivers = getRevivers();
@@ -85929,7 +85927,7 @@ var tn = f("block", "before:content-[counter(line)]", "before:inline-block", "be
85929
85927
  var et = ({ className: e, language: t, style: o, isIncomplete: n, ...s2 }) => jsxRuntimeExports.jsx("div", { className: f("my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2", e), "data-incomplete": n || void 0, "data-language": t, "data-streamdown": "code-block", style: { contentVisibility: "auto", containIntrinsicSize: "auto 200px", ...o }, ...s2 });
85930
85928
  var Se = reactExports.createContext({ code: "" }), de = () => reactExports.useContext(Se);
85931
85929
  var ot = ({ language: e }) => jsxRuntimeExports.jsx("div", { className: "flex h-8 items-center text-muted-foreground text-xs", "data-language": e, "data-streamdown": "code-block-header", children: jsxRuntimeExports.jsx("span", { className: "ml-1 font-mono lowercase", children: e }) });
85932
- var cn$1 = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-DY_BqM6l.js").then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
85930
+ var cn$1 = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-Cq95j2_r.js").then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
85933
85931
  let i = reactExports.useMemo(() => e.replace(cn$1, ""), [e]), c = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i.split(`
85934
85932
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i]);
85935
85933
  return jsxRuntimeExports.jsx(Se.Provider, { value: { code: e }, children: jsxRuntimeExports.jsxs(et, { isIncomplete: s2, language: t, children: [jsxRuntimeExports.jsx(ot, { language: t }), n ? jsxRuntimeExports.jsx("div", { className: "pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end", children: jsxRuntimeExports.jsx("div", { className: "pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur", "data-streamdown": "code-block-actions", children: n }) }) : null, jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: jsxRuntimeExports.jsx(Qe, { className: o, language: t, result: c, ...r2 }), children: jsxRuntimeExports.jsx(dn, { className: o, code: i, language: t, raw: c, ...r2 }) })] }) });
@@ -86251,7 +86249,7 @@ var Dt = ({ children: e, className: t, onDownload: o, onError: n }) => {
86251
86249
  }, []), jsxRuntimeExports.jsxs("div", { className: "relative", ref: i, children: [jsxRuntimeExports.jsx("button", { className: f("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50", t), disabled: c, onClick: () => r2(!s2), title: "Download table", type: "button", children: e != null ? e : jsxRuntimeExports.jsx(Z, { size: 14 }) }), s2 ? jsxRuntimeExports.jsxs("div", { className: "absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg", children: [jsxRuntimeExports.jsx("button", { className: "w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40", onClick: () => a2("csv"), title: "Download table as CSV", type: "button", children: "CSV" }), jsxRuntimeExports.jsx("button", { className: "w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40", onClick: () => a2("markdown"), title: "Download table as Markdown", type: "button", children: "Markdown" })] }) : null] });
86252
86250
  };
86253
86251
  var Vt = ({ children: e, className: t, showControls: o, ...n }) => jsxRuntimeExports.jsxs("div", { className: "my-4 flex flex-col gap-2 rounded-lg border border-border bg-sidebar p-2", "data-streamdown": "table-wrapper", children: [o ? jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-end gap-1", children: [jsxRuntimeExports.jsx(Ht, {}), jsxRuntimeExports.jsx(Dt, {})] }) : null, jsxRuntimeExports.jsx("div", { className: "border-collapse overflow-x-auto overscroll-y-auto rounded-md border border-border bg-background", children: jsxRuntimeExports.jsx("table", { className: f("w-full divide-y divide-border", t), "data-streamdown": "table", ...n, children: e }) })] });
86254
- var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-Bca_z0-z.js").then((e) => ({ default: e.Mermaid }))), Kn = /language-([^\s]+)/;
86252
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-BolQF4wC.js").then((e) => ({ default: e.Mermaid }))), Kn = /language-([^\s]+)/;
86255
86253
  function ke(e, t) {
86256
86254
  if (!(e != null && e.position || t != null && t.position)) return true;
86257
86255
  if (!(e != null && e.position && (t != null && t.position))) return false;
@@ -94810,7 +94808,8 @@ class WorkflowSuspension extends Error {
94810
94808
  }
94811
94809
  function composeLogLine(prefix, message2, metadata) {
94812
94810
  const [framing, ...rest] = message2.split("\n");
94813
- const body2 = rest.join("\n");
94811
+ const embeddedBody = rest.join("\n");
94812
+ const body2 = embeddedBody.trim() ? embeddedBody : pickString(metadata ?? {}, "errorStack") ?? "";
94814
94813
  const fields = renderStructuredFields(framing ?? "", body2, metadata);
94815
94814
  const trimmedBody = trimStackBody(body2);
94816
94815
  const lines = [`${prefix} ${framing ?? ""}`];
@@ -94839,6 +94838,7 @@ function renderStructuredFields(framing, body2, metadata) {
94839
94838
  "errorName",
94840
94839
  "errorMessage",
94841
94840
  "errorStack",
94841
+ "errorCause",
94842
94842
  "hint",
94843
94843
  "attempt",
94844
94844
  "retryCount"
@@ -94846,7 +94846,8 @@ function renderStructuredFields(framing, body2, metadata) {
94846
94846
  const lines = [];
94847
94847
  const errorName = pickString(metadata, "errorName");
94848
94848
  const attribution = pickString(metadata, "errorAttribution");
94849
- if (errorName || attribution) {
94849
+ const nameEchoedByStack = errorName !== null && stackHeaderNames(body2, errorName);
94850
+ if (attribution || errorName && !nameEchoedByStack) {
94850
94851
  const badge = attribution ? attribution === "sdk" ? magenta("sdk error") : red("user error") : "";
94851
94852
  const cls = errorName ? bold(errorName) : "";
94852
94853
  const sep2 = badge && cls ? dim(" · ") : "";
@@ -94880,6 +94881,10 @@ function renderStructuredFields(framing, body2, metadata) {
94880
94881
  if (errorMessage && !redundant.has("errorMessage")) {
94881
94882
  lines.push(` ${kvKey("error")} ${formatPassthroughValue(errorMessage)}`);
94882
94883
  }
94884
+ const errorCause = pickString(metadata, "errorCause");
94885
+ if (errorCause && !body2.includes(errorCause)) {
94886
+ lines.push(` ${kvKey("cause")} ${formatPassthroughValue(errorCause)}`);
94887
+ }
94883
94888
  const hint$12 = pickString(metadata, "hint");
94884
94889
  if (hint$12) {
94885
94890
  lines.push(` ${hint(hint$12)}`);
@@ -94943,6 +94948,11 @@ function isFrameworkFrame(line) {
94943
94948
  }
94944
94949
  return false;
94945
94950
  }
94951
+ function stackHeaderNames(body2, errorName) {
94952
+ var _a3;
94953
+ const header = ((_a3 = body2.split("\n", 1)[0]) == null ? void 0 : _a3.trim()) ?? "";
94954
+ return header === errorName || header.startsWith(`${errorName}:`);
94955
+ }
94946
94956
  function pickString(metadata, key) {
94947
94957
  const v2 = metadata[key];
94948
94958
  return typeof v2 === "string" && v2.length > 0 ? v2 : null;
@@ -98135,6 +98145,13 @@ async function getForwardedWritableEncryptionKey(runId, deploymentId, encryption
98135
98145
  const rawKey = deploymentId ? await world.getEncryptionKeyForRun(runId, { deploymentId }) : await world.getEncryptionKeyForRun(await world.runs.get(runId));
98136
98146
  return rawKey ? await importKey(rawKey, ["encrypt"]) : void 0;
98137
98147
  }
98148
+ function lazyForwardedWritableEncryptionKey(runId, deploymentId, encryptionPublicKey) {
98149
+ let keyPromise;
98150
+ return () => {
98151
+ keyPromise ?? (keyPromise = getForwardedWritableEncryptionKey(runId, deploymentId, encryptionPublicKey));
98152
+ return keyPromise;
98153
+ };
98154
+ }
98138
98155
  function tagForwardedWritableTarget(writable, { deploymentId, encryptionPublicKey }) {
98139
98156
  if (typeof deploymentId === "string") {
98140
98157
  Object.defineProperty(writable, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, {
@@ -98286,7 +98303,7 @@ function getExternalRevivers(global2 = globalThis, ops, runId, cryptoKey, option
98286
98303
  },
98287
98304
  WritableStream: (value) => {
98288
98305
  const targetRunId = typeof value.runId === "string" ? value.runId : runId;
98289
- const targetKey = targetRunId === runId ? cryptoKey : getForwardedWritableEncryptionKey(targetRunId, value.deploymentId, value.encryptionPublicKey);
98306
+ const targetKey = targetRunId === runId ? cryptoKey : lazyForwardedWritableEncryptionKey(targetRunId, value.deploymentId, value.encryptionPublicKey);
98290
98307
  return createForwardedWritable({
98291
98308
  global: global2,
98292
98309
  ops,
@@ -98543,7 +98560,7 @@ function getStepRevivers(global2 = globalThis, ops, runId, cryptoKey, deployment
98543
98560
  WritableStream: (value) => {
98544
98561
  const targetRunId = typeof value.runId === "string" ? value.runId : runId;
98545
98562
  const targetDeploymentId = typeof value.deploymentId === "string" ? value.deploymentId : targetRunId === runId ? deploymentId : void 0;
98546
- const targetKey = targetRunId === runId ? cryptoKey : getForwardedWritableEncryptionKey(targetRunId, targetDeploymentId, value.encryptionPublicKey);
98563
+ const targetKey = targetRunId === runId ? cryptoKey : lazyForwardedWritableEncryptionKey(targetRunId, targetDeploymentId, value.encryptionPublicKey);
98547
98564
  const serialize2 = getSerializeStream(getStepReducers(global2, ops, targetRunId, targetKey), targetKey);
98548
98565
  const serverWritable = new WorkflowServerWritableStream(targetRunId, value.name);
98549
98566
  const state = createFlushableState();
@@ -98754,12 +98771,12 @@ globalSingleton("@workflow/core//envWarnings", 1, () => ({
98754
98771
  maxInlineStepsValues: /* @__PURE__ */ new Set(),
98755
98772
  maxEventsValues: /* @__PURE__ */ new Set()
98756
98773
  }));
98757
- const version$1 = "5.0.0-beta.51";
98774
+ const version$1 = "5.0.0-beta.53";
98758
98775
  const DEFAULT_HEALTH_CHECK_TIMEOUT = 3e4;
98759
- const SAFE_WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9_\-./@]+$/;
98776
+ const SAFE_WORKFLOW_NAME_PATTERN = /^[a-zA-Z0-9_\-./@()[\]]+$/;
98760
98777
  function getWorkflowQueueName(workflowName, namespace2) {
98761
98778
  if (!SAFE_WORKFLOW_NAME_PATTERN.test(workflowName)) {
98762
- throw new Error(`Invalid workflow name "${workflowName}": must only contain alphanumeric characters, underscores, hyphens, dots, forward slashes, or at signs`);
98779
+ throw new Error(`Invalid workflow name "${workflowName}": must only contain alphanumeric characters, underscores, hyphens, dots, forward slashes, at signs, parentheses, or square brackets`);
98763
98780
  }
98764
98781
  const prefix = getQueueTopicPrefix("workflow", resolveQueueNamespace(namespace2));
98765
98782
  return `${prefix}${workflowName}`;
@@ -129485,8 +129502,11 @@ function createRunsStorage(basedir, tag) {
129485
129502
  if ((params == null ? void 0 : params.workflowName) && run2.workflowName !== params.workflowName) {
129486
129503
  return false;
129487
129504
  }
129488
- if ((params == null ? void 0 : params.status) && run2.status !== params.status) {
129489
- return false;
129505
+ if ((params == null ? void 0 : params.status) !== void 0) {
129506
+ const statuses = Array.isArray(params.status) ? params.status : [params.status];
129507
+ if (!statuses.includes(run2.status)) {
129508
+ return false;
129509
+ }
129490
129510
  }
129491
129511
  return true;
129492
129512
  },
@@ -130987,7 +131007,7 @@ function createWorld$2(args) {
130987
131007
  const basedir = mergedConfig.dataDir;
130988
131008
  const hooksDir = path$3.join(basedir, "hooks");
130989
131009
  const taggedHookFiles = await listTaggedFiles(hooksDir, tag);
130990
- const { HookSchema: HookSchema2 } = await import("./index-Az8HzIf_.js");
131010
+ const { HookSchema: HookSchema2 } = await import("./index-DPoW5P_O.js");
130991
131011
  await Promise.all(taggedHookFiles.map(async (hookFile) => {
130992
131012
  const hook = await readJSON(path$3.join(hooksDir, hookFile), HookSchema2);
130993
131013
  if (hook == null ? void 0 : hook.token) {
@@ -131170,8 +131190,8 @@ function requireGetVercelOidcToken() {
131170
131190
  }
131171
131191
  try {
131172
131192
  const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([
131173
- await import("./token-util-BgQCuyAc.js").then((n) => n.t),
131174
- await import("./token-BcUtceXk.js").then((n) => n.t)
131193
+ await import("./token-util-ChwiFJWk.js").then((n) => n.t),
131194
+ await import("./token-D5rGJvd_.js").then((n) => n.t)
131175
131195
  ]);
131176
131196
  if (!token || isExpired(getTokenPayload(token), options == null ? void 0 : options.expirationBufferMs)) {
131177
131197
  await refreshToken(options);
@@ -131734,7 +131754,7 @@ function requireDist() {
131734
131754
  return dist;
131735
131755
  }
131736
131756
  var distExports = requireDist();
131737
- const version = "5.0.0-beta.46";
131757
+ const version = "5.0.0-beta.48";
131738
131758
  const pools = globalSingleton("@workflow/world-vercel//httpPools", 1, () => ({
131739
131759
  dispatcher: void 0,
131740
131760
  queueDispatcher: void 0,
@@ -131900,7 +131920,15 @@ const RECYCLABLE_ERROR_CODES = /* @__PURE__ */ new Set([
131900
131920
  // Covers H2 stream timeout, frameError and GOAWAY (undici InformationalError).
131901
131921
  "UND_ERR_INFO",
131902
131922
  "UND_ERR_HEADERS_TIMEOUT",
131903
- "UND_ERR_BODY_TIMEOUT"
131923
+ "UND_ERR_BODY_TIMEOUT",
131924
+ // Node can surface these directly instead of undici's UND_ERR_INFO. Once
131925
+ // repeated, retire the pool even when classification used its fallback.
131926
+ // Keep this scoped to session/stream failures: ERR_HTTP2_* also contains
131927
+ // request-validation and caller-cancellation errors a new pool cannot fix.
131928
+ "ERR_HTTP2_GOAWAY_SESSION",
131929
+ "ERR_HTTP2_INVALID_SESSION",
131930
+ "ERR_HTTP2_SESSION_ERROR",
131931
+ "ERR_HTTP2_STREAM_ERROR"
131904
131932
  ]);
131905
131933
  const MAX_CAUSE_DEPTH = 8;
131906
131934
  function isRecyclableTransportError(error2) {
@@ -132204,6 +132232,51 @@ function getTransientTransportCode(error2) {
132204
132232
  }
132205
132233
  return void 0;
132206
132234
  }
132235
+ function validateHttpUrl(url) {
132236
+ const { protocol, username, password } = new URL(url);
132237
+ if (protocol !== "http:" && protocol !== "https:") {
132238
+ throw new TypeError(`Unsupported URL protocol ${protocol}; expected http: or https:`);
132239
+ }
132240
+ if (username || password) {
132241
+ throw new TypeError("HTTP(S) URLs with embedded credentials are unsupported");
132242
+ }
132243
+ }
132244
+ const REQUEST_CONSTRUCTION_ERROR_CODES = /* @__PURE__ */ new Set([
132245
+ "ERR_INVALID_URL",
132246
+ "ERR_INVALID_ARG_TYPE",
132247
+ "ERR_INVALID_ARG_VALUE",
132248
+ "ERR_INVALID_CHAR",
132249
+ "ERR_INVALID_HTTP_TOKEN",
132250
+ "ERR_HTTP_INVALID_HEADER_VALUE",
132251
+ "ERR_UNESCAPED_CHARACTERS",
132252
+ // Undici validates request options and headers during dispatch, after
132253
+ // Fetch has constructed the Request (e.g. unsupported Expect headers).
132254
+ "UND_ERR_INVALID_ARG",
132255
+ "UND_ERR_NOT_SUPPORTED"
132256
+ ]);
132257
+ function describeTransportFailure(error2) {
132258
+ const known = getTransientTransportCode(error2);
132259
+ if (known)
132260
+ return known;
132261
+ let firstCode;
132262
+ let innermostName;
132263
+ let current = error2;
132264
+ for (let depth = 0; current && depth < 8; depth++) {
132265
+ const { code: code2, name: name2, message: message2 } = current;
132266
+ if (name2 === "Error" && message2 === "bad port" && code2 === void 0) {
132267
+ return void 0;
132268
+ }
132269
+ if (typeof code2 === "string" && code2) {
132270
+ if (REQUEST_CONSTRUCTION_ERROR_CODES.has(code2))
132271
+ return void 0;
132272
+ firstCode ?? (firstCode = code2);
132273
+ }
132274
+ if (typeof name2 === "string" && name2)
132275
+ innermostName = name2;
132276
+ current = current.cause;
132277
+ }
132278
+ return firstCode ?? innermostName ?? "unknown";
132279
+ }
132207
132280
  const getRequestTimeoutMs = () => envNumber("WORKFLOW_REQUEST_TIMEOUT_MS", REQUEST_TIMEOUT_MS, {
132208
132281
  integer: true,
132209
132282
  min: 1e4,
@@ -132339,6 +132412,7 @@ function recordClientSpanStatus(span, status) {
132339
132412
  async function instrumentedFetch(opts) {
132340
132413
  const { method, url, headers: headers2, body: body2, dispatcher: dispatcher2, peerService, timeoutMs = getRequestTimeoutMs(), signal: callerSignal, injectTraceContext: injectTraceContext2 = true, cacheBust = true, logLabel, buildError, spanName, attributes, durationAttribute, onTransportOutcome, deferTransportSuccessUntilBody = false, onRequestDispatched, transportErrorCode = "TRANSPORT" } = opts;
132341
132414
  const label = logLabel ?? url;
132415
+ validateHttpUrl(url);
132342
132416
  return withHttpClientSpan({ method, url, peerService, spanName, attributes }, async (span) => {
132343
132417
  var _a3, _b2, _c2, _d2, _e2;
132344
132418
  if (injectTraceContext2)
@@ -132347,13 +132421,13 @@ async function instrumentedFetch(opts) {
132347
132421
  headers2.set("X-Request-Time", Date.now().toString());
132348
132422
  const timeoutSignal = timeoutMs != null ? AbortSignal.timeout(timeoutMs) : void 0;
132349
132423
  const signal = callerSignal && timeoutSignal ? AbortSignal.any([callerSignal, timeoutSignal]) : callerSignal ?? timeoutSignal;
132424
+ const nodeAgents = dispatcher2 ? void 0 : getNodeHttpAgents();
132425
+ span == null ? void 0 : span.setAttributes({
132426
+ ...WorkflowHttpTransport(nodeAgents ? "node-http" : "undici")
132427
+ });
132350
132428
  const start2 = Date.now();
132351
132429
  let response2;
132352
132430
  try {
132353
- const nodeAgents = dispatcher2 ? void 0 : getNodeHttpAgents();
132354
- span == null ? void 0 : span.setAttributes({
132355
- ...WorkflowHttpTransport(nodeAgents ? "node-http" : "undici")
132356
- });
132357
132431
  const request2 = nodeAgents ? nodeHttpFetch(url, {
132358
132432
  method,
132359
132433
  headers: headers2,
@@ -132391,7 +132465,7 @@ async function instrumentedFetch(opts) {
132391
132465
  (_a3 = span == null ? void 0 : span.recordException) == null ? void 0 : _a3.call(span, timeoutError);
132392
132466
  throw timeoutError;
132393
132467
  }
132394
- const transportCode = getTransientTransportCode(error2);
132468
+ const transportCode = describeTransportFailure(error2);
132395
132469
  if (transportCode) {
132396
132470
  const message2 = `${method} ${label} transport failure after ${elapsed}ms (${transportCode})`;
132397
132471
  const errorCode = transportErrorCode === "STREAM_ERROR" ? "STREAM_ERROR" : "TRANSPORT";
@@ -132550,6 +132624,7 @@ async function makeRequest({ endpoint, options = {}, config: config2 = {}, schem
132550
132624
  const method = (options.method || "GET").toUpperCase();
132551
132625
  const { baseUrl, headers: headers2 } = await getHttpConfig(config2);
132552
132626
  const url = `${baseUrl}${endpoint}`;
132627
+ validateHttpUrl(url);
132553
132628
  return trace(`http ${method}`, { kind: await getSpanKind("CLIENT") }, async (span) => {
132554
132629
  var _a3, _b2, _c2;
132555
132630
  span == null ? void 0 : span.setAttributes(httpClientSpanAttributes({
@@ -132571,13 +132646,15 @@ async function makeRequest({ endpoint, options = {}, config: config2 = {}, schem
132571
132646
  headers2.set("X-Request-Time", Date.now().toString());
132572
132647
  const timeoutSignal = AbortSignal.timeout(getRequestTimeoutMs());
132573
132648
  const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
132649
+ const nodeAgents = getNodeHttpAgents(config2);
132650
+ const undiciRequest = nodeAgents ? void 0 : new Request(url, { ...options, body: body2, headers: headers2, signal });
132651
+ const undiciDispatcher = nodeAgents ? void 0 : getDispatcher(config2);
132652
+ span == null ? void 0 : span.setAttributes({
132653
+ ...WorkflowHttpTransport(nodeAgents ? "node-http" : "undici")
132654
+ });
132574
132655
  const fetchStart = Date.now();
132575
132656
  let response2;
132576
132657
  try {
132577
- const nodeAgents = getNodeHttpAgents(config2);
132578
- span == null ? void 0 : span.setAttributes({
132579
- ...WorkflowHttpTransport(nodeAgents ? "node-http" : "undici")
132580
- });
132581
132658
  response2 = nodeAgents ? await nodeHttpFetch(url, {
132582
132659
  method,
132583
132660
  headers: headers2,
@@ -132589,9 +132666,9 @@ async function makeRequest({ endpoint, options = {}, config: config2 = {}, schem
132589
132666
  // no stalled-socket deadline.
132590
132667
  headersTimeoutMs: NODE_HTTP_HEADERS_TIMEOUT_MS,
132591
132668
  bodyTimeoutMs: NODE_HTTP_BODY_TIMEOUT_MS
132592
- }) : await fetch(new Request(url, { ...options, body: body2, headers: headers2, signal }), {
132669
+ }) : await fetch(undiciRequest, {
132593
132670
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- undici v7 dispatcher types don't match @types/node's RequestInit
132594
- dispatcher: getDispatcher(config2)
132671
+ dispatcher: undiciDispatcher
132595
132672
  });
132596
132673
  } catch (error2) {
132597
132674
  const elapsed = Date.now() - fetchStart;
@@ -132601,7 +132678,7 @@ async function makeRequest({ endpoint, options = {}, config: config2 = {}, schem
132601
132678
  (_a3 = span == null ? void 0 : span.recordException) == null ? void 0 : _a3.call(span, timeoutError);
132602
132679
  throw timeoutError;
132603
132680
  }
132604
- const transportCode = getTransientTransportCode(error2);
132681
+ const transportCode = describeTransportFailure(error2);
132605
132682
  if (transportCode) {
132606
132683
  if (retryConnectTimeout && canRetryRead && transportCode === "UND_ERR_CONNECT_TIMEOUT" && attempt === 0) {
132607
132684
  await new Promise((resolve2) => setTimeout(resolve2, BODY_PARSE_RETRY_BASE_MS));
@@ -133330,7 +133407,7 @@ function createGetEncryptionKeyForRun(projectId, teamId, token, dispatcher2) {
133330
133407
  };
133331
133408
  }
133332
133409
  async function getDeadline() {
133333
- const { getDeadline: getDeadline2 } = await import("./index-CvyMHP_b.js").then((n) => n.i);
133410
+ const { getDeadline: getDeadline2 } = await import("./index-CsLAjmyX.js").then((n) => n.i);
133334
133411
  return getDeadline2();
133335
133412
  }
133336
133413
  const WORKFLOW_SERVER_SERVICE = {
@@ -138467,7 +138544,7 @@ const wsEventsChannelForInvocation = (runId, config2) => {
138467
138544
  open() {
138468
138545
  if (!runId || !isWsEventsTransportEnabled())
138469
138546
  return;
138470
- claim2 = import("./ws-transport-nlG6b7qI.js").then(({ openWsChannel }) => openWsChannel(runId, config2)).catch(() => void 0);
138547
+ claim2 = import("./ws-transport-BQdJnqBo.js").then(({ openWsChannel }) => openWsChannel(runId, config2)).catch(() => void 0);
138471
138548
  },
138472
138549
  /**
138473
138550
  * Awaited, unlike the open: work scheduled after the handler returns is not
@@ -138920,7 +138997,7 @@ function isRetryableEventPostError(err) {
138920
138997
  if (EntityConflictError.is(err) || RunExpiredError.is(err) || TooEarlyError.is(err) || ThrottleError.is(err)) {
138921
138998
  return false;
138922
138999
  }
138923
- if (WorkflowWorldError.is(err)) {
139000
+ if (WorkflowWorldError.is(err) || StreamError.is(err)) {
138924
139001
  if (err.code === "PARSE_ERROR")
138925
139002
  return true;
138926
139003
  if (err.code === "TRANSPORT")
@@ -138928,6 +139005,14 @@ function isRetryableEventPostError(err) {
138928
139005
  if (typeof err.status === "number") {
138929
139006
  return err.status >= 500 && err.status <= 599;
138930
139007
  }
139008
+ if (err.code === "STREAM_ERROR") {
139009
+ return !collectErrorMarkers(err).some((marker) => [
139010
+ "AbortError",
139011
+ "ABORT_ERR",
139012
+ "UND_ERR_ABORTED",
139013
+ "ERR_HTTP2_STREAM_CANCEL"
139014
+ ].includes(marker));
139015
+ }
138931
139016
  }
138932
139017
  return collectErrorMarkers(err).some((m2) => TRANSIENT_CODES.has(m2));
138933
139018
  }
@@ -139287,7 +139372,7 @@ async function fetchV4(url, init2, config2, opName, attributes) {
139287
139372
  }
139288
139373
  } catch (cause) {
139289
139374
  noteEventsTransportOutcome(dispatcher2, cause);
139290
- const transportCode = getTransientTransportCode(cause);
139375
+ const transportCode = describeTransportFailure(cause);
139291
139376
  controller.error(transportCode ? new StreamError(`v4 ${opName}: response stream transport failure (${transportCode})`, { cause, url }) : cause);
139292
139377
  }
139293
139378
  },
@@ -139777,7 +139862,7 @@ function wsReplyStatus(reply, endpoint) {
139777
139862
  return status;
139778
139863
  }
139779
139864
  async function postEventFrameOverWs(input, config2) {
139780
- const { resolveWsTransport } = await import("./ws-transport-nlG6b7qI.js");
139865
+ const { resolveWsTransport } = await import("./ws-transport-BQdJnqBo.js");
139781
139866
  const { runId } = input;
139782
139867
  const resolved = resolveWsTransport(runId, config2);
139783
139868
  if (!resolved)
@@ -140095,6 +140180,9 @@ async function listWorkflowRuns(params = {}, config2) {
140095
140180
  const searchParams = new URLSearchParams();
140096
140181
  if (workflowName)
140097
140182
  searchParams.set("workflowName", workflowName);
140183
+ if (Array.isArray(status)) {
140184
+ throw new WorkflowWorldError("listWorkflowRuns: status does not support an array of statuses on world-vercel yet; pass a single status", { code: "INVALID_ARGUMENT", field: "status" });
140185
+ }
140098
140186
  if (status)
140099
140187
  searchParams.set("status", status);
140100
140188
  if (pagination == null ? void 0 : pagination.limit)
@@ -140853,7 +140941,7 @@ function beginNormalWsClose(ws, reason) {
140853
140941
  await observed;
140854
140942
  span == null ? void 0 : span.setAttribute("workflow.stream.ws.close_cleanup_timeout", timedOut);
140855
140943
  });
140856
- void import("./index-CvyMHP_b.js").then((n) => n.i).then(({ waitUntil: waitUntil2 }) => waitUntil2(cleanup)).catch(() => {
140944
+ void import("./index-CsLAjmyX.js").then((n) => n.i).then(({ waitUntil: waitUntil2 }) => waitUntil2(cleanup)).catch(() => {
140857
140945
  });
140858
140946
  void cleanup.catch(() => {
140859
140947
  });
@@ -141205,7 +141293,7 @@ class VercelStreamWriteSession {
141205
141293
  return http3;
141206
141294
  });
141207
141295
  const [{ WebSocket: WebSocketImpl }, http2] = await Promise.all([
141208
- import("./wrapper-BxY6HvLW.js"),
141296
+ import("./wrapper-CeBkFVzB.js"),
141209
141297
  httpPromise
141210
141298
  ]);
141211
141299
  if (this.mode !== "connecting")
@@ -141963,7 +142051,7 @@ globalSingleton("@workflow/core//devServerPort", 1, () => ({
141963
142051
  inFlight: void 0
141964
142052
  }));
141965
142053
  function waitUntil(promise2) {
141966
- void import("./index-CvyMHP_b.js").then((n) => n.i).then(({ waitUntil: waitUntil2 }) => {
142054
+ void import("./index-CsLAjmyX.js").then((n) => n.i).then(({ waitUntil: waitUntil2 }) => {
141967
142055
  waitUntil2(promise2);
141968
142056
  });
141969
142057
  }
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { b4 as reactExports, b5 as R, b6 as Ks, b7 as jsxRuntimeExports, b8 as Qe } from "./app-8hyjFpMO.js";
5
+ import { b4 as reactExports, b5 as R, b6 as Ks, b7 as jsxRuntimeExports, b8 as Qe } from "./app-Bh6jcVnZ.js";
6
6
  import "node:stream";
7
7
  import "stream";
8
8
  import "util";
@@ -1137,7 +1137,7 @@ function requireWebsocket() {
1137
1137
  const DEFAULT_MAX_PAYLOAD = 256 * 1024;
1138
1138
  async function loadWebSocketServer() {
1139
1139
  try {
1140
- const ws = await import("./wrapper-BxY6HvLW.js");
1140
+ const ws = await import("./wrapper-CeBkFVzB.js");
1141
1141
  return ws.WebSocketServer;
1142
1142
  } catch {
1143
1143
  throw new Error(
@@ -2,8 +2,8 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { H as HookSchema } from "./app-8hyjFpMO.js";
6
- import { A, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, B, r, s, t, u, C, D, v, E, w, x, y, F, z, G, I, J, K, L, M, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, $, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az, aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM, aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ, a_, a$, b0, b1, b2, b3 } from "./app-8hyjFpMO.js";
5
+ import { H as HookSchema } from "./app-Bh6jcVnZ.js";
6
+ import { A, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, B, r, s, t, u, C, D, v, E, w, x, y, F, z, G, I, J, K, L, M, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, $, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az, aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM, aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ, a_, a$, b0, b1, b2, b3 } from "./app-Bh6jcVnZ.js";
7
7
  import "node:stream";
8
8
  import "stream";
9
9
  import "util";
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { N as Nt } from "./app-8hyjFpMO.js";
5
+ import { N as Nt } from "./app-Bh6jcVnZ.js";
6
6
  import "node:stream";
7
7
  import "stream";
8
8
  import "util";
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { bs as requireTokenError, br as requireTokenUtil, bq as getDefaultExportFromCjs } from "./app-8hyjFpMO.js";
5
+ import { bs as requireTokenError, br as requireTokenUtil, bq as getDefaultExportFromCjs } from "./app-Bh6jcVnZ.js";
6
6
  function _mergeNamespaces(n, m) {
7
7
  for (var i = 0; i < m.length; i++) {
8
8
  const e = m[i];
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { bq as getDefaultExportFromCjs, br as requireTokenUtil } from "./app-8hyjFpMO.js";
5
+ import { bq as getDefaultExportFromCjs, br as requireTokenUtil } from "./app-Bh6jcVnZ.js";
6
6
  function _mergeNamespaces(n, m) {
7
7
  for (var i = 0; i < m.length; i++) {
8
8
  const e = m[i];
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { bt as getAugmentedNamespace, bq as getDefaultExportFromCjs } from "./app-8hyjFpMO.js";
5
+ import { bt as getAugmentedNamespace, bq as getDefaultExportFromCjs } from "./app-Bh6jcVnZ.js";
6
6
  import require$$0$2 from "stream";
7
7
  import require$$0$3 from "events";
8
8
  import require$$2$1 from "http";
@@ -2,9 +2,9 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { W as WebSocket } from "./websocket-server-D2905vlr.js";
6
- import { p, r, s, w, a, e, b } from "./websocket-server-D2905vlr.js";
7
- import "./app-8hyjFpMO.js";
5
+ import { W as WebSocket } from "./websocket-server-B8WVLAEO.js";
6
+ import { p, r, s, w, a, e, b } from "./websocket-server-B8WVLAEO.js";
7
+ import "./app-Bh6jcVnZ.js";
8
8
  import "node:stream";
9
9
  import "stream";
10
10
  import "util";
@@ -5,8 +5,8 @@ import { createRequire as __wkfCreateRequire } from "node:module";
5
5
  if (typeof require === "undefined") {
6
6
  globalThis.require = __wkfCreateRequire(import.meta.url);
7
7
  }
8
- import { ba as isWsEventsTransportEnabled, bb as debugLog, bc as getHttpUrl, bd as globalSingleton, be as version, bf as getHttpConfig, bg as headersToRecord, bh as getRequestTimeoutMs, bi as injectTraceContextIntoHeaders, bj as withHttpClientSpan, bk as ErrorType, bl as WorkflowWsReconnectAttempt, bm as NetworkProtocolName, bn as WorkflowEventsTransport, bo as distExports, bp as decodeFrames } from "./app-8hyjFpMO.js";
9
- import { W as WebSocket } from "./websocket-server-D2905vlr.js";
8
+ import { ba as isWsEventsTransportEnabled, bb as debugLog, bc as getHttpUrl, bd as globalSingleton, be as version, bf as getHttpConfig, bg as headersToRecord, bh as getRequestTimeoutMs, bi as injectTraceContextIntoHeaders, bj as withHttpClientSpan, bk as ErrorType, bl as WorkflowWsReconnectAttempt, bm as NetworkProtocolName, bn as WorkflowEventsTransport, bo as distExports, bp as decodeFrames } from "./app-Bh6jcVnZ.js";
9
+ import { W as WebSocket } from "./websocket-server-B8WVLAEO.js";
10
10
  import "node:stream";
11
11
  import "stream";
12
12
  import "util";
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { b9 as registerZstdDecoder } from "./app-8hyjFpMO.js";
5
+ import { b9 as registerZstdDecoder } from "./app-Bh6jcVnZ.js";
6
6
  import "node:stream";
7
7
  import "stream";
8
8
  import "util";
@@ -2,7 +2,7 @@ import { createRequire as __wkfCreateRequire } from "node:module";
2
2
  if (typeof require === "undefined") {
3
3
  globalThis.require = __wkfCreateRequire(import.meta.url);
4
4
  }
5
- import { bu, bv } from "./assets/app-8hyjFpMO.js";
5
+ import { bu, bv } from "./assets/app-Bh6jcVnZ.js";
6
6
  import "express";
7
7
  import "node:stream";
8
8
  import "stream";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web",
3
3
  "description": "Workflow Observability UI",
4
- "version": "5.0.0-beta.51",
4
+ "version": "5.0.0-beta.53",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "files": [
@@ -39,7 +39,7 @@
39
39
  "directory": "packages/web"
40
40
  },
41
41
  "dependencies": {
42
- "@workflow/world-local": "5.0.0-beta.44",
42
+ "@workflow/world-local": "5.0.0-beta.45",
43
43
  "express": "^5.2.1",
44
44
  "swr": "^2.3.6"
45
45
  },
@@ -65,12 +65,12 @@
65
65
  "@types/react": "19",
66
66
  "@types/react-dom": "19",
67
67
  "@vercel/react-router": "1.2.6",
68
- "@workflow/core": "5.0.0-beta.51",
68
+ "@workflow/core": "5.0.0-beta.53",
69
69
  "@workflow/errors": "5.0.0-beta.21",
70
70
  "@workflow/utils": "5.0.0-beta.10",
71
- "@workflow/web-shared": "5.0.0-beta.51",
72
- "@workflow/world": "5.0.0-beta.35",
73
- "@workflow/world-vercel": "5.0.0-beta.46",
71
+ "@workflow/web-shared": "5.0.0-beta.53",
72
+ "@workflow/world": "5.0.0-beta.36",
73
+ "@workflow/world-vercel": "5.0.0-beta.48",
74
74
  "@xyflow/react": "12.10.1",
75
75
  "cbor-x": "^1",
76
76
  "class-variance-authority": "0.7.1",