@workflow/web 5.0.0-beta.8 → 5.0.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/build/client/assets/{highlighted-body-B3W2YXNL-WHMd9MPa.js → highlighted-body-B3W2YXNL-ijzNrESJ.js} +1 -1
  2. package/build/client/assets/{home-Cai0GqMt.js → home-MRChHR_P.js} +2 -2
  3. package/build/client/assets/{manifest-127f70fe.js → manifest-b100514d.js} +1 -1
  4. package/build/client/assets/{mermaid-3ZIDBTTL-TNUP6Q3m.js → mermaid-3ZIDBTTL-3cOa-aZ5.js} +179 -48
  5. package/build/client/assets/{root-ORTTXEp6.js → root-3uuTxUQN.js} +1 -1
  6. package/build/client/assets/root-BYtlAgHl.css +1 -0
  7. package/build/client/assets/{run-detail-DNZJxxPM.js → run-detail-8qGjUNCj.js} +50 -23
  8. package/build/client/assets/server-build-ByHD2s6b.css +1 -0
  9. package/build/client/assets/{workflow-graph-viewer-DKqOOMnz.js → workflow-graph-viewer-DaYMiBT9.js} +1 -1
  10. package/build/server/assets/{app-BxqFvIap.js → app-BEgkHdDF.js} +1 -1
  11. package/build/server/assets/{highlighted-body-B3W2YXNL-BuIiME1D.js → highlighted-body-B3W2YXNL-B4fAdNsB.js} +2 -2
  12. package/build/server/assets/{index-CdMzuwNr.js → index-DltGJ3CV.js} +3 -3
  13. package/build/server/assets/{mermaid-3ZIDBTTL-TSh7T1Pv.js → mermaid-3ZIDBTTL-C6M7jb0V.js} +2 -2
  14. package/build/server/assets/{server-build-fc5Vuxba.js → server-build-Ctg6FoI8.js} +260 -69
  15. package/build/server/assets/{token--89oCxEK.js → token-BNjLoJXz.js} +2 -2
  16. package/build/server/assets/{token-util-N0DDbkKZ.js → token-util-DwTdh-aG.js} +2 -2
  17. package/build/server/index.js +1 -1
  18. package/package.json +4 -4
  19. package/build/client/assets/root-COvK3yNk.css +0 -1
  20. package/build/client/assets/server-build-DzzvWTSG.css +0 -1
@@ -14,7 +14,7 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
14
14
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
15
15
  var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
16
16
  var _a2, _b, _c, _listeners, _onabort, _reader, _root, _hasMagic, _uflag, _parts, _parent, _parentIndex, _negs, _filledNegs, _options, _toString, _emptyExt, _AST_instances, fillNegs_fn, _AST_static, parseAST_fn, canAdoptWithSpace_fn, canAdopt_fn, canAdoptType_fn, adoptWithSpace_fn, adopt_fn, canUsurpType_fn, canUsurp_fn, usurp_fn, flatten_fn, partsToRegExp_fn, parseGlob_fn, _Minimatch_instances, matchGlobstar_fn, matchGlobStarBodySections_fn, matchOne_fn, _worldPromise, _Run_instances, lazyWorldPromise_get, _encryptionKeyPromise, _resilientStart, getEncryptionKey_fn, pollReturnValue_fn;
17
- import { a as requireReact, S as ServerRouter, c as createReadableStreamFromReadable, r as reactExports, g as getDefaultExportFromCjs, R as React, b as ReactExports, w as withComponentProps, d as withErrorBoundaryProps, M as Meta, L as Links, e as ScrollRestoration, f as Scripts, O as Outlet, u as useNavigate, h as useSearchParams, i as Link$1, j as useRouteError, k as isRouteErrorResponse, l as useLocation, m as useParams } from "./app-BxqFvIap.js";
17
+ import { a as requireReact, S as ServerRouter, c as createReadableStreamFromReadable, r as reactExports, g as getDefaultExportFromCjs, R as React, b as ReactExports, w as withComponentProps, d as withErrorBoundaryProps, M as Meta, L as Links, e as ScrollRestoration, f as Scripts, O as Outlet, u as useNavigate, h as useSearchParams, i as Link$1, j as useRouteError, k as isRouteErrorResponse, l as useLocation, m as useParams } from "./app-BEgkHdDF.js";
18
18
  import require$$0$3, { PassThrough } from "node:stream";
19
19
  import require$$0 from "util";
20
20
  import require$$1 from "crypto";
@@ -50642,7 +50642,14 @@ const buttonVariants$1 = cva([
50642
50642
  "!text-gray-100",
50643
50643
  "bg-gray-1000",
50644
50644
  "transition-[border-color,background,color,transform,box-shadow] duration-150 ease-in-out",
50645
- "hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]",
50645
+ // Geist invert hover: literal fallbacks (no token dep, so it resolves in any
50646
+ // consuming app), darkened via ancestor theme class without a registered variant.
50647
+ "hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))]",
50648
+ "[.dark-theme_&]:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]",
50649
+ "[[data-theme=dark]_&]:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]",
50650
+ // Geist focus ring as arbitrary properties (no bare `outline`/ambiguous
50651
+ // arbitrary-color utilities, which differ between Tailwind v3 and v4).
50652
+ "focus-visible:[outline:2px_solid_var(--ds-focus-color)] focus-visible:[outline-offset:2px]",
50646
50653
  // disabled styles
50647
50654
  "disabled:cursor-not-allowed aria-disabled:cursor-not-allowed",
50648
50655
  "disabled:bg-gray-100 disabled:!text-gray-700 disabled:hover:bg-gray-100",
@@ -50657,7 +50664,7 @@ const buttonVariants$1 = cva([
50657
50664
  size: {
50658
50665
  default: "h-10 px-4 text-[14px]",
50659
50666
  sm: "h-8 px-3 text-[14px]",
50660
- xs: "h-6 px-1.5 py-0.5 text-button-12",
50667
+ xs: "h-6 px-1.5 py-0.5 text-button-12 rounded-[4px]",
50661
50668
  icon: "h-8 w-8"
50662
50669
  }
50663
50670
  },
@@ -80530,7 +80537,7 @@ var tn = f("block", "before:content-[counter(line)]", "before:inline-block", "be
80530
80537
  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 });
80531
80538
  var Se = reactExports.createContext({ code: "" }), de = () => reactExports.useContext(Se);
80532
80539
  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 }) });
