@workflow/web 5.0.0-beta.10 → 5.0.0-beta.12

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 (24) hide show
  1. package/build/client/assets/{encryption-B7z5c3Mu.js → encryption-g14N5vQl.js} +2 -2
  2. package/build/client/assets/{entry.client-DtOpLtMQ.js → entry.client-DOJDY_4b.js} +1 -1
  3. package/build/client/assets/{highlighted-body-B3W2YXNL-khW-t_B-.js → highlighted-body-B3W2YXNL-DmlmGvFd.js} +2 -2
  4. package/build/client/assets/{home-DKDz-tU-.js → home-BQRPxkXT.js} +4 -14
  5. package/build/client/assets/{index-CIZByfnL.js → index-B6-SzLmT.js} +1 -1
  6. package/build/client/assets/{index-BsV8i_Jn.js → index-BXZSIDEp.js} +2 -2
  7. package/build/client/assets/{manifest-a33ce94a.js → manifest-b8838010.js} +1 -1
  8. package/build/client/assets/{mermaid-3ZIDBTTL-DPZjJwuX.js → mermaid-3ZIDBTTL-CeSti4VQ.js} +246 -115
  9. package/build/client/assets/{root-DJKbeamD.js → root-8wYQKqnE.js} +2 -2
  10. package/build/client/assets/root-DvB36HGI.css +1 -0
  11. package/build/client/assets/{run-detail-ekQSEj_z.js → run-detail-Dn4QeKHW.js} +112 -50
  12. package/build/client/assets/server-build-B5Dibl7P.css +1 -0
  13. package/build/client/assets/{workflow-graph-viewer-DjlqbXVx.js → workflow-graph-viewer-CxZS9r2o.js} +3 -3
  14. package/build/server/assets/{app-Cgrcb-fS.js → app-D-W9Jr82.js} +1 -1
  15. package/build/server/assets/{highlighted-body-B3W2YXNL-BCA9A7WB.js → highlighted-body-B3W2YXNL-CcRpp5rq.js} +2 -2
  16. package/build/server/assets/{index-VP-TIWDS.js → index-BUU6Hdm_.js} +3 -3
  17. package/build/server/assets/{mermaid-3ZIDBTTL-CbLetKvR.js → mermaid-3ZIDBTTL-Nh9-IDfL.js} +2 -2
  18. package/build/server/assets/{server-build-ClDPbfo3.js → server-build-BshzAvNv.js} +1983 -533
  19. package/build/server/assets/{token-BxPrGSQ5.js → token-BaJALexf.js} +2 -2
  20. package/build/server/assets/{token-util-Bmrakd6M.js → token-util-Bc0jltWL.js} +2 -2
  21. package/build/server/index.js +1 -1
  22. package/package.json +6 -6
  23. package/build/client/assets/root-BYtlAgHl.css +0 -1
  24. package/build/client/assets/server-build-ByHD2s6b.css +0 -1
@@ -1,9 +1,9 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/encryption-B7z5c3Mu.js","assets/index-CIZByfnL.js","assets/index-BsV8i_Jn.js","assets/highlighted-body-B3W2YXNL-khW-t_B-.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/encryption-g14N5vQl.js","assets/index-B6-SzLmT.js","assets/index-BXZSIDEp.js","assets/highlighted-body-B3W2YXNL-DmlmGvFd.js"])))=>i.map(i=>d[i]);
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  var _a2;
6
- import { r as reactExports, j as jsxRuntimeExports, f as reactDomExports, I as React, R as ReactExports, D as ReactDOM, g as getDefaultExportFromCjs } from "./index-BsV8i_Jn.js";
6
+ import { r as reactExports, j as jsxRuntimeExports, f as reactDomExports, I as React, G as ReactDOM, R as ReactExports, g as getDefaultExportFromCjs } from "./index-BXZSIDEp.js";
7
7
  function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