80533
- var cn$1 = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-BuIiME1D.js").then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
80540
+ var cn$1 = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-B4fAdNsB.js").then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
80534
80541
  let i = reactExports.useMemo(() => e.replace(cn$1, ""), [e]), c = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i.split(`
80535
80542
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i]);
80536
80543
  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 }) })] }) });
@@ -80852,7 +80859,7 @@ var Dt = ({ children: e, className: t, onDownload: o, onError: n }) => {
80852
80859
  }, []), 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] });
80853
80860
  };
80854
80861
  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 }) })] });
80855
- var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-TSh7T1Pv.js").then((e) => ({ default: e.Mermaid }))), Kn = /language-([^\s]+)/;
80862
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-C6M7jb0V.js").then((e) => ({ default: e.Mermaid }))), Kn = /language-([^\s]+)/;
80856
80863
  function ke(e, t) {
80857
80864
  if (!(e != null && e.position || t != null && t.position)) return true;
80858
80865
  if (!(e != null && e.position && (t != null && t.position))) return false;
@@ -83476,6 +83483,30 @@ function StreamViewer({ streamId: _streamId, chunks, isLive, error: error2, isLo
83476
83483
  color: "var(--ds-gray-600)"
83477
83484
  }, children: isLive ? "Waiting for stream data..." : "Stream is empty" }) : jsxRuntimeExports.jsx(Yr, { ref: virtuosoRef, totalCount: chunks.length, overscan: 10, endReached: () => onScrollEnd == null ? void 0 : onScrollEnd(), itemContent: (index2) => jsxRuntimeExports.jsx("div", { style: { paddingBottom: 8 }, children: jsxRuntimeExports.jsx(ChunkRow, { chunk: chunks[index2], index: index2 }) }), style: { flex: 1, minHeight: 0 } }) })] });
83478
83485
  }
83486
+ const iconButtonVariants = cva([
83487
+ "m-0 inline-flex shrink-0 appearance-none items-center justify-center border-0 bg-transparent p-0 align-baseline font-inherit no-underline [background:none] [-webkit-appearance:none] [-webkit-tap-highlight-color:transparent]",
83488
+ "transition-colors duration-150 ease-in-out",
83489
+ "enabled:cursor-pointer disabled:cursor-not-allowed disabled:opacity-40",
83490
+ "focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] focus-visible:outline-offset-2"
83491
+ ], {
83492
+ variants: {
83493
+ variant: {
83494
+ tertiary: "text-gray-900 enabled:hover:bg-gray-alpha-200 enabled:hover:text-gray-1000 enabled:active:bg-gray-alpha-200 focus-visible:text-gray-1000",
83495
+ muted: "text-gray-900 enabled:hover:bg-gray-alpha-200 enabled:hover:text-gray-1000 enabled:active:bg-gray-alpha-200 focus-visible:text-gray-1000"
83496
+ },
83497
+ size: {
83498
+ tiny: "h-6 w-6 rounded-[4px] [&_svg]:h-4 [&_svg]:w-4",
83499
+ small: "h-8 w-8 rounded-md [&_svg]:h-4 [&_svg]:w-4"
83500
+ }
83501
+ },
83502
+ defaultVariants: {
83503
+ variant: "tertiary",
83504
+ size: "tiny"
83505
+ }
83506
+ });
83507
+ function IconButton({ className, variant, size: size2, type = "button", ...props }) {
83508
+ return jsxRuntimeExports.jsx("button", { type, className: cn$4(iconButtonVariants({ variant, size: size2, className })), ...props });
83509
+ }
83479
83510
  const QUERY = "(prefers-reduced-motion: reduce)";
83480
83511
  const useReducedMotion = () => {
83481
83512
  const [reduced, setReduced] = reactExports.useState(() => {
@@ -83506,6 +83537,128 @@ const SleepIcon = () => {
83506
83537
  const StepForwardIcon = () => {
83507
83538
  return jsxRuntimeExports.jsx("svg", { "data-testid": "geist-icon", height: "16", strokeLinejoin: "round", viewBox: "0 0 16 16", width: "16", style: { color: "currentColor" }, children: jsxRuntimeExports.jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4.21969 12.5303L4.75002 13.0607L5.81068 12L5.28035 11.4697L1.81068 7.99999L5.28035 4.53032L5.81068 3.99999L4.75002 2.93933L4.21969 3.46966L0.39647 7.29289C0.00594562 7.68341 0.00594562 8.31658 0.39647 8.7071L4.21969 12.5303ZM11.7804 12.5303L11.25 13.0607L10.1894 12L10.7197 11.4697L14.1894 7.99999L10.7197 4.53032L10.1894 3.99999L11.25 2.93933L11.7804 3.46966L15.6036 7.29289C15.9941 7.68341 15.9941 8.31658 15.6036 8.7071L11.7804 12.5303Z", fill: "currentColor" }) });
83508
83539
  };
83540
+ const ATTR_FILTER_REGEX = /(?:^|\s)(?<pair>(?<key>[\w.]+):(?<value>\S*))/g;
83541
+ function parseSpanSearchQuery(rawQuery) {
83542
+ var _a3, _b2, _c2;
83543
+ const attributes = [];
83544
+ for (const match2 of rawQuery.matchAll(ATTR_FILTER_REGEX)) {
83545
+ const key = (_b2 = (_a3 = match2.groups) == null ? void 0 : _a3.key) == null ? void 0 : _b2.trim();
83546
+ if (!key)
83547
+ continue;
83548
+ attributes.push({
83549
+ key,
83550
+ value: (((_c2 = match2.groups) == null ? void 0 : _c2.value) ?? "").toLocaleLowerCase()
83551
+ });
83552
+ }
83553
+ const text2 = rawQuery.replace(ATTR_FILTER_REGEX, " ").replace(/\s{2,}/g, " ").trim().toLocaleLowerCase();
83554
+ return { text: text2, attributes };
83555
+ }
83556
+ function isSpanDimmedBySearch(spanId, result) {
83557
+ return result.isActive && !result.matchedSpanIds.has(spanId);
83558
+ }
83559
+ function searchSpans(spans, rawQuery) {
83560
+ const query = parseSpanSearchQuery(rawQuery);
83561
+ const isActive = Boolean(query.text || query.attributes.length);
83562
+ const matchingSpans = isActive ? spans.filter((span) => spanMatchesQuery(span, query)) : spans;
83563
+ return {
83564
+ isActive,
83565
+ matchedSpanIds: new Set(matchingSpans.map((span) => span.spanId)),
83566
+ matchingSpans,
83567
+ query
83568
+ };
83569
+ }
83570
+ function spanMatchesQuery(span, query) {
83571
+ if (query.text && !spanMatchesText(span, query.text)) {
83572
+ return false;
83573
+ }
83574
+ return query.attributes.every(({ key, value }) => spanMatchesAttribute(span, key, value));
83575
+ }
83576
+ function spanMatchesText(span, text2) {
83577
+ return [
83578
+ span.name,
83579
+ span.spanId,
83580
+ span.resource,
83581
+ span.library.name,
83582
+ span.library.version
83583
+ ].filter((value) => typeof value === "string").some((value) => value.toLocaleLowerCase().includes(text2));
83584
+ }
83585
+ function spanMatchesAttribute(span, key, expectedValue) {
83586
+ const candidates = getSearchValues(span, key);
83587
+ if (!candidates.length)
83588
+ return false;
83589
+ if (!expectedValue) {
83590
+ return candidates.some((value) => value != null);
83591
+ }
83592
+ return candidates.some((value) => valueToSearchString(value).toLocaleLowerCase().includes(expectedValue));
83593
+ }
83594
+ function getSearchValues(span, key) {
83595
+ const candidates = [];
83596
+ const normalizedKey = key.toLocaleLowerCase();
83597
+ switch (normalizedKey) {
83598
+ case "id":
83599
+ case "spanid":
83600
+ case "span.id":
83601
+ candidates.push(span.spanId);
83602
+ break;
83603
+ case "name":
83604
+ candidates.push(span.name);
83605
+ break;
83606
+ case "resource":
83607
+ candidates.push(span.resource);
83608
+ break;
83609
+ case "library":
83610
+ case "library.name":
83611
+ candidates.push(span.library.name);
83612
+ break;
83613
+ case "library.version":
83614
+ candidates.push(span.library.version);
83615
+ break;
83616
+ case "status":
83617
+ case "status.code":
83618
+ candidates.push(span.status.code);
83619
+ break;
83620
+ }
83621
+ candidates.push(getOwnProperty(span.attributes, key));
83622
+ candidates.push(getPathValue(span.attributes, key));
83623
+ if (!normalizedKey.startsWith("data.")) {
83624
+ candidates.push(getPathValue(span.attributes.data, key));
83625
+ }
83626
+ return candidates.filter((value) => value !== void 0);
83627
+ }
83628
+ function getOwnProperty(source, key) {
83629
+ if (!source || typeof source !== "object")
83630
+ return void 0;
83631
+ if (!Object.hasOwn(source, key))
83632
+ return void 0;
83633
+ return source[key];
83634
+ }
83635
+ function getPathValue(source, path2) {
83636
+ if (!source || typeof source !== "object")
83637
+ return void 0;
83638
+ let current = source;
83639
+ for (const segment2 of path2.split(".")) {
83640
+ if (!segment2)
83641
+ return void 0;
83642
+ current = getOwnProperty(current, segment2);
83643
+ if (current === void 0)
83644
+ return void 0;
83645
+ }
83646
+ return current;
83647
+ }
83648
+ function valueToSearchString(value) {
83649
+ if (value instanceof Date)
83650
+ return value.toISOString();
83651
+ if (typeof value === "string")
83652
+ return value;
83653
+ if (value == null || typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
83654
+ return String(value);
83655
+ }
83656
+ try {
83657
+ return JSON.stringify(value);
83658
+ } catch {
83659
+ return String(value);
83660
+ }
83661
+ }
83509
83662
  function computeRootBounds(spans) {
83510
83663
  let minStart = Number.POSITIVE_INFINITY;
83511
83664
  let maxEnd = Number.NEGATIVE_INFINITY;
@@ -83847,15 +84000,15 @@ function getEventStyle(resource, isErrored) {
83847
84000
  className: cn$4(isErrored ? "text-red-900" : style2.className)
83848
84001
  };
83849
84002
  }
83850
- const EventRow = ({ span, isSelected, onSelectSpan }) => {
84003
+ const EventRow = ({ span, isSelected, isDimmed, onSelectSpan }) => {
83851
84004
  const durationMs = getSpanDurationMs(span);
83852
84005
  const isErrored = span.attributes.data.status === "failed";
83853
84006
  const { icon: Icon2, className: tagClassName } = getEventStyle(span.resource, isErrored);
83854
- return jsxRuntimeExports.jsx("li", { className: cn$4("relative overflow-clip group after:absolute after:inset-x-0 after:bottom-0 after:h-px after:bg-gray-alpha-400", ROW_HEIGHT_CLASS), role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, onClick: () => onSelectSpan(span.spanId), children: jsxRuntimeExports.jsx("div", { className: "h-full hover:bg-gray-100 group-aria-selected:bg-gray-100 group-aria-selected:hover:bg-gray-200", children: jsxRuntimeExports.jsxs("div", { className: "flex h-full min-w-0 items-center pl-4 pr-2", children: [jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [jsxRuntimeExports.jsx("span", { className: cn$4("shrink-0", tagClassName), children: jsxRuntimeExports.jsx(Icon2, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx("span", { className: "min-w-0 text-label-14", children: jsxRuntimeExports.jsx(MiddleTruncate, { value: span.name }) })] }), jsxRuntimeExports.jsx("div", { className: "ml-2 shrink-0", children: jsxRuntimeExports.jsx("span", { className: "text-label-14 text-gray-900 tabular-nums", children: formatDuration(durationMs) }) })] }) }) });
84007
+ return jsxRuntimeExports.jsx("li", { className: cn$4("relative overflow-clip group transition-opacity", ROW_HEIGHT_CLASS, isDimmed && "opacity-35"), role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, onClick: () => onSelectSpan(span.spanId), children: jsxRuntimeExports.jsx("div", { className: "h-full hover:bg-gray-100 group-aria-selected:bg-gray-100 group-aria-selected:hover:bg-gray-200", children: jsxRuntimeExports.jsxs("div", { className: "flex h-full min-w-0 items-center pl-4 pr-2", children: [jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [jsxRuntimeExports.jsx("span", { className: cn$4("shrink-0", tagClassName), children: jsxRuntimeExports.jsx(Icon2, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx("span", { className: "min-w-0 text-label-14", children: jsxRuntimeExports.jsx(MiddleTruncate, { value: span.name }) })] }), jsxRuntimeExports.jsx("div", { className: "ml-2 shrink-0", children: jsxRuntimeExports.jsx("span", { className: "text-label-14 text-gray-900 tabular-nums", children: formatDuration(durationMs) }) })] }) }) });
83855
84008
  };
83856
- const EventList = ({ spans, activeSpanId, onSelectSpan }) => {
83857
- return jsxRuntimeExports.jsx("ul", { id: "event-list", role: "tree", className: "block min-h-0 overflow-visible", children: spans.map((span) => {
83858
- return jsxRuntimeExports.jsx(EventRow, { span, isSelected: span.spanId === activeSpanId, onSelectSpan }, span.spanId);
84009
+ const EventList = ({ spans, activeSpanId, searchResult, onSelectSpan }) => {
84010
+ return jsxRuntimeExports.jsx("ul", { id: "event-list", role: "tree", className: "block min-h-0 overflow-visible divide-y divide-gray-alpha-400 border-b border-gray-alpha-400", children: spans.map((span) => {
84011
+ return jsxRuntimeExports.jsx(EventRow, { span, isSelected: span.spanId === activeSpanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelectSpan }, span.spanId);
83859
84012
  }) });
83860
84013
  };
83861
84014
  const GUTTER_PX = 1;
@@ -84055,7 +84208,7 @@ function SegmentBar({ segments }) {
84055
84208
  }, children: showLabel ? jsxRuntimeExports.jsx(DurationLabel, { label }) : null }, `${seg.status}-${i}`);
84056
84209
  }) });
84057
84210
  }
84058
- const TimelineBar = reactExports.memo(function TimelineBar2({ span, viewStart, viewDuration, containerWidth, isSelected, onSelect }) {
84211
+ const TimelineBar = reactExports.memo(function TimelineBar2({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect }) {
84059
84212
  var _a3;
84060
84213
  const startMs = getHighResInMs(span.startTime);
84061
84214
  const endMs = getHighResInMs(span.endTime);
@@ -84073,7 +84226,7 @@ const TimelineBar = reactExports.memo(function TimelineBar2({ span, viewStart, v
84073
84226
  const handleClick = reactExports.useCallback(() => {
84074
84227
  onSelect(span.spanId);
84075
84228
  }, [onSelect, span.spanId]);
84076
- return jsxRuntimeExports.jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: "group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200", onClick: handleClick, children: jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: jsxRuntimeExports.jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2", style: getBarPositionStyle(geometry), children: geometry.mode.kind === "arrow" ? jsxRuntimeExports.jsx(BoundaryArrow, { direction: geometry.mode.direction }) : geometry.mode.kind === "tiny" ? jsxRuntimeExports.jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } }) : segments.length > 0 ? jsxRuntimeExports.jsx(SegmentBar, { segments }) : jsxRuntimeExports.jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null }) }) }) });
84229
+ return jsxRuntimeExports.jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn$4("group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity", isDimmed && "opacity-35"), onClick: handleClick, children: jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: jsxRuntimeExports.jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === "arrow" ? jsxRuntimeExports.jsx(BoundaryArrow, { direction: geometry.mode.direction }) : geometry.mode.kind === "tiny" ? jsxRuntimeExports.jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } }) : segments.length > 0 ? jsxRuntimeExports.jsx(SegmentBar, { segments }) : jsxRuntimeExports.jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null }) }) }) });
84077
84230
  });
84078
84231
  const DELTA_ROW_HEIGHT_PX = 40;
84079
84232
  const DELTA_CAP_HEIGHT_PX = 8;
@@ -84090,7 +84243,7 @@ const DeltaIndicator = reactExports.memo(function DeltaIndicator2({ leftFrac, ri
84090
84243
  function TimelineHeader({ markers: markers2, hoverInfo: hoverInfo2 }) {
84091
84244
  return jsxRuntimeExports.jsx("div", { className: "relative bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-end px-4 pb-1", children: jsxRuntimeExports.jsxs("div", { className: "relative h-full flex-1", children: [markers2.map((m2) => jsxRuntimeExports.jsx("span", { className: "absolute bottom-1 font-mono text-xs font-normal leading-4 text-gray-900 whitespace-nowrap", style: { left: `${m2.position * 100}%` }, children: m2.label }, `${m2.position}-${m2.label}`)), hoverInfo2 && jsxRuntimeExports.jsx("span", { className: "absolute top-1 pointer-events-none z-10 font-mono text-[11px] leading-4 text-gray-1000 whitespace-nowrap bg-background-100 border border-gray-alpha-400 rounded px-1 -translate-x-1/2", style: { left: `${hoverInfo2.fraction * 100}%` }, children: hoverInfo2.label })] }) });
84092
84245
  }
84093
- function Timeline({ spans, viewStart, viewEnd, markers: markers2, selectedId, onSelect, hoverFraction, altHeld = false }) {
84246
+ function Timeline({ spans, viewStart, viewEnd, markers: markers2, selectedId, searchResult, onSelect, hoverFraction, altHeld = false }) {
84094
84247
  const containerRef = reactExports.useRef(null);
84095
84248
  const [containerWidth, setContainerWidth] = reactExports.useState(0);
84096
84249
  const viewDuration = viewEnd - viewStart;
@@ -84109,7 +84262,7 @@ function Timeline({ spans, viewStart, viewEnd, markers: markers2, selectedId, on
84109
84262
  return jsxRuntimeExports.jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", children: [jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers2.map((marker2) => (
84110
84263
  // Skip the "0s" origin marker since the left edge already implies it.
84111
84264
  Math.abs(marker2.value) > 1e-6 ? jsxRuntimeExports.jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker2.position * 100}%` } }, `${marker2.position}-${marker2.label}`) : null
84112
- )) }), hoverFraction != null && jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: jsxRuntimeExports.jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hoverFraction * 100}%` } }) }), spans.map((span) => jsxRuntimeExports.jsx(TimelineBar, { span, viewStart, viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, onSelect }, span.spanId)), altHeld && jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gaps.map((gap) => jsxRuntimeExports.jsx(DeltaIndicator, { leftFrac: gap.leftFrac, rightFrac: gap.rightFrac, label: formatDuration(gap.gapMs, true), rowIndex: gap.rowIndex }, gap.rowIndex)) })] });
84265
+ )) }), hoverFraction != null && jsxRuntimeExports.jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: jsxRuntimeExports.jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hoverFraction * 100}%` } }) }), spans.map((span) => jsxRuntimeExports.jsx(TimelineBar, { span, viewStart, viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect }, span.spanId)), altHeld && jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gaps.map((gap) => jsxRuntimeExports.jsx(DeltaIndicator, { leftFrac: gap.leftFrac, rightFrac: gap.rightFrac, label: formatDuration(gap.gapMs, true), rowIndex: gap.rowIndex }, gap.rowIndex)) })] });
84113
84266
  }
84114
84267
  const ActiveSpanContext = reactExports.createContext(null);
84115
84268
  ActiveSpanContext.displayName = "ActiveSpanContext";