8
8
  return function handleEvent(event) {
9
9
  originalEventHandler == null ? void 0 : originalEventHandler(event);
@@ -48,19 +48,19 @@ function useComposedRefs$1(...refs) {
48
48
  }
49
49
  function createContext2(rootComponentName, defaultContext) {
50
50
  const Context = reactExports.createContext(defaultContext);
51
- const Provider = (props) => {
51
+ const Provider2 = (props) => {
52
52
  const { children: children2, ...context } = props;
53
53
  const value = reactExports.useMemo(() => context, Object.values(context));
54
54
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Context.Provider, { value, children: children2 });
55
55
  };
56
- Provider.displayName = rootComponentName + "Provider";
56
+ Provider2.displayName = rootComponentName + "Provider";
57
57
  function useContext2(consumerName) {
58
58
  const context = reactExports.useContext(Context);
59
59
  if (context) return context;
60
60
  if (defaultContext !== void 0) return defaultContext;
61
61
  throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
62
62
  }
63
- return [Provider, useContext2];
63
+ return [Provider2, useContext2];
64
64
  }
65
65
  function createContextScope(scopeName, createContextScopeDeps = []) {
66
66
  let defaultContexts = [];
@@ -68,14 +68,14 @@ function createContextScope(scopeName, createContextScopeDeps = []) {
68
68
  const BaseContext = reactExports.createContext(defaultContext);
69
69
  const index2 = defaultContexts.length;
70
70
  defaultContexts = [...defaultContexts, defaultContext];
71
- const Provider = (props) => {
71
+ const Provider2 = (props) => {
72
72
  var _a3;
73
73
  const { scope, children: children2, ...context } = props;
74
74
  const Context = ((_a3 = scope == null ? void 0 : scope[scopeName]) == null ? void 0 : _a3[index2]) || BaseContext;
75
75
  const value = reactExports.useMemo(() => context, Object.values(context));
76
76
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Context.Provider, { value, children: children2 });
77
77
  };
78
- Provider.displayName = rootComponentName + "Provider";
78
+ Provider2.displayName = rootComponentName + "Provider";
79
79
  function useContext2(consumerName, scope) {
80
80
  var _a3;
81
81
  const Context = ((_a3 = scope == null ? void 0 : scope[scopeName]) == null ? void 0 : _a3[index2]) || BaseContext;
@@ -84,7 +84,7 @@ function createContextScope(scopeName, createContextScopeDeps = []) {
84
84
  if (defaultContext !== void 0) return defaultContext;
85
85
  throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
86
86
  }
87
- return [Provider, useContext2];
87
+ return [Provider2, useContext2];
88
88
  }
89
89
  const createScope = () => {
90
90
  const scopeContexts = defaultContexts.map((defaultContext) => {
@@ -2682,6 +2682,16 @@ var Root2 = Popper;
2682
2682
  var Anchor = PopperAnchor;
2683
2683
  var Content = PopperContent;
2684
2684
  var Arrow$1 = PopperArrow;
2685
+ var PORTAL_NAME$1 = "Portal";
2686
+ var Portal$1 = reactExports.forwardRef((props, forwardedRef) => {
2687
+ var _a3;
2688
+ const { container: containerProp, ...portalProps } = props;
2689
+ const [mounted, setMounted] = reactExports.useState(false);
2690
+ useLayoutEffect2(() => setMounted(true), []);
2691
+ const container = containerProp || mounted && ((_a3 = globalThis == null ? void 0 : globalThis.document) == null ? void 0 : _a3.body);
2692
+ return container ? ReactDOM.createPortal(/* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { ...portalProps, ref: forwardedRef }), container) : null;
2693
+ });
2694
+ Portal$1.displayName = PORTAL_NAME$1;
2685
2695
  function useStateMachine(initialState2, machine) {
2686
2696
  return reactExports.useReducer((state, event) => {
2687
2697
  const nextState = machine[state][event];
@@ -2907,7 +2917,7 @@ var PROVIDER_NAME = "TooltipProvider";
2907
2917
  var DEFAULT_DELAY_DURATION = 700;
2908
2918
  var TOOLTIP_OPEN = "tooltip.open";
2909
2919
  var [TooltipProviderContextProvider, useTooltipProviderContext] = createTooltipContext(PROVIDER_NAME);
2910
- var TooltipProvider = (props) => {
2920
+ var TooltipProvider$1 = (props) => {
2911
2921
  const {
2912
2922
  __scopeTooltip,
2913
2923
  delayDuration = DEFAULT_DELAY_DURATION,
@@ -2948,10 +2958,10 @@ var TooltipProvider = (props) => {
2948
2958
  }
2949
2959
  );
2950
2960
  };
2951
- TooltipProvider.displayName = PROVIDER_NAME;
2961
+ TooltipProvider$1.displayName = PROVIDER_NAME;
2952
2962
  var TOOLTIP_NAME = "Tooltip";
2953
2963
  var [TooltipContextProvider, useTooltipContext] = createTooltipContext(TOOLTIP_NAME);
2954
- var Tooltip$1 = (props) => {
2964
+ var Tooltip$2 = (props) => {
2955
2965
  const {
2956
2966
  __scopeTooltip,
2957
2967
  children: children2,
@@ -3041,9 +3051,9 @@ var Tooltip$1 = (props) => {
3041
3051
  }
3042
3052
  ) });
3043
3053
  };
3044
- Tooltip$1.displayName = TOOLTIP_NAME;
3054
+ Tooltip$2.displayName = TOOLTIP_NAME;
3045
3055
  var TRIGGER_NAME = "TooltipTrigger";
3046
- var TooltipTrigger$1 = reactExports.forwardRef(
3056
+ var TooltipTrigger$2 = reactExports.forwardRef(
3047
3057
  (props, forwardedRef) => {
3048
3058
  const { __scopeTooltip, ...triggerProps } = props;
3049
3059
  const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);
@@ -3091,13 +3101,19 @@ var TooltipTrigger$1 = reactExports.forwardRef(
3091
3101
  ) });
3092
3102
  }
3093
3103
  );
3094
- TooltipTrigger$1.displayName = TRIGGER_NAME;
3104
+ TooltipTrigger$2.displayName = TRIGGER_NAME;
3095
3105
  var PORTAL_NAME = "TooltipPortal";
3096
3106
  var [PortalProvider, usePortalContext] = createTooltipContext(PORTAL_NAME, {
3097
3107
  forceMount: void 0
3098
3108
  });
3109
+ var TooltipPortal = (props) => {
3110
+ const { __scopeTooltip, forceMount, children: children2, container } = props;
3111
+ const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);
3112
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PortalProvider, { scope: __scopeTooltip, forceMount, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { asChild: true, container, children: children2 }) }) });
3113
+ };
3114
+ TooltipPortal.displayName = PORTAL_NAME;
3099
3115
  var CONTENT_NAME = "TooltipContent";
3100
- var TooltipContent$1 = reactExports.forwardRef(
3116
+ var TooltipContent$2 = reactExports.forwardRef(
3101
3117
  (props, forwardedRef) => {
3102
3118
  const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);
3103
3119
  const { forceMount = portalContext.forceMount, side = "top", ...contentProps } = props;
@@ -3232,7 +3248,7 @@ var TooltipContentImpl = reactExports.forwardRef(
3232
3248
  );
3233
3249
  }
3234
3250
  );
3235
- TooltipContent$1.displayName = CONTENT_NAME;
3251
+ TooltipContent$2.displayName = CONTENT_NAME;
3236
3252
  var ARROW_NAME = "TooltipArrow";
3237
3253
  var TooltipArrow = reactExports.forwardRef(
3238
3254
  (props, forwardedRef) => {
@@ -3361,9 +3377,12 @@ function getHullPresorted(points) {
3361
3377
  return upperHull.concat(lowerHull);
3362
3378
  }
3363
3379
  }
3364
- var Root3 = Tooltip$1;
3365
- var Trigger = TooltipTrigger$1;
3366
- var Content2 = TooltipContent$1;
3380
+ var Provider = TooltipProvider$1;
3381
+ var Root3 = Tooltip$2;
3382
+ var Trigger = TooltipTrigger$2;
3383
+ var Portal = TooltipPortal;
3384
+ var Content2 = TooltipContent$2;
3385
+ var Arrow2 = TooltipArrow;
3367
3386
  function r(e) {
3368
3387
  var t, f2, n = "";
3369
3388
  if ("string" == typeof e || "number" == typeof e) n += e;
@@ -10359,7 +10378,7 @@ function hydrateData(value, revivers) {
10359
10378
  async function hydrateDataWithKey(value, revivers, key) {
10360
10379
  if (value instanceof Uint8Array && isEncryptedData(value) && key) {
10361
10380
  const { decrypt } = await __vitePreload(async () => {
10362
- const { decrypt: decrypt2 } = await import("./encryption-B7z5c3Mu.js");
10381
+ const { decrypt: decrypt2 } = await import("./encryption-g14N5vQl.js");
10363
10382
  return { decrypt: decrypt2 };
10364
10383
  }, true ? __vite__mapDeps([0,1,2]) : void 0);
10365
10384
  const { payload } = decodeFormatPrefix(value);
@@ -15576,6 +15595,11 @@ const WorkflowInvokePayloadSchema = object({
15576
15595
  runId: string$2(),
15577
15596
  traceCarrier: TraceCarrierSchema.optional(),
15578
15597
  requestedAt: date().optional(),
15598
+ /** Consecutive replay divergences in this recovery chain and latest position. */
15599
+ replayDivergence: object({
15600
+ eventId: string$2(),
15601
+ count: number$2().int().positive()
15602
+ }).optional(),
15579
15603
  /** Number of times this message has been re-enqueued due to server errors (5xx) */
15580
15604
  serverErrorRetryCount: number$2().int().optional(),
15581
15605
  /** Step ID for inline step execution in combined handler. If provided, the flow execution
@@ -15837,7 +15861,8 @@ function getWebRevivers() {
15837
15861
  // Error family. The reducer side (see
15838
15862
  // `packages/core/src/serialization/reducers/common.ts`) emits a tagged
15839
15863
  // entry for each built-in Error subclass plus the workflow-specific
15840
- // `FatalError` / `RetryableError` and `AggregateError`. Without
15864
+ // `FatalError` / `RetryableError` / `HookConflictError` /
15865
+ // `RuntimeDecryptionError` and `AggregateError`. Without
15841
15866
  // matching revivers here, `devalue.unflatten` throws "Unknown type X"
15842
15867
  // — which surfaces in the web o11y UI as "Failed to load resource
15843
15868
  // details: Unknown type FatalError".
@@ -15883,6 +15908,18 @@ function getWebRevivers() {
15883
15908
  error.stack = value.stack;
15884
15909
  return error;
15885
15910
  },
15911
+ HookConflictError: (value) => {
15912
+ const opts = "cause" in value ? { cause: value.cause } : void 0;
15913
+ const error = new Error(value.message, opts);
15914
+ error.name = "HookConflictError";
15915
+ error.token = value.token;
15916
+ if (value.conflictingRunId !== void 0) {
15917
+ error.conflictingRunId = value.conflictingRunId;
15918
+ }
15919
+ if (value.stack !== void 0)
15920
+ error.stack = value.stack;
15921
+ return error;
15922
+ },
15886
15923
  RetryableError: (value) => {
15887
15924
  const opts = "cause" in value ? { cause: value.cause } : void 0;
15888
15925
  const error = new Error(value.message, opts);
@@ -15894,6 +15931,17 @@ function getWebRevivers() {
15894
15931
  }
15895
15932
  return error;
15896
15933
  },
15934
+ RuntimeDecryptionError: (value) => {
15935
+ const opts = "cause" in value ? { cause: value.cause } : void 0;
15936
+ const error = new Error(value.message, opts);
15937
+ error.name = "RuntimeDecryptionError";
15938
+ if (value.context !== void 0) {
15939
+ error.context = value.context;
15940
+ }
15941
+ if (value.stack !== void 0)
15942
+ error.stack = value.stack;
15943
+ return error;
15944
+ },
15897
15945
  DOMException: (value) => {
15898
15946
  const G2 = globalThis;
15899
15947
  if (typeof G2.DOMException === "function") {
@@ -16048,7 +16096,7 @@ async function hydrateResourceIOWithKey(resource, key) {
16048
16096
  return { hydrateDataWithKey: hydrateDataWithKey3 };
16049
16097
  }, true ? void 0 : void 0);
16050
16098
  const { importKey } = await __vitePreload(async () => {
16051
- const { importKey: importKey2 } = await import("./encryption-B7z5c3Mu.js");
16099
+ const { importKey: importKey2 } = await import("./encryption-g14N5vQl.js");
16052
16100
  return { importKey: importKey2 };
16053
16101
  }, true ? __vite__mapDeps([0,1,2]) : void 0);
16054
16102
  const cryptoKey = await importKey(key);
@@ -43255,7 +43303,7 @@ var tn = f("block", "before:content-[counter(line)]", "before:inline-block", "be
43255
43303
  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 });
43256
43304
  var Se = reactExports.createContext({ code: "" }), de = () => reactExports.useContext(Se);
43257
43305
  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 }) });
43258
- var cn$1 = /\n+$/, dn = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-B3W2YXNL-khW-t_B-.js"), true ? __vite__mapDeps([3,2]) : void 0).then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
43306
+ var cn$1 = /\n+$/, dn = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-B3W2YXNL-DmlmGvFd.js"), true ? __vite__mapDeps([3,2]) : void 0).then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
43259
43307
  let i = reactExports.useMemo(() => e.replace(cn$1, ""), [e]), c = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i.split(`
43260
43308
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i]);
43261
43309
  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 }) })] }) });
@@ -45291,6 +45339,29 @@ function StreamViewer({ streamId: _streamId, chunks, isLive, error, isLoading, o
45291
45339
  color: "var(--ds-gray-600)"
45292
45340
  }, 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 } }) })] });
45293
45341
  }
45342
+ const iconButtonVariants = cva([
45343
+ "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]",
45344
+ "transition-colors duration-150 ease-in-out",
45345
+ "enabled:cursor-pointer disabled:cursor-not-allowed disabled:opacity-40",
45346
+ "focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] focus-visible:outline-offset-2"
45347
+ ], {
45348
+ variants: {
45349
+ variant: {
45350
+ 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",
45351
+ 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"
45352
+ },
45353
+ size: {
45354
+ tiny: "h-6 w-6 rounded-[4px] [&_svg]:h-4 [&_svg]:w-4",
45355
+ small: "h-8 w-8 rounded-md [&_svg]:h-4 [&_svg]:w-4"
45356
+ }
45357
+ },
45358
+ defaultVariants: {
45359
+ variant: "tertiary",
45360
+ size: "tiny"
45361
+ }
45362
+ });
45363
+ const IconButton = reactExports.forwardRef(({ className, variant, size: size2, type = "button", ...props }, ref) => jsxRuntimeExports.jsx("button", { ref, type, className: cn$4(iconButtonVariants({ variant, size: size2, className })), ...props }));
45364
+ IconButton.displayName = "IconButton";
45294
45365
  const ATTR_FILTER_REGEX = /(?:^|\s)(?<pair>(?<key>[\w.]+):(?<value>\S*))/g;
45295
45366
  function parseSpanSearchQuery(rawQuery) {
45296
45367
  var _a3, _b, _c;
@@ -45736,6 +45807,54 @@ function computeSpanSegments(span) {
45736
45807
  return [];
45737
45808
  }
45738
45809
  }
45810
+ const INITIAL_VISIBLE_ROWS = 60;
45811
+ function getScrollParent(el) {
45812
+ let node2 = (el == null ? void 0 : el.parentElement) ?? null;
45813
+ while (node2) {
45814
+ const overflowY = getComputedStyle(node2).overflowY;
45815
+ if (overflowY === "auto" || overflowY === "scroll")
45816
+ return node2;
45817
+ node2 = node2.parentElement;
45818
+ }
45819
+ return null;
45820
+ }
45821
+ function useRowWindow(ref, rowCount, rowHeight, overscan = 12) {
45822
+ const [range, setRange] = reactExports.useState(() => ({
45823
+ start: 0,
45824
+ end: Math.min(rowCount, INITIAL_VISIBLE_ROWS)
45825
+ }));
45826
+ reactExports.useEffect(() => {
45827
+ const self2 = ref.current;
45828
+ const el = getScrollParent(self2);
45829
+ if (!self2 || !el)
45830
+ return;
45831
+ let raf = 0;
45832
+ const measure = () => {
45833
+ raf = 0;
45834
+ const offset2 = self2.getBoundingClientRect().top - el.getBoundingClientRect().top + el.scrollTop;
45835
+ const top = el.scrollTop - offset2;
45836
+ const start = Math.max(0, Math.floor(top / rowHeight) - overscan);
45837
+ const end = Math.min(rowCount, Math.ceil((top + el.clientHeight) / rowHeight) + overscan);
45838
+ setRange((prev) => prev.start === start && prev.end === end ? prev : { start, end });
45839
+ };
45840
+ const onScroll = () => {
45841
+ if (!raf)
45842
+ raf = requestAnimationFrame(measure);
45843
+ };
45844
+ measure();
45845
+ el.addEventListener("scroll", onScroll, { passive: true });
45846
+ const ro2 = new ResizeObserver(measure);
45847
+ ro2.observe(el);
45848
+ return () => {
45849
+ el.removeEventListener("scroll", onScroll);
45850
+ ro2.disconnect();
45851
+ if (raf)
45852
+ cancelAnimationFrame(raf);
45853
+ };
45854
+ }, [ref, rowCount, rowHeight, overscan]);
45855
+ return range;
45856
+ }
45857
+ const ROW_HEIGHT_PX = 40;
45739
45858
  const TINY_BAR_BOX_SIZE_PX = 24;
45740
45859
  const TINY_BAR_WIDTH_PX = 4;
45741
45860
  const TIMELINE_PADDING_PX = 16;
@@ -45862,11 +45981,10 @@ const TimelineBar = reactExports.memo(function TimelineBar2({ span, viewStart, v
45862
45981
  }, [onSelect, span.spanId]);
45863
45982
  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 }) }) }) });
45864
45983
  });
45865
- const DELTA_ROW_HEIGHT_PX = 40;
45866
45984
  const DELTA_CAP_HEIGHT_PX = 8;
45867
45985
  const DELTA_ROW_OFFSET_PX = 8;
45868
45986
  const DeltaIndicator = reactExports.memo(function DeltaIndicator2({ leftFrac, rightFrac, label, rowIndex }) {
45869
- const centerY = DELTA_ROW_OFFSET_PX + (rowIndex + 1) * DELTA_ROW_HEIGHT_PX;
45987
+ const centerY = DELTA_ROW_OFFSET_PX + (rowIndex + 1) * ROW_HEIGHT_PX;
45870
45988
  return jsxRuntimeExports.jsxs("div", { className: "absolute pointer-events-none", style: {
45871
45989
  left: `${leftFrac * 100}%`,
45872
45990
  width: `${(rightFrac - leftFrac) * 100}%`,
@@ -45882,6 +46000,7 @@ function Timeline({ spans, viewStart, viewEnd, markers: markers2, selectedId, se
45882
46000
  const [containerWidth, setContainerWidth] = reactExports.useState(0);
45883
46001
  const viewDuration = viewEnd - viewStart;
45884
46002
  const timelineWidth = Math.max(0, containerWidth - TIMELINE_PADDING_PX * 2);
46003
+ const { start, end } = useRowWindow(containerRef, spans.length, ROW_HEIGHT_PX);
45885
46004
  reactExports.useEffect(() => {
45886
46005
  const el = containerRef.current;
45887
46006
  if (!el)
@@ -45893,16 +46012,20 @@ function Timeline({ spans, viewStart, viewEnd, markers: markers2, selectedId, se
45893
46012
  return () => ro2.disconnect();
45894
46013
  }, []);
45895
46014
  const gaps = reactExports.useMemo(() => computeSpanGaps(spans, viewStart, viewEnd), [spans, viewStart, viewEnd]);
45896
- 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) => (
46015
+ return jsxRuntimeExports.jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", style: { minHeight: spans.length * ROW_HEIGHT_PX }, children: [jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers2.map((marker2) => (
45897
46016
  // Skip the "0s" origin marker since the left edge already implies it.
45898
46017
  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
45899
- )) }), 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)) })] });
46018
+ )) }), 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}%` } }) }), jsxRuntimeExports.jsx("div", { style: { transform: `translateY(${start * ROW_HEIGHT_PX}px)` }, children: spans.slice(start, end).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)) })] });
45900
46019
  }
46020
+ const TooltipProvider = Provider;
46021
+ const Tooltip$1 = Root3;
46022
+ const TooltipTrigger$1 = Trigger;
46023
+ const TooltipContent$1 = reactExports.forwardRef(({ className, sideOffset = 8, showArrow = true, children: children2, ...props }, ref) => jsxRuntimeExports.jsx(Portal, { children: jsxRuntimeExports.jsxs(Content2, { ref, sideOffset, className: cn$4("z-[99999] flex items-center gap-1 rounded-[10px] bg-gray-1000 px-2 py-1.5 !text-label-13 text-background-100 shadow-md select-none", className), ...props, children: [children2, showArrow ? jsxRuntimeExports.jsx(Arrow2, { width: 11, height: 5, className: "fill-gray-1000" }) : null] }) }));
46024
+ TooltipContent$1.displayName = Content2.displayName;
45901
46025
  const ActiveSpanContext = reactExports.createContext(null);
45902
46026
  ActiveSpanContext.displayName = "ActiveSpanContext";
45903
46027
  function ActiveSpanProvider({ spans, children: children2 }) {
45904
- var _a3;
45905
- const [activeSpanId, setActiveSpanId] = reactExports.useState(((_a3 = spans[0]) == null ? void 0 : _a3.spanId) ?? null);
46028
+ const [activeSpanId, setActiveSpanId] = reactExports.useState(null);
45906
46029
  reactExports.useEffect(() => {
45907
46030
  setActiveSpanId((currentSpanId) => {
45908
46031
  if (!currentSpanId) {
@@ -48450,111 +48573,119 @@ const mermaid3ZIDBTTL = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.def
48450
48573
  Mermaid: Nt
48451
48574
  }, Symbol.toStringTag, { value: "Module" }));
48452
48575
  export {
48453
- Button$1 as $,
48576
+ _r as $,
48454
48577
  Anchor as A,
48455
48578
  Button as B,
48456
48579
  Content as C,
48457
48580
  DEFAULT_PAGE_SIZE as D,
48458
- useComposedRefs as E,
48459
- fetchRun as F,
48460
- cva as G,
48461
- Presence as H,
48462
- createContext2 as I,
48463
- fetchWorkflowsManifest as J,
48581
+ Arrow$1 as E,
48582
+ useComposedRefs as F,
48583
+ fetchRun as G,
48584
+ cva as H,
48585
+ Presence as I,
48586
+ createContext2 as J,
48464
48587
  Ks as K,
48465
48588
  LoaderCircle as L,
48466
- Spinner as M,
48467
- cn$4 as N,
48468
- Skeleton$1 as O,
48589
+ fetchWorkflowsManifest as M,
48590
+ Spinner as N,
48591
+ cn$4 as O,
48469
48592
  Primitive as P,
48470
48593
  Qe as Q,
48471
48594
  R,
48472
48595
  ServerConfigProvider as S,
48473
48596
  Tooltip as T,
48474
- DecryptClickContext as U,
48597
+ Skeleton$1 as U,
48475
48598
  VISUALLY_HIDDEN_STYLES as V,
48476
- isEncryptedMarker as W,
48477
- formatDuration as X,
48599
+ DecryptClickContext as W,
48600
+ isEncryptedMarker as X,
48478
48601
  Yr as Y,
48479
- DataInspector as Z,
48480
- _r as _,
48602
+ formatDuration as Z,
48603
+ DataInspector as _,
48481
48604
  TooltipTrigger as a,
48482
- Lock as a0,
48483
- RunClickContext as a1,
48484
- StreamClickContext as a2,
48485
- isExpiredMarker as a3,
48486
- isDoStreamStep as a4,
48487
- extractConversation as a5,
48488
- hasEncryptedFields as a6,
48489
- EVENT_DATA_REF_FIELDS as a7,
48490
- useSidebarDataOptional as a8,
48491
- clsx as a9,
48492
- getEncryptionKeyForRun as aA,
48493
- StreamViewer as aB,
48494
- composeRefs as aC,
48495
- useFloating as aD,
48496
- offset as aE,
48497
- shift as aF,
48498
- limitShift as aG,
48499
- flip as aH,
48500
- size as aI,
48501
- arrow as aJ,
48502
- hide as aK,
48503
- autoUpdate as aL,
48504
- cancelRun as aM,
48505
- reenqueueRun as aN,
48506
- wakeUpRun as aO,
48507
- resumeHook as aP,
48508
- recreateRun as aQ,
48509
- isSpanDimmedBySearch as aa,
48510
- getSpanDurationMs as ab,
48511
- getHighResInMs as ac,
48512
- ActiveSpanProvider as ad,
48513
- useActiveSpan as ae,
48514
- searchSpans as af,
48515
- computeRootBounds as ag,
48516
- computeTimeMarkers as ah,
48517
- TIMELINE_PADDING_PX as ai,
48518
- Timeline as aj,
48519
- TimelineHeader as ak,
48520
- SidebarDataProvider as al,
48521
- hydrateResourceIOWithKey as am,
48522
- hydrateResourceIO as an,
48523
- fetchHook as ao,
48524
- fetchStep as ap,
48525
- fetchStreams as aq,
48526
- Slot as ar,
48527
- Slottable as as,
48528
- buttonVariants as at,
48529
- fetchEvent as au,
48530
- fetchEventsByCorrelationId as av,
48531
- isEncryptedData as aw,
48532
- hydrateData as ax,
48533
- getWebRevivers as ay,
48534
- LIVE_UPDATE_INTERVAL_MS as az,
48605
+ Button$1 as a0,
48606
+ Lock as a1,
48607
+ RunClickContext as a2,
48608
+ StreamClickContext as a3,
48609
+ isExpiredMarker as a4,
48610
+ isDoStreamStep as a5,
48611
+ extractConversation as a6,
48612
+ hasEncryptedFields as a7,
48613
+ EVENT_DATA_REF_FIELDS as a8,
48614
+ useSidebarDataOptional as a9,
48615
+ Slottable as aA,
48616
+ buttonVariants as aB,
48617
+ fetchEvent as aC,
48618
+ fetchEventsByCorrelationId as aD,
48619
+ isEncryptedData as aE,
48620
+ hydrateData as aF,
48621
+ getWebRevivers as aG,
48622
+ LIVE_UPDATE_INTERVAL_MS as aH,
48623
+ getEncryptionKeyForRun as aI,
48624
+ StreamViewer as aJ,
48625
+ composeRefs as aK,
48626
+ useFloating as aL,
48627
+ offset as aM,
48628
+ shift as aN,
48629
+ limitShift as aO,
48630
+ flip as aP,
48631
+ size as aQ,
48632
+ arrow as aR,
48633
+ hide as aS,
48634
+ autoUpdate as aT,
48635
+ cancelRun as aU,
48636
+ reenqueueRun as aV,
48637
+ wakeUpRun as aW,
48638
+ resumeHook as aX,
48639
+ recreateRun as aY,
48640
+ clsx as aa,
48641
+ useRowWindow as ab,
48642
+ isSpanDimmedBySearch as ac,
48643
+ ROW_HEIGHT_PX as ad,
48644
+ getSpanDurationMs as ae,
48645
+ getHighResInMs as af,
48646
+ IconButton as ag,
48647
+ TooltipProvider as ah,
48648
+ ActiveSpanProvider as ai,
48649
+ useActiveSpan as aj,
48650
+ searchSpans as ak,
48651
+ computeRootBounds as al,
48652
+ computeTimeMarkers as am,
48653
+ TIMELINE_PADDING_PX as an,
48654
+ Timeline as ao,
48655
+ TimelineHeader as ap,
48656
+ Tooltip$1 as aq,
48657
+ TooltipTrigger$1 as ar,
48658
+ TooltipContent$1 as as,
48659
+ SidebarDataProvider as at,
48660
+ hydrateResourceIOWithKey as au,
48661
+ hydrateResourceIO as av,
48662
+ fetchHook as aw,
48663
+ fetchStep as ax,
48664
+ fetchStreams as ay,
48665
+ Slot as az,
48535
48666
  TooltipContent as b,
48536
48667
  createLucideIcon as c,
48537
48668
  cn as d,
48538
48669
  Toaster as e,
48539
- TooltipProvider as f,
48540
- useLayoutEffect2 as g,
48541
- useToast as h,
48542
- fetchRuns as i,
48543
- fetchHooks as j,
48544
- getPaginationDisplay as k,
48545
- fetchEvents as l,
48546
- useCallbackRef as m,
48547
- useComposedRefs$1 as n,
48548
- composeEventHandlers as o,
48549
- useId as p,
48550
- createPopperScope as q,
48670
+ TooltipProvider$1 as f,
48671
+ useToast as g,
48672
+ fetchRuns as h,
48673
+ fetchHooks as i,
48674
+ getPaginationDisplay as j,
48675
+ fetchEvents as k,
48676
+ useCallbackRef as l,
48677
+ useComposedRefs$1 as m,
48678
+ composeEventHandlers as n,
48679
+ useLayoutEffect2 as o,
48680
+ Portal$1 as p,
48681
+ useId as q,
48551
48682
  runHealthCheck as r,
48552
- DismissableLayer as s,
48683
+ createPopperScope as s,
48553
48684
  toast as t,
48554
48685
  useServerConfig as u,
48555
- createContextScope as v,
48556
- createSlot as w,
48557
- useControllableState as x,
48558
- Root2 as y,
48559
- Arrow$1 as z
48686
+ DismissableLayer as v,
48687
+ createContextScope as w,
48688
+ createSlot as x,
48689
+ useControllableState as y,
48690
+ Root2 as z
48560
48691
  };
@@ -1,5 +1,5 @@
1
- import { r as reactExports, j as jsxRuntimeExports, w as withComponentProps, x as withErrorBoundaryProps, M as Meta, L as Links, S as ScrollRestoration, y as Scripts, O as Outlet, z as useRouteError, i as isRouteErrorResponse, A as Link, B as useNavigate, C as useSearchParams } from "./index-BsV8i_Jn.js";
2
- import { c as createLucideIcon, u as useServerConfig, T as Tooltip, a as TooltipTrigger, b as TooltipContent, r as runHealthCheck, t as toast, B as Button, L as LoaderCircle, d as cn, e as Toaster$1, S as ServerConfigProvider, f as TooltipProvider } from "./mermaid-3ZIDBTTL-DPZjJwuX.js";
1
+ import { r as reactExports, j as jsxRuntimeExports, w as withComponentProps, x as withErrorBoundaryProps, M as Meta, L as Links, S as ScrollRestoration, y as Scripts, O as Outlet, z as useRouteError, i as isRouteErrorResponse, A as Link, B as useNavigate, C as useSearchParams } from "./index-BXZSIDEp.js";
2
+ import { c as createLucideIcon, u as useServerConfig, T as Tooltip, a as TooltipTrigger, b as TooltipContent, r as runHealthCheck, t as toast, B as Button, L as LoaderCircle, d as cn, e as Toaster$1, S as ServerConfigProvider, f as TooltipProvider } from "./mermaid-3ZIDBTTL-CeSti4VQ.js";
3
3
  var M = (e, i, s, u, m, a, l, h) => {
4
4
  let d = document.documentElement, w = ["light", "dark"];
5
5
  function p(n) {