@@ -84159,7 +84312,7 @@ function DetailPanel({ span, rootStart, onClose }) {
84159
84312
  const startMs = getHighResInMs(span.startTime);
84160
84313
  const durationMs = getSpanDurationMs(span);
84161
84314
  const offsetMs = startMs - rootStart;
84162
- return jsxRuntimeExports.jsxs("aside", { className: "grid h-full max-h-full grid-rows-[2.5rem_1fr] bg-background-200", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 border-b border-gray-alpha-400", children: [jsxRuntimeExports.jsx("span", { className: "text-sm font-medium text-gray-1000 truncate", children: span.name }), jsxRuntimeExports.jsx("button", { type: "button", className: "p-1 rounded-md text-gray-1000 hover:bg-gray-alpha-100 transition-colors", onClick: onClose, children: jsxRuntimeExports.jsx(X$3, { className: "w-4 h-4" }) })] }), jsxRuntimeExports.jsx("div", { className: "overflow-y-auto p-3 space-y-3", children: jsxRuntimeExports.jsxs("dl", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5 text-sm", children: [jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Resource" }), jsxRuntimeExports.jsx("dd", { className: "text-gray-1000 font-mono", children: span.resource }), jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Duration" }), jsxRuntimeExports.jsx("dd", { className: "text-gray-1000 tabular-nums font-mono", children: formatDuration(durationMs) }), jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Offset" }), jsxRuntimeExports.jsxs("dd", { className: "text-gray-1000 tabular-nums font-mono", children: ["+", formatDuration(offsetMs)] }), jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Status" }), jsxRuntimeExports.jsx("dd", { className: "text-gray-1000 font-mono", children: span.status.code === 2 ? "Error" : "OK" })] }) })] });
84315
+ return jsxRuntimeExports.jsxs("aside", { className: "grid h-full max-h-full grid-rows-[2.5rem_1fr] bg-background-200", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 border-b border-gray-alpha-400", children: [jsxRuntimeExports.jsx("span", { className: "text-sm font-medium text-gray-1000 truncate", children: span.name }), jsxRuntimeExports.jsx(IconButton, { "aria-label": "Close span details", onClick: onClose, children: jsxRuntimeExports.jsx(X$3, { className: "w-4 h-4" }) })] }), jsxRuntimeExports.jsx("div", { className: "overflow-y-auto p-3 space-y-3", children: jsxRuntimeExports.jsxs("dl", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5 text-sm", children: [jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Resource" }), jsxRuntimeExports.jsx("dd", { className: "text-gray-1000 font-mono", children: span.resource }), jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Duration" }), jsxRuntimeExports.jsx("dd", { className: "text-gray-1000 tabular-nums font-mono", children: formatDuration(durationMs) }), jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Offset" }), jsxRuntimeExports.jsxs("dd", { className: "text-gray-1000 tabular-nums font-mono", children: ["+", formatDuration(offsetMs)] }), jsxRuntimeExports.jsx("dt", { className: "text-gray-900", children: "Status" }), jsxRuntimeExports.jsx("dd", { className: "text-gray-1000 font-mono", children: span.status.code === 2 ? "Error" : "OK" })] }) })] });
84163
84316
  }
84164
84317
  const MIN_VIEWPORT_MS = 1e-3;
84165
84318
  function useAnimatedViewport(initial) {
@@ -84229,7 +84382,7 @@ function useSelectedSpanInfo() {
84229
84382
  spanId: activeSpan.spanId,
84230
84383
  rawEvents
84231
84384
  };
84232
- }, [activeSpan, sidebar == null ? void 0 : sidebar.events]);
84385
+ }, [activeSpan, sidebar]);
84233
84386
  }
84234
84387
  function NewTraceViewer$1({ trace: trace2 }) {
84235
84388
  return jsxRuntimeExports.jsx(ActiveSpanProvider, { spans: trace2.spans, children: jsxRuntimeExports.jsx(NewTraceViewerContent, { trace: trace2 }) });
@@ -84239,12 +84392,8 @@ function NewTraceViewerContent({ trace: trace2 }) {
84239
84392
  const sidebar = useSidebarDataOptional();
84240
84393
  const selectedSpan = useSelectedSpanInfo();
84241
84394
  const [searchQuery, setSearchQuery] = reactExports.useState("");
84242
- const filteredSpans = reactExports.useMemo(() => {
84243
- const q2 = searchQuery.trim().toLowerCase();
84244
- if (!q2)
84245
- return trace2.spans;
84246
- return trace2.spans.filter((s2) => s2.name.toLowerCase().includes(q2) || s2.resource.toLowerCase().includes(q2));
84247
- }, [trace2.spans, searchQuery]);
84395
+ const deferredSearchQuery = reactExports.useDeferredValue(searchQuery);
84396
+ const searchResult = reactExports.useMemo(() => searchSpans(trace2.spans, deferredSearchQuery), [trace2.spans, deferredSearchQuery]);
84248
84397
  const root2 = reactExports.useMemo(() => computeRootBounds(trace2.spans), [trace2.spans]);
84249
84398
  const { viewport, setViewport, animateTo } = useAnimatedViewport({
84250
84399
  start: root2.startTime,
@@ -84266,7 +84415,7 @@ function NewTraceViewerContent({ trace: trace2 }) {
84266
84415
  return prev;
84267
84416
  });
84268
84417
  prevRootRef.current = { start: newStart, end: newEnd };
84269
- }, [root2.startTime, root2.duration]);
84418
+ }, [root2.startTime, root2.duration, setViewport]);
84270
84419
  const viewDuration = viewport.end - viewport.start;
84271
84420
  const timeMarkers = reactExports.useMemo(() => computeTimeMarkers(viewDuration, viewport.start - root2.startTime), [viewDuration, viewport.start, root2.startTime]);
84272
84421
  const resetZoom = reactExports.useCallback(() => {
@@ -84427,7 +84576,8 @@ function NewTraceViewerContent({ trace: trace2 }) {
84427
84576
  if (e.deltaMode === 1)
84428
84577
  dy *= 16;
84429
84578
  const cursorFraction = Math.max(0, Math.min(1, (e.clientX - rect.left - TIMELINE_PADDING_PX) / contentWidth));
84430
- const scaleFactor = Math.pow(2, dy / 200);
84579
+ const isMouseWheel = e.deltaMode === 1 || Math.abs(e.deltaY) >= 50;
84580
+ const scaleFactor = Math.pow(2, dy / (isMouseWheel ? 200 : 60));
84431
84581
  setViewport((prev) => {
84432
84582
  const prevDuration = prev.end - prev.start;
84433
84583
  const cursorTime = prev.start + cursorFraction * prevDuration;
@@ -84467,7 +84617,7 @@ function NewTraceViewerContent({ trace: trace2 }) {
84467
84617
  };
84468
84618
  el.addEventListener("wheel", onWheel, { passive: false });
84469
84619
  return () => el.removeEventListener("wheel", onWheel);
84470
- }, [root2.startTime, root2.duration]);
84620
+ }, [root2.startTime, root2.duration, setViewport]);
84471
84621
  const selectedSpanName = reactExports.useMemo(() => {
84472
84622
  var _a3, _b2;
84473
84623
  if (!(selectedSpan == null ? void 0 : selectedSpan.data))
@@ -84484,14 +84634,14 @@ function NewTraceViewerContent({ trace: trace2 }) {
84484
84634
  var _a3, _b2;
84485
84635
  if (!activeSpanId)
84486
84636
  return { prevSpanId: null, nextSpanId: null };
84487
- const i = filteredSpans.findIndex((s2) => s2.spanId === activeSpanId);
84637
+ const i = trace2.spans.findIndex((s2) => s2.spanId === activeSpanId);
84488
84638
  if (i === -1)
84489
84639
  return { prevSpanId: null, nextSpanId: null };
84490
84640
  return {
84491
- prevSpanId: ((_a3 = filteredSpans[i - 1]) == null ? void 0 : _a3.spanId) ?? null,
84492
- nextSpanId: ((_b2 = filteredSpans[i + 1]) == null ? void 0 : _b2.spanId) ?? null
84641
+ prevSpanId: ((_a3 = trace2.spans[i - 1]) == null ? void 0 : _a3.spanId) ?? null,
84642
+ nextSpanId: ((_b2 = trace2.spans[i + 1]) == null ? void 0 : _b2.spanId) ?? null
84493
84643
  };
84494
- }, [activeSpanId, filteredSpans]);
84644
+ }, [activeSpanId, trace2.spans]);
84495
84645
  const handleSelectPrevSpan = reactExports.useCallback(() => {
84496
84646
  if (prevSpanId)
84497
84647
  handleSelectSpan(prevSpanId);
@@ -84506,7 +84656,13 @@ function NewTraceViewerContent({ trace: trace2 }) {
84506
84656
  prevSpanIdRef.current = prevSpanId;
84507
84657
  nextSpanIdRef.current = nextSpanId;
84508
84658
  handleSelectSpanRef.current = handleSelectSpan;
84509
- return jsxRuntimeExports.jsxs("div", { "data-pane": "pane-root", "data-has-detail": activeSpan ? "" : void 0, className: "grid w-full h-full max-h-full grid-cols-[minmax(100px,1fr)] data-[has-detail]:grid-cols-[minmax(100px,1fr)_clamp(280px,420px,100%)]", children: [jsxRuntimeExports.jsxs("div", { id: "trace-parent", className: "grid grid-rows-[1fr] h-full min-h-0 overflow-hidden relative bg-background-100", children: [jsxRuntimeExports.jsxs(SplitPane, { startHeader: jsxRuntimeExports.jsxs("div", { className: "bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center pl-4 pr-2 gap-1.5", children: [jsxRuntimeExports.jsx(Search, { className: "w-3.5 h-3.5 shrink-0 text-gray-800" }), jsxRuntimeExports.jsx("input", { id: "trace-viewer-search", name: "trace-viewer-search", type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), placeholder: "Search spans...", "aria-label": "Search spans", className: "flex-1 min-w-0 bg-transparent text-sm text-gray-1000 placeholder:text-gray-800 outline-none" }), searchQuery && jsxRuntimeExports.jsx("button", { type: "button", "aria-label": "Clear search", onClick: () => setSearchQuery(""), className: "shrink-0 p-0.5 rounded-sm text-gray-800 hover:text-gray-1000 hover:bg-gray-200 transition-colors", children: jsxRuntimeExports.jsx(X$3, { className: "w-3 h-3" }) })] }), endHeader: jsxRuntimeExports.jsx(TimelineHeader, { markers: timeMarkers, hoverInfo: hoverInfo2 }), children: [jsxRuntimeExports.jsx("div", { className: "block overflow-visible", children: jsxRuntimeExports.jsx(EventList, { spans: filteredSpans, activeSpanId, onSelectSpan: handleSelectSpan }) }), jsxRuntimeExports.jsx("div", { ref: timelineRef, className: "block min-h-0 overflow-visible relative", onDoubleClick: resetZoom, onMouseMove: handleTimelineMouseMove, onMouseLeave: handleTimelineMouseLeave, children: jsxRuntimeExports.jsx(Timeline, { spans: filteredSpans, viewStart: viewport.start, viewEnd: viewport.end, markers: timeMarkers, selectedId: activeSpanId, onSelect: handleSelectSpan, hoverFraction, altHeld }) })] }), jsxRuntimeExports.jsxs("div", { className: "absolute right-3 bottom-3 z-[5] flex items-center border border-gray-alpha-400 rounded-lg bg-background-100 shadow-sm overflow-hidden divide-x divide-gray-alpha-400", children: [jsxRuntimeExports.jsx("button", { type: "button", className: "flex items-center justify-center w-8 h-8 text-gray-900 cursor-pointer transition-colors duration-[time:120ms] ease-in-out hover:text-gray-1000 hover:bg-gray-alpha-100", onClick: zoomOut, "aria-label": "Zoom out", children: jsxRuntimeExports.jsx(ZoomOut, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx("button", { type: "button", className: "flex items-center justify-center w-8 h-8 text-gray-900 cursor-pointer transition-colors duration-[time:120ms] ease-in-out hover:text-gray-1000 hover:bg-gray-alpha-100", onClick: resetZoom, "aria-label": "Reset zoom", children: jsxRuntimeExports.jsx(RotateCcw, { className: "w-3.5 h-3.5" }) }), jsxRuntimeExports.jsx("button", { type: "button", className: "flex items-center justify-center w-8 h-8 text-gray-900 cursor-pointer transition-colors duration-[time:120ms] ease-in-out hover:text-gray-1000 hover:bg-gray-alpha-100", onClick: zoomIn, "aria-label": "Zoom in", children: jsxRuntimeExports.jsx(ZoomIn, { className: "w-4 h-4" }) })] })] }), activeSpan && sidebar ? jsxRuntimeExports.jsxs("aside", { className: "flex flex-col h-full max-h-full bg-background-100 border-l border-gray-alpha-400 overflow-auto", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-2 shrink-0 px-4 pt-3 pb-3", children: [jsxRuntimeExports.jsx("span", { className: "text-label-14 font-medium text-gray-1000 truncate block", children: selectedSpanName }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [jsxRuntimeExports.jsx("button", { type: "button", "aria-label": "Navigate to previous span", "aria-keyshortcuts": "K", onClick: handleSelectPrevSpan, disabled: !prevSpanId, className: "p-1 rounded text-gray-1000 transition-colors enabled:hover:bg-gray-alpha-100 disabled:opacity-40 disabled:cursor-not-allowed", children: jsxRuntimeExports.jsx(ChevronUp, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx("button", { type: "button", "aria-label": "Navigate to next span", "aria-keyshortcuts": "J", onClick: handleSelectNextSpan, disabled: !nextSpanId, className: "p-1 rounded text-gray-1000 transition-colors enabled:hover:bg-gray-alpha-100 disabled:opacity-40 disabled:cursor-not-allowed", children: jsxRuntimeExports.jsx(ChevronDown, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "w-px h-4 bg-gray-alpha-400 mx-1" }), jsxRuntimeExports.jsx("button", { type: "button", "aria-label": "Close span details", "aria-keyshortcuts": "Escape", className: "p-1 rounded text-gray-1000 hover:bg-gray-alpha-100 transition-colors", onClick: clearActiveSpan, children: jsxRuntimeExports.jsx(X$3, { className: "w-4 h-4" }) })] })] }), jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto", children: jsxRuntimeExports.jsx(ErrorBoundary$1, { children: jsxRuntimeExports.jsx(EntityDetailPanel, { run: sidebar.run, onStreamClick: sidebar.onStreamClick, onRunClick: sidebar.onRunClick, spanDetailData: sidebar.spanDetailData, spanDetailError: sidebar.spanDetailError, spanDetailLoading: sidebar.spanDetailLoading, onSpanSelect: sidebar.onSpanSelect, onWakeUpSleep: sidebar.onWakeUpSleep, onLoadEventData: sidebar.onLoadEventData, onResolveHook: sidebar.onResolveHook, encryptionKey: sidebar.encryptionKey, onDecrypt: sidebar.onDecrypt, isDecrypting: sidebar.isDecrypting, selectedSpan }) }) })] }) : activeSpan ? jsxRuntimeExports.jsx(DetailPanel, { span: activeSpan, rootStart: root2.startTime, onClose: clearActiveSpan }) : null] });
84659
+ return jsxRuntimeExports.jsxs("div", { "data-pane": "pane-root", "data-has-detail": activeSpan ? "" : void 0, className: "grid w-full h-full max-h-full grid-cols-[minmax(100px,1fr)] data-[has-detail]:grid-cols-[minmax(100px,1fr)_clamp(280px,420px,100%)]", children: [jsxRuntimeExports.jsxs("div", { id: "trace-parent", className: "grid grid-rows-[1fr] h-full min-h-0 overflow-hidden relative bg-background-100", children: [jsxRuntimeExports.jsxs(SplitPane, { startHeader: jsxRuntimeExports.jsxs("div", { className: "bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center pl-4 pr-2 gap-1.5", children: [jsxRuntimeExports.jsx(Search, { className: "w-3.5 h-3.5 shrink-0 text-gray-800" }), jsxRuntimeExports.jsx("input", { id: "trace-viewer-search", name: "trace-viewer-search", type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), onKeyDown: (e) => {
84660
+ if (e.key === "Escape" && searchQuery) {
84661
+ e.preventDefault();
84662
+ e.stopPropagation();
84663
+ setSearchQuery("");
84664
+ }
84665
+ }, placeholder: "Search spans...", "aria-label": "Search spans", className: "flex-1 min-w-0 bg-transparent text-sm text-gray-1000 placeholder:text-gray-800 outline-none" }), searchQuery && jsxRuntimeExports.jsx("button", { type: "button", "aria-label": "Clear search", onClick: () => setSearchQuery(""), className: "-mr-2 hidden h-full max-w-full shrink-0 cursor-pointer items-center rounded-r-md border-0 bg-transparent px-2.5 font-inherit text-base text-gray-900 no-underline transition-colors duration-150 ease-in hover:text-gray-1000 focus-visible:-outline-offset-1 focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] min-[961px]:flex", children: jsxRuntimeExports.jsx("kbd", { className: "inline-flex h-5 min-h-5 min-w-5 items-center justify-center rounded border border-gray-alpha-400 bg-background-100 px-1 font-sans text-[13px] font-medium leading-[1.7em] text-gray-900", children: "Esc" }) })] }), endHeader: jsxRuntimeExports.jsx(TimelineHeader, { markers: timeMarkers, hoverInfo: hoverInfo2 }), children: [jsxRuntimeExports.jsx("div", { className: "block overflow-visible", children: jsxRuntimeExports.jsx(EventList, { spans: trace2.spans, activeSpanId, searchResult, onSelectSpan: handleSelectSpan }) }), jsxRuntimeExports.jsx("div", { ref: timelineRef, className: "block min-h-0 overflow-visible relative", onDoubleClick: resetZoom, onMouseMove: handleTimelineMouseMove, onMouseLeave: handleTimelineMouseLeave, children: jsxRuntimeExports.jsx(Timeline, { spans: trace2.spans, viewStart: viewport.start, viewEnd: viewport.end, markers: timeMarkers, selectedId: activeSpanId, searchResult, onSelect: handleSelectSpan, hoverFraction, altHeld }) })] }), jsxRuntimeExports.jsxs("div", { className: "absolute right-3 bottom-3 z-[5] flex items-center border border-gray-alpha-400 rounded-md bg-background-100 shadow-sm overflow-hidden divide-x divide-gray-alpha-400", children: [jsxRuntimeExports.jsx(IconButton, { variant: "muted", size: "small", onClick: zoomOut, "aria-label": "Zoom out", children: jsxRuntimeExports.jsx(ZoomOut, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx(IconButton, { variant: "muted", size: "small", onClick: resetZoom, "aria-label": "Reset zoom", children: jsxRuntimeExports.jsx(RotateCcw, { className: "w-3.5 h-3.5" }) }), jsxRuntimeExports.jsx(IconButton, { variant: "muted", size: "small", onClick: zoomIn, "aria-label": "Zoom in", children: jsxRuntimeExports.jsx(ZoomIn, { className: "w-4 h-4" }) })] })] }), activeSpan && sidebar ? jsxRuntimeExports.jsxs("aside", { className: "flex flex-col h-full max-h-full bg-background-100 border-l border-gray-alpha-400 overflow-auto", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-2 shrink-0 px-4 pt-3 pb-3", children: [jsxRuntimeExports.jsx("span", { className: "text-label-14 font-medium text-gray-1000 truncate block", children: selectedSpanName }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [jsxRuntimeExports.jsx(IconButton, { "aria-label": "Navigate to previous span", "aria-keyshortcuts": "K", onClick: handleSelectPrevSpan, disabled: !prevSpanId, children: jsxRuntimeExports.jsx(ChevronUp, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx(IconButton, { "aria-label": "Navigate to next span", "aria-keyshortcuts": "J", onClick: handleSelectNextSpan, disabled: !nextSpanId, children: jsxRuntimeExports.jsx(ChevronDown, { className: "w-4 h-4" }) }), jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "w-px h-4 bg-gray-alpha-400 mx-1" }), jsxRuntimeExports.jsx(IconButton, { "aria-label": "Close span details", "aria-keyshortcuts": "Escape", onClick: clearActiveSpan, children: jsxRuntimeExports.jsx(X$3, { className: "w-4 h-4" }) })] })] }), jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto", children: jsxRuntimeExports.jsx(ErrorBoundary$1, { children: jsxRuntimeExports.jsx(EntityDetailPanel, { run: sidebar.run, onStreamClick: sidebar.onStreamClick, onRunClick: sidebar.onRunClick, spanDetailData: sidebar.spanDetailData, spanDetailError: sidebar.spanDetailError, spanDetailLoading: sidebar.spanDetailLoading, onSpanSelect: sidebar.onSpanSelect, onWakeUpSleep: sidebar.onWakeUpSleep, onLoadEventData: sidebar.onLoadEventData, onResolveHook: sidebar.onResolveHook, encryptionKey: sidebar.encryptionKey, onDecrypt: sidebar.onDecrypt, isDecrypting: sidebar.isDecrypting, selectedSpan }) }) })] }) : activeSpan ? jsxRuntimeExports.jsx(DetailPanel, { span: activeSpan, rootStart: root2.startTime, onClose: clearActiveSpan }) : null] });
84510
84666
  }
84511
84667
  const NewTraceViewer = ({ run, events: events2, sidebarData }) => {
84512
84668
  const traceWithMeta = reactExports.useMemo(() => {
@@ -88430,7 +88586,7 @@ const encryption = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
88430
88586
  encrypt: encrypt$1,
88431
88587
  importKey
88432
88588
  }, Symbol.toStringTag, { value: "Module" }));
88433
- const version$1 = "5.0.0-beta.8";
88589
+ const version$1 = "5.0.0-beta.9";
88434
88590
  const WorldCacheKey = Symbol.for("@workflow/world//cache");
88435
88591
  const WorldCachePromiseKey = Symbol.for("@workflow/world//cachePromise");
88436
88592
  const GetWorldFnKey$1 = Symbol.for("@workflow/world//getWorldFn");
@@ -88566,12 +88722,15 @@ async function healthCheck(world, endpoint, options) {
88566
88722
  }
88567
88723
  const LOCK_POLL_INTERVAL_MS = 10;
88568
88724
  function createFlushableState() {
88569
- return {
88725
+ const state = {
88570
88726
  ...withResolvers$1(),
88571
88727
  pendingOps: 0,
88572
88728
  doneResolved: false,
88573
88729
  streamEnded: false
88574
88730
  };
88731
+ state.promise.catch(() => {
88732
+ });
88733
+ return state;
88575
88734
  }
88576
88735
  function isWritableUnlockedNotClosed(writable) {
88577
88736
  if (writable.locked)
@@ -92076,6 +92235,16 @@ async function readBuffer(filePath) {
92076
92235
  const content2 = await promises.readFile(filePath);
92077
92236
  return content2;
92078
92237
  }
92238
+ async function readFirstByte(filePath) {
92239
+ const file2 = await promises.open(filePath, "r");
92240
+ try {
92241
+ const byte = Buffer.allocUnsafe(1);
92242
+ const { bytesRead } = await file2.read(byte, 0, 1, 0);
92243
+ return bytesRead === 0 ? void 0 : byte[0];
92244
+ } finally {
92245
+ await file2.close();
92246
+ }
92247
+ }
92079
92248
  async function deleteJSON(filePath) {
92080
92249
  try {
92081
92250
  await promises.unlink(filePath);
@@ -117861,40 +118030,50 @@ const monotonicUlid = monotonicFactory(() => Math.random());
117861
118030
  const RunStreamsSchema = object$1({
117862
118031
  streams: array$1(string$3())
117863
118032
  });
118033
+ const EOF_MARKER = 1;
118034
+ function isEofByte(byte) {
118035
+ return byte === EOF_MARKER;
118036
+ }
117864
118037
  function serializeChunk(chunk) {
117865
- const eofByte = Buffer.from([chunk.eof ? 1 : 0]);
118038
+ const eofByte = Buffer.from([chunk.eof ? EOF_MARKER : 0]);
117866
118039
  return Buffer.concat([eofByte, chunk.chunk]);
117867
118040
  }
117868
118041
  function isEofChunk(serialized) {
117869
- return serialized[0] === 1;
118042
+ return isEofByte(serialized[0]);
117870
118043
  }
117871
118044
  function deserializeChunk(serialized) {
117872
- const eof = serialized[0] === 1;
118045
+ const eof = isEofChunk(serialized);
117873
118046
  const chunk = Buffer.from(serialized.subarray(1));
117874
118047
  return { eof, chunk };
117875
118048
  }
118049
+ async function listChunkEntries(chunksDir) {
118050
+ try {
118051
+ return await fs$1.readdir(chunksDir);
118052
+ } catch (error2) {
118053
+ if (error2.code === "ENOENT")
118054
+ return [];
118055
+ throw error2;
118056
+ }
118057
+ }
118058
+ function addChunkFilesByExtension(extMap, entries, sourceExtension, fileExtension = sourceExtension, include = () => true) {
118059
+ for (const entry2 of entries) {
118060
+ if (!entry2.endsWith(sourceExtension))
118061
+ continue;
118062
+ const file2 = entry2.slice(0, -sourceExtension.length);
118063
+ if (include(file2))
118064
+ extMap.set(file2, fileExtension);
118065
+ }
118066
+ }
117876
118067
  async function listChunkFilesForStream(chunksDir, name2, tag) {
117877
118068
  assertSafeEntityId("streamName", name2);
117878
- const listPromises = [
117879
- listFilesByExtension(chunksDir, ".bin"),
117880
- listFilesByExtension(chunksDir, ".json")
117881
- ];
117882
- if (tag) {
117883
- listPromises.push(listFilesByExtension(chunksDir, `.${tag}.bin`));
117884
- }
117885
- const [binFiles, jsonFiles, ...taggedResults] = await Promise.all(listPromises);
117886
- const taggedBinFiles = taggedResults[0] ?? [];
118069
+ const entries = await listChunkEntries(chunksDir);
117887
118070
  const extMap = /* @__PURE__ */ new Map();
117888
- for (const f2 of jsonFiles)
117889
- extMap.set(f2, ".json");
117890
- const tagSfx = tag ? `.${tag}` : "";
117891
- for (const f2 of binFiles) {
117892
- if (tag && f2.endsWith(tagSfx))
117893
- continue;
117894
- extMap.set(f2, ".bin");
118071
+ addChunkFilesByExtension(extMap, entries, ".json");
118072
+ addChunkFilesByExtension(extMap, entries, ".bin", ".bin", tag ? (file2) => !file2.endsWith(`.${tag}`) : void 0);
118073
+ if (tag) {
118074
+ const taggedExtension = `.${tag}.bin`;
118075
+ addChunkFilesByExtension(extMap, entries, taggedExtension);
117895
118076
  }
117896
- for (const f2 of taggedBinFiles)
117897
- extMap.set(f2, `.${tag}.bin`);
117898
118077
  const files = [...extMap.keys()].filter((file2) => file2.startsWith(`${name2}-`)).sort();
117899
118078
  return { files, extMap };
117900
118079
  }
@@ -118009,7 +118188,7 @@ function createStreamer$1(basedir, tag) {
118009
118188
  const ext2 = fileExtMap.get(file2) ?? ".bin";
118010
118189
  const filePath = path$3.join(chunksDir, `${file2}${ext2}`);
118011
118190
  if (dataIndex < startIndex) {
118012
- if (isEofChunk(await readBuffer(filePath))) {
118191
+ if (isEofByte(await readFirstByte(filePath))) {
118013
118192
  streamDone = true;
118014
118193
  break;
118015
118194
  }
@@ -118017,7 +118196,7 @@ function createStreamer$1(basedir, tag) {
118017
118196
  continue;
118018
118197
  }
118019
118198
  if (resultChunks.length >= limit) {
118020
- if (isEofChunk(await readBuffer(filePath))) {
118199
+ if (isEofByte(await readFirstByte(filePath))) {
118021
118200
  streamDone = true;
118022
118201
  } else {
118023
118202
  dataIndex++;
@@ -118052,7 +118231,7 @@ function createStreamer$1(basedir, tag) {
118052
118231
  let dataCount = 0;
118053
118232
  for (const file2 of chunkFiles) {
118054
118233
  const ext2 = fileExtMap.get(file2) ?? ".bin";
118055
- if (isEofChunk(await readBuffer(path$3.join(chunksDir, `${file2}${ext2}`)))) {
118234
+ if (isEofByte(await readFirstByte(path$3.join(chunksDir, `${file2}${ext2}`)))) {
118056
118235
  streamDone = true;
118057
118236
  break;
118058
118237
  }
@@ -118113,8 +118292,7 @@ function createStreamer$1(basedir, tag) {
118113
118292
  if (typeof startIndex === "number" && startIndex < 0 && chunkFiles.length > 0) {
118114
118293
  const lastFile = chunkFiles[chunkFiles.length - 1];
118115
118294
  const lastExt = fileExtMap.get(lastFile) ?? ".bin";
118116
- const lastChunk = deserializeChunk(await readBuffer(path$3.join(chunksDir, `${lastFile}${lastExt}`)));
118117
- if ((lastChunk == null ? void 0 : lastChunk.eof) === true) {
118295
+ if (isEofByte(await readFirstByte(path$3.join(chunksDir, `${lastFile}${lastExt}`)))) {
118118
118296
  dataChunkCount--;
118119
118297
  }
118120
118298
  }
@@ -118261,7 +118439,7 @@ function createLocalWorld(args) {
118261
118439
  const basedir = mergedConfig.dataDir;
118262
118440
  const hooksDir = path$3.join(basedir, "hooks");
118263
118441
  const taggedHookFiles = await listTaggedFiles(hooksDir, tag);
118264
- const { HookSchema: HookSchema2 } = await import("./index-CdMzuwNr.js");
118442
+ const { HookSchema: HookSchema2 } = await import("./index-DltGJ3CV.js");
118265
118443
  await Promise.all(taggedHookFiles.map(async (hookFile) => {
118266
118444
  const hook = await readJSON(path$3.join(hooksDir, hookFile), HookSchema2);
118267
118445
  if (hook == null ? void 0 : hook.token) {
@@ -118413,8 +118591,8 @@ function requireGetVercelOidcToken() {
118413
118591
  }
118414
118592
  try {
118415
118593
  const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([
118416
- await import("./token-util-N0DDbkKZ.js").then((n) => n.t),
118417
- await import("./token--89oCxEK.js").then((n) => n.t)
118594
+ await import("./token-util-DwTdh-aG.js").then((n) => n.t),
118595
+ await import("./token-BNjLoJXz.js").then((n) => n.t)
118418
118596
  ]);
118419
118597
  if (!token || isExpired(getTokenPayload(token), options == null ? void 0 : options.expirationBufferMs)) {
118420
118598
  await refreshToken(options);
@@ -123585,7 +123763,7 @@ var QueueClient = class {
123585
123763
  setApi(this, new ApiClient({ ...options, region }));
123586
123764
  }
123587
123765
  };
123588
- const version = "5.0.0-beta.7";
123766
+ const version = "5.0.0-beta.8";
123589
123767
  const HTTP_DEBUG_ENABLED = typeof process !== "undefined" && typeof process.env.DEBUG === "string" && (process.env.DEBUG.includes("workflow:") || process.env.DEBUG === "*");
123590
123768
  function httpLog(method, endpoint, status, ms2) {
123591
123769
  if (HTTP_DEBUG_ENABLED) {
@@ -124743,6 +124921,16 @@ const MAX_CHUNKS_PER_REQUEST = 1e3;
124743
124921
  function getStreamUrl(name2, runId, httpConfig) {
124744
124922
  return new URL(`${httpConfig.baseUrl}/v2/runs/${encodeURIComponent(runId)}/stream/${encodeURIComponent(name2)}`);
124745
124923
  }
124924
+ function createStreamRequestError(operation, url2, response2, text2) {
124925
+ const context = [`PUT ${url2.origin}${url2.pathname}`];
124926
+ for (const header of ["x-vercel-id", "x-vercel-error"]) {
124927
+ const value = response2.headers.get(header);
124928
+ if (value) {
124929
+ context.push(`${header}=${value}`);
124930
+ }
124931
+ }
124932
+ return new Error(`Stream ${operation} failed: HTTP ${response2.status} (${context.join("; ")}): ${text2}`);
124933
+ }
124746
124934
  function encodeMultiChunks(chunks) {
124747
124935
  const encoder2 = new TextEncoder();
124748
124936
  const binaryChunks = [];
@@ -124782,14 +124970,15 @@ function createStreamer(config2) {
124782
124970
  async write(runId, name2, chunk) {
124783
124971
  const resolvedRunId = await runId;
124784
124972
  const httpConfig = await getHttpConfig(config2);
124785
- const response2 = await fetch(getStreamUrl(name2, resolvedRunId, httpConfig), {
124973
+ const url2 = getStreamUrl(name2, resolvedRunId, httpConfig);
124974
+ const response2 = await fetch(url2, {
124786
124975
  method: "PUT",
124787
124976
  body: chunk,
124788
124977
  headers: httpConfig.headers
124789
124978
  });
124790
124979
  const text2 = await response2.text();
124791
124980
  if (!response2.ok) {
124792
- throw new Error(`Stream write failed: HTTP ${response2.status}: ${text2}`);
124981
+ throw createStreamRequestError("write", url2, response2, text2);
124793
124982
  }
124794
124983
  },
124795
124984
  async writeMulti(runId, name2, chunks) {
@@ -124801,14 +124990,15 @@ function createStreamer(config2) {
124801
124990
  for (let i = 0; i < chunks.length; i += MAX_CHUNKS_PER_REQUEST) {
124802
124991
  const batch = chunks.slice(i, i + MAX_CHUNKS_PER_REQUEST);
124803
124992
  const body2 = encodeMultiChunks(batch);
124804
- const response2 = await fetch(getStreamUrl(name2, resolvedRunId, httpConfig), {
124993
+ const url2 = getStreamUrl(name2, resolvedRunId, httpConfig);
124994
+ const response2 = await fetch(url2, {
124805
124995
  method: "PUT",
124806
124996
  body: body2,
124807
124997
  headers: httpConfig.headers
124808
124998
  });
124809
124999
  const text2 = await response2.text();
124810
125000
  if (!response2.ok) {
124811
- throw new Error(`Stream write failed: HTTP ${response2.status}: ${text2}`);
125001
+ throw createStreamRequestError("write", url2, response2, text2);
124812
125002
  }
124813
125003
  }
124814
125004
  },
@@ -124816,13 +125006,14 @@ function createStreamer(config2) {
124816
125006
  const resolvedRunId = await runId;
124817
125007
  const httpConfig = await getHttpConfig(config2);
124818
125008
  httpConfig.headers.set("X-Stream-Done", "true");
124819
- const response2 = await fetch(getStreamUrl(name2, resolvedRunId, httpConfig), {
125009
+ const url2 = getStreamUrl(name2, resolvedRunId, httpConfig);
125010
+ const response2 = await fetch(url2, {
124820
125011
  method: "PUT",
124821
125012
  headers: httpConfig.headers
124822
125013
  });
124823
125014
  const text2 = await response2.text();
124824
125015
  if (!response2.ok) {
124825
- throw new Error(`Stream close failed: HTTP ${response2.status}: ${text2}`);
125016
+ throw createStreamRequestError("close", url2, response2, text2);
124826
125017
  }
124827
125018
  },
124828
125019
  async get(runId, name2, startIndex) {
@@ -151461,7 +151652,7 @@ const route4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
151461
151652
  __proto__: null,
151462
151653
  loader
151463
151654
  }, Symbol.toStringTag, { value: "Module" }));
151464
- const serverManifest = { "entry": { "module": "/assets/entry.client-DtOpLtMQ.js", "imports": ["/assets/index-BsV8i_Jn.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/root-ORTTXEp6.js", "imports": ["/assets/index-BsV8i_Jn.js", "/assets/mermaid-3ZIDBTTL-TNUP6Q3m.js"], "css": ["/assets/root-COvK3yNk.css", "/assets/mermaid-3ZIDBTTL-DKxHcEOp.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/home": { "id": "routes/home", "parentId": "root", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": false, "module": "/assets/home-Cai0GqMt.js", "imports": ["/assets/index-BsV8i_Jn.js", "/assets/workflow-graph-viewer-DKqOOMnz.js", "/assets/mermaid-3ZIDBTTL-TNUP6Q3m.js", "/assets/index-Byi8AWfe.js"], "css": ["/assets/workflow-graph-viewer-DnlNuQQH.css", "/assets/mermaid-3ZIDBTTL-DKxHcEOp.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/run-detail": { "id": "routes/run-detail", "parentId": "root", "path": "run/:runId", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": false, "module": "/assets/run-detail-DNZJxxPM.js", "imports": ["/assets/index-BsV8i_Jn.js", "/assets/workflow-graph-viewer-DKqOOMnz.js", "/assets/mermaid-3ZIDBTTL-TNUP6Q3m.js", "/assets/encryption-C69WMRfh.js", "/assets/index-Byi8AWfe.js"], "css": ["/assets/workflow-graph-viewer-DnlNuQQH.css", "/assets/mermaid-3ZIDBTTL-DKxHcEOp.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/api.rpc": { "id": "routes/api.rpc", "parentId": "root", "path": "api/rpc", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": false, "hasErrorBoundary": false, "module": "/assets/api.rpc-l0sNRNKZ.js", "imports": [], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/api.stream.$streamId": { "id": "routes/api.stream.$streamId", "parentId": "root", "path": "api/stream/:streamId", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": false, "hasErrorBoundary": false, "module": "/assets/api.stream._streamId-l0sNRNKZ.js", "imports": [], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 } }, "url": "/assets/manifest-127f70fe.js", "version": "127f70fe", "sri": void 0 };
151655
+ const serverManifest = { "entry": { "module": "/assets/entry.client-DtOpLtMQ.js", "imports": ["/assets/index-BsV8i_Jn.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/root-3uuTxUQN.js", "imports": ["/assets/index-BsV8i_Jn.js", "/assets/mermaid-3ZIDBTTL-3cOa-aZ5.js"], "css": ["/assets/root-BYtlAgHl.css", "/assets/mermaid-3ZIDBTTL-DKxHcEOp.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/home": { "id": "routes/home", "parentId": "root", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": false, "module": "/assets/home-MRChHR_P.js", "imports": ["/assets/index-BsV8i_Jn.js", "/assets/workflow-graph-viewer-DaYMiBT9.js", "/assets/mermaid-3ZIDBTTL-3cOa-aZ5.js", "/assets/index-Byi8AWfe.js"], "css": ["/assets/workflow-graph-viewer-DnlNuQQH.css", "/assets/mermaid-3ZIDBTTL-DKxHcEOp.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/run-detail": { "id": "routes/run-detail", "parentId": "root", "path": "run/:runId", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": false, "module": "/assets/run-detail-8qGjUNCj.js", "imports": ["/assets/index-BsV8i_Jn.js", "/assets/workflow-graph-viewer-DaYMiBT9.js", "/assets/mermaid-3ZIDBTTL-3cOa-aZ5.js", "/assets/encryption-C69WMRfh.js", "/assets/index-Byi8AWfe.js"], "css": ["/assets/workflow-graph-viewer-DnlNuQQH.css", "/assets/mermaid-3ZIDBTTL-DKxHcEOp.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/api.rpc": { "id": "routes/api.rpc", "parentId": "root", "path": "api/rpc", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": false, "hasErrorBoundary": false, "module": "/assets/api.rpc-l0sNRNKZ.js", "imports": [], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/api.stream.$streamId": { "id": "routes/api.stream.$streamId", "parentId": "root", "path": "api/stream/:streamId", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": false, "hasErrorBoundary": false, "module": "/assets/api.stream._streamId-l0sNRNKZ.js", "imports": [], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 } }, "url": "/assets/manifest-b100514d.js", "version": "b100514d", "sri": void 0 };
151465
151656
  const assetsBuildDirectory = "build/client";
151466
151657
  const basename = "/";
151467
151658
  const future = { "unstable_optimizeDeps": false, "unstable_subResourceIntegrity": false, "unstable_trailingSlashAwareDataRequests": false, "unstable_previewServerPrerendering": false, "v8_middleware": false, "v8_splitRouteModules": false, "v8_viteEnvironmentApi": false };