@workflow/web 5.0.0-beta.27 → 5.0.0-beta.29

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 (30) hide show
  1. package/build/client/assets/arrow-up-right-nUJMbeWN.js +15 -0
  2. package/build/client/assets/{encryption-BQTnudEZ.js → encryption-CLVP4klT.js} +2 -2
  3. package/build/client/assets/{entry.client-DOJDY_4b.js → entry.client-Q4eUIqMI.js} +25 -25
  4. package/build/client/assets/{highlighted-body-B3W2YXNL-B-EF8R0t.js → highlighted-body-B3W2YXNL-_4bJAUnT.js} +2 -2
  5. package/build/client/assets/{home-DQkixJk4.js → home-W4Ja_rr1.js} +1698 -234
  6. package/build/client/assets/{index-C7C6cDW5.js → index-HqNj_XIX.js} +10 -10
  7. package/build/client/assets/{index-BXZSIDEp.js → index-Q81MFBxC.js} +22 -22
  8. package/build/client/assets/{index-ConSkUmc.js → index-STTN0-2V.js} +1 -1
  9. package/build/client/assets/manifest-56b6d9e0.js +1 -0
  10. package/build/client/assets/{mermaid-3ZIDBTTL-aixonSAh.js → mermaid-3ZIDBTTL-BfwKRFTU.js} +404 -77
  11. package/build/client/assets/{root-CsCdj08f.js → root-DOkL1_-J.js} +5 -15
  12. package/build/client/assets/root-okIQN2A_.css +1 -0
  13. package/build/client/assets/{run-detail-CCsVqid_.js → run-detail-CRleiBxx.js} +116 -195
  14. package/build/client/assets/server-build-H39y96IB.css +1 -0
  15. package/build/client/assets/{workflow-graph-viewer-BlPvo_5I.js → workflow-graph-viewer-CvsdACR5.js} +224 -199
  16. package/build/client/assets/{zstd-browser-decoder-RyHgsNO3.js → zstd-browser-decoder-bX851D8O.js} +3 -3
  17. package/build/server/assets/{app-kYNGZFkW.js → app-jsOjV9W7.js} +43 -43
  18. package/build/server/assets/{highlighted-body-B3W2YXNL-D1QWoqJB.js → highlighted-body-B3W2YXNL-DpTmbI4L.js} +4 -4
  19. package/build/server/assets/{index-BafExO0s.js → index-BfLBLRRi.js} +10 -10
  20. package/build/server/assets/{index-fWQcXKhC.js → index-CJPCT6Jd.js} +5 -5
  21. package/build/server/assets/{mermaid-3ZIDBTTL-BOh-zwwU.js → mermaid-3ZIDBTTL-Dl6hRpcE.js} +4 -4
  22. package/build/server/assets/{server-build-B21fZEey.js → server-build-BRxoSdNU.js} +39298 -37117
  23. package/build/server/assets/{token-DmIqmbeU.js → token-BqP-cpRD.js} +2 -2
  24. package/build/server/assets/{token-util-D4JYdrFc.js → token-util-DaPlIe_a.js} +2 -2
  25. package/build/server/assets/{zstd-browser-decoder-DgO7NCG6.js → zstd-browser-decoder-Cyb8--z9.js} +5 -5
  26. package/build/server/index.js +1 -1
  27. package/package.json +10 -8
  28. package/build/client/assets/manifest-ce6dd06d.js +0 -1
  29. package/build/client/assets/root-BlaSucTH.css +0 -1
  30. package/build/client/assets/server-build-DPrKlhgf.css +0 -1
@@ -1,9 +1,9 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/encryption-BQTnudEZ.js","assets/index-ConSkUmc.js","assets/index-BXZSIDEp.js","assets/zstd-browser-decoder-RyHgsNO3.js","assets/highlighted-body-B3W2YXNL-B-EF8R0t.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/encryption-CLVP4klT.js","assets/index-STTN0-2V.js","assets/index-Q81MFBxC.js","assets/zstd-browser-decoder-bX851D8O.js","assets/highlighted-body-B3W2YXNL-_4bJAUnT.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, _b;
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";
6
+ import { r as reactExports, j as jsxRuntimeExports, p as reactDomExports, I as React, G as ReactDOM, R as ReactExports, g as getDefaultExportFromCjs } from "./index-Q81MFBxC.js";
7
7
  function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
8
8
  return function handleEvent(event) {
9
9
  originalEventHandler == null ? void 0 : originalEventHandler(event);
@@ -10542,7 +10542,7 @@ async function hydrateDataWithKey(value, revivers, key) {
10542
10542
  let data = value;
10543
10543
  if (data instanceof Uint8Array && isEncryptedData(data) && key) {
10544
10544
  const { decrypt } = await __vitePreload(async () => {
10545
- const { decrypt: decrypt2 } = await import("./encryption-BQTnudEZ.js");
10545
+ const { decrypt: decrypt2 } = await import("./encryption-CLVP4klT.js");
10546
10546
  return { decrypt: decrypt2 };
10547
10547
  }, true ? __vite__mapDeps([0,1,2]) : void 0);
10548
10548
  const { payload } = decodeFormatPrefix(data);
@@ -15504,6 +15504,22 @@ const BaseEventSchema = object({
15504
15504
  correlationId: string$2().optional(),
15505
15505
  specVersion: number$3().optional()
15506
15506
  });
15507
+ const stepLatencyTelemetryFields = {
15508
+ // Time-to-first-step: milliseconds from run creation until the run's first
15509
+ // step body began executing, minus time spent committing hook_created
15510
+ // events. Only reported when nothing else (hooks received, waits,
15511
+ // attributes, other steps) happened before the first step.
15512
+ ttfs: number$3().optional(),
15513
+ // Step-to-step overhead: milliseconds between the previous step's terminal
15514
+ // event and this step's body beginning to execute. Only reported when the
15515
+ // two steps ran back-to-back (the previous event-log entry is a
15516
+ // step_completed/step_failed).
15517
+ stso: number$3().optional(),
15518
+ // Names of the runtime's optional startup-latency optimizations that were
15519
+ // active for this measurement (e.g. 'turbo', 'lazyStepStart',
15520
+ // 'optimisticStart'), so latency metrics can be segmented by them.
15521
+ optimizations: array(string$2()).optional()
15522
+ };
15507
15523
  const StepCompletedEventSchema = BaseEventSchema.extend({
15508
15524
  eventType: literal("step_completed"),
15509
15525
  correlationId: string$2(),
@@ -15513,7 +15529,8 @@ const StepCompletedEventSchema = BaseEventSchema.extend({
15513
15529
  // the key without an extra run lookup on this hot per-step write.
15514
15530
  // Optional: older runtimes omit it and the backend falls back to a read.
15515
15531
  workflowName: string$2().optional(),
15516
- result: SerializedDataSchema
15532
+ result: SerializedDataSchema,
15533
+ ...stepLatencyTelemetryFields
15517
15534
  })
15518
15535
  });
15519
15536
  const StepFailedEventSchema = BaseEventSchema.extend({
@@ -15523,7 +15540,8 @@ const StepFailedEventSchema = BaseEventSchema.extend({
15523
15540
  stepName: string$2().optional(),
15524
15541
  // The thrown value, serialized via the workflow serialization pipeline.
15525
15542
  // Can be any JavaScript value (string, number, object, Error, etc.)
15526
- error: SerializedDataSchema
15543
+ error: SerializedDataSchema,
15544
+ ...stepLatencyTelemetryFields
15527
15545
  })
15528
15546
  });
15529
15547
  const StepRetryingEventSchema = BaseEventSchema.extend({
@@ -15670,7 +15688,13 @@ const RunFailedEventSchema = BaseEventSchema.extend({
15670
15688
  })
15671
15689
  });
15672
15690
  const RunCancelledEventSchema = BaseEventSchema.extend({
15673
- eventType: literal("run_cancelled")
15691
+ eventType: literal("run_cancelled"),
15692
+ eventData: object({
15693
+ // Optional free-text reason for the cancellation. Kept as small
15694
+ // plaintext metadata (like run_failed's errorCode) so it survives
15695
+ // resolveData: 'none' and can be displayed without decryption.
15696
+ cancelReason: string$2().max(512).optional()
15697
+ }).optional()
15674
15698
  });
15675
15699
  discriminatedUnion("eventType", [
15676
15700
  // Run lifecycle events
@@ -16375,12 +16399,12 @@ async function hydrateResourceIOAsync(resource, key) {
16375
16399
  return { hydrateDataWithKey: hydrateDataWithKey3 };
16376
16400
  }, true ? void 0 : void 0);
16377
16401
  const { ensureZstdDecoderRegistered } = await __vitePreload(async () => {
16378
- const { ensureZstdDecoderRegistered: ensureZstdDecoderRegistered2 } = await import("./zstd-browser-decoder-RyHgsNO3.js");
16402
+ const { ensureZstdDecoderRegistered: ensureZstdDecoderRegistered2 } = await import("./zstd-browser-decoder-bX851D8O.js");
16379
16403
  return { ensureZstdDecoderRegistered: ensureZstdDecoderRegistered2 };
16380
16404
  }, true ? __vite__mapDeps([3,2]) : void 0);
16381
16405
  ensureZstdDecoderRegistered();
16382
16406
  const cryptoKey = key ? await __vitePreload(async () => {
16383
- const { importKey } = await import("./encryption-BQTnudEZ.js");
16407
+ const { importKey } = await import("./encryption-CLVP4klT.js");
16384
16408
  return { importKey };
16385
16409
  }, true ? __vite__mapDeps([0,1,2]) : void 0).then(({ importKey }) => importKey(key)) : void 0;
16386
16410
  const revivers = getRevivers();
@@ -17522,26 +17546,26 @@ const ToastContext = reactExports.createContext(defaultAdapter);
17522
17546
  function useToast() {
17523
17547
  return reactExports.useContext(ToastContext);
17524
17548
  }
17525
- const MS_IN_SECOND = 1e3;
17526
- const MS_IN_MINUTE = 60 * MS_IN_SECOND;
17549
+ const MS_IN_SECOND$1 = 1e3;
17550
+ const MS_IN_MINUTE = 60 * MS_IN_SECOND$1;
17527
17551
  const MS_IN_HOUR = 60 * MS_IN_MINUTE;
17528
17552
  const MS_IN_DAY = 24 * MS_IN_HOUR;
17529
17553
  function formatDuration(ms, compact = false) {
17530
17554
  if (ms === 0) {
17531
17555
  return "0s";
17532
17556
  }
17533
- if (ms < MS_IN_SECOND) {
17557
+ if (ms < MS_IN_SECOND$1) {
17534
17558
  const roundedMs2 = Math.round(ms);
17535
- return roundedMs2 < MS_IN_SECOND ? `${roundedMs2}ms` : "1s";
17559
+ return roundedMs2 < MS_IN_SECOND$1 ? `${roundedMs2}ms` : "1s";
17536
17560
  }
17537
- const roundedMs = Math.round(ms / MS_IN_SECOND) * MS_IN_SECOND;
17561
+ const roundedMs = Math.round(ms / MS_IN_SECOND$1) * MS_IN_SECOND$1;
17538
17562
  if (roundedMs < MS_IN_MINUTE) {
17539
- return `${Math.floor(roundedMs / MS_IN_SECOND)}s`;
17563
+ return `${Math.floor(roundedMs / MS_IN_SECOND$1)}s`;
17540
17564
  }
17541
17565
  if (compact) {
17542
17566
  if (roundedMs < MS_IN_HOUR) {
17543
17567
  const m3 = Math.floor(roundedMs / MS_IN_MINUTE);
17544
- const s2 = Math.floor(roundedMs % MS_IN_MINUTE / MS_IN_SECOND);
17568
+ const s2 = Math.floor(roundedMs % MS_IN_MINUTE / MS_IN_SECOND$1);
17545
17569
  return s2 > 0 ? `${m3}m ${s2}s` : `${m3}m`;
17546
17570
  }
17547
17571
  const h2 = Math.floor(roundedMs / MS_IN_HOUR);
@@ -17551,7 +17575,7 @@ function formatDuration(ms, compact = false) {
17551
17575
  const days = Math.floor(roundedMs / MS_IN_DAY);
17552
17576
  const hours = Math.floor(roundedMs % MS_IN_DAY / MS_IN_HOUR);
17553
17577
  const minutes = Math.floor(roundedMs % MS_IN_HOUR / MS_IN_MINUTE);
17554
- const seconds = Math.floor(roundedMs % MS_IN_MINUTE / MS_IN_SECOND);
17578
+ const seconds = Math.floor(roundedMs % MS_IN_MINUTE / MS_IN_SECOND$1);
17555
17579
  const parts = [];
17556
17580
  if (days > 0) {
17557
17581
  parts.push(`${days}d`);
@@ -17565,28 +17589,25 @@ function formatDuration(ms, compact = false) {
17565
17589
  parts.push(`${seconds}s`);
17566
17590
  return parts.join(" ");
17567
17591
  }
17568
- const preciseSecondsFormatter = new Intl.NumberFormat(void 0, {
17569
- minimumFractionDigits: 2,
17570
- maximumFractionDigits: 2
17571
- });
17572
- function formatDurationPrecise(ms) {
17592
+ function formatDurationPrecise(ms, fractionDigits = 2) {
17573
17593
  if (ms === 0) {
17574
17594
  return "0s";
17575
17595
  }
17576
- if (ms < MS_IN_SECOND) {
17596
+ if (ms < MS_IN_SECOND$1) {
17577
17597
  const roundedMs = Math.round(ms);
17578
- if (roundedMs < MS_IN_SECOND) {
17598
+ if (roundedMs < MS_IN_SECOND$1) {
17579
17599
  return `${roundedMs}ms`;
17580
17600
  }
17581
17601
  }
17582
- const normalizedMs = Math.round(ms / 10) * 10;
17602
+ const granularityMs = MS_IN_SECOND$1 / 10 ** fractionDigits;
17603
+ const normalizedMs = Math.round(ms / granularityMs) * granularityMs;
17583
17604
  if (normalizedMs < MS_IN_MINUTE) {
17584
- return `${preciseSecondsFormatter.format(normalizedMs / MS_IN_SECOND)}s`;
17605
+ return `${Number((normalizedMs / MS_IN_SECOND$1).toFixed(fractionDigits))}s`;
17585
17606
  }
17586
17607
  const days = Math.floor(normalizedMs / MS_IN_DAY);
17587
17608
  const hours = Math.floor(normalizedMs % MS_IN_DAY / MS_IN_HOUR);
17588
17609
  const minutes = Math.floor(normalizedMs % MS_IN_HOUR / MS_IN_MINUTE);
17589
- const seconds = normalizedMs % MS_IN_MINUTE / MS_IN_SECOND;
17610
+ const seconds = normalizedMs % MS_IN_MINUTE / MS_IN_SECOND$1;
17590
17611
  const parts = [];
17591
17612
  if (days > 0) {
17592
17613
  parts.push(`${days}d`);
@@ -17597,7 +17618,7 @@ function formatDurationPrecise(ms) {
17597
17618
  if (minutes > 0) {
17598
17619
  parts.push(`${minutes}m`);
17599
17620
  }
17600
- parts.push(`${preciseSecondsFormatter.format(seconds)}s`);
17621
+ parts.push(`${Number(seconds.toFixed(fractionDigits))}s`);
17601
17622
  return parts.join(" ");
17602
17623
  }
17603
17624
  function isDoStreamStep(stepName) {
@@ -43940,7 +43961,7 @@ var tn = f("block", "before:content-[counter(line)]", "before:inline-block", "be
43940
43961
  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 });
43941
43962
  var Se = reactExports.createContext({ code: "" }), de = () => reactExports.useContext(Se);
43942
43963
  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 }) });
43943
- var cn$1 = /\n+$/, dn = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-B3W2YXNL-B-EF8R0t.js"), true ? __vite__mapDeps([4,2]) : void 0).then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
43964
+ var cn$1 = /\n+$/, dn = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-B3W2YXNL-_4bJAUnT.js"), true ? __vite__mapDeps([4,2]) : void 0).then((e) => ({ default: e.HighlightedCodeBlockBody }))), rt = ({ code: e, language: t, className: o, children: n, isIncomplete: s2 = false, ...r2 }) => {
43944
43965
  let i = reactExports.useMemo(() => e.replace(cn$1, ""), [e]), c = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i.split(`
43945
43966
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i]);
43946
43967
  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 }) })] }) });
@@ -46198,6 +46219,26 @@ function computeRootBounds(spans) {
46198
46219
  function getSpanDurationMs(span) {
46199
46220
  return Math.max(0, getHighResInMs(span.endTime) - getHighResInMs(span.startTime));
46200
46221
  }
46222
+ function isSpanErrored(span) {
46223
+ var _a3;
46224
+ const workflowStatus = (_a3 = span.attributes.data) == null ? void 0 : _a3.status;
46225
+ return span.status.code === 2 || workflowStatus === "failed";
46226
+ }
46227
+ function clampViewportToRoot(next2, rootStart, rootEnd, minDurationMs) {
46228
+ const rootDuration = Math.max(rootEnd - rootStart, minDurationMs);
46229
+ const duration2 = Math.min(rootDuration, Math.max(minDurationMs, next2.end - next2.start));
46230
+ const maxStart = rootEnd - duration2;
46231
+ const start = Math.min(Math.max(next2.start, rootStart), maxStart);
46232
+ return { start, end: start + duration2 };
46233
+ }
46234
+ function wheelDeltaToPixels(delta, deltaMode) {
46235
+ return deltaMode === 1 ? delta * 16 : delta;
46236
+ }
46237
+ function wheelZoomScaleFactor(event) {
46238
+ const dy = wheelDeltaToPixels(event.deltaY, event.deltaMode);
46239
+ const isMouseWheel = event.deltaMode === 1 || Math.abs(event.deltaY) >= 50;
46240
+ return 2 ** (dy / (isMouseWheel ? 200 : 60));
46241
+ }
46201
46242
  const NICE_INTERVALS = [
46202
46243
  1,
46203
46244
  2,
@@ -46231,6 +46272,7 @@ const NICE_INTERVALS = [
46231
46272
  5e9
46232
46273
  ];
46233
46274
  const MAX_MARKERS = 8;
46275
+ const MS_IN_SECOND = 1e3;
46234
46276
  function pickInterval(viewDuration, maxTicks) {
46235
46277
  for (const interval of NICE_INTERVALS) {
46236
46278
  if (viewDuration / interval <= maxTicks)
@@ -46243,6 +46285,7 @@ function computeTimeMarkers(viewDuration, offset2) {
46243
46285
  return [];
46244
46286
  const maxTicks = 6;
46245
46287
  const interval = pickInterval(viewDuration, maxTicks);
46288
+ const fractionDigits = interval >= MS_IN_SECOND ? 0 : Math.ceil(-Math.log10(interval / MS_IN_SECOND));
46246
46289
  const firstTick = Math.ceil(offset2 / interval) * interval;
46247
46290
  const markers2 = [];
46248
46291
  for (let t = firstTick; t <= offset2 + viewDuration; t += interval) {
@@ -46251,7 +46294,7 @@ function computeTimeMarkers(viewDuration, offset2) {
46251
46294
  continue;
46252
46295
  markers2.push({
46253
46296
  position: Math.min(Math.max(position2, 0), 1),
46254
- label: formatDuration(Math.abs(t), true),
46297
+ label: fractionDigits === 0 ? formatDuration(Math.abs(t), true) : formatDurationPrecise(Math.abs(t), fractionDigits),
46255
46298
  value: t
46256
46299
  });
46257
46300
  if (markers2.length >= MAX_MARKERS)
@@ -46767,7 +46810,6 @@ function SegmentBar({ segments, showLabels = true }) {
46767
46810
  }) });
46768
46811
  }
46769
46812
  const TimelineBar = reactExports.memo(function TimelineBar2({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, onRevealTime }) {
46770
- var _a3;
46771
46813
  const startMs = getHighResInMs(span.startTime);
46772
46814
  const endMs = getHighResInMs(span.endTime);
46773
46815
  const totalDurationMs = getSpanDurationMs(span);
@@ -46778,8 +46820,7 @@ const TimelineBar = reactExports.memo(function TimelineBar2({ span, viewStart, v
46778
46820
  const markers2 = reactExports.useMemo(() => geometry.mode.kind === "full" ? cullCollidingMarkers(projectMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs), geometry.visiblePixelWidth) : [], [geometry, baseMarkers]);
46779
46821
  const offscreen = reactExports.useMemo(() => geometry.mode.kind === "full" ? computeOffscreenMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs) : { left: null, right: null }, [geometry, baseMarkers]);
46780
46822
  const hasMarkers = markers2.length > 0 || offscreen.left !== null || offscreen.right !== null;
46781
- const workflowStatus = (_a3 = span.attributes.data) == null ? void 0 : _a3.status;
46782
- const isErrored = span.status.code === 2 || workflowStatus === "failed";
46823
+ const isErrored = isSpanErrored(span);
46783
46824
  const colors = getResourceColor(span.resource);
46784
46825
  const fallbackBg = isErrored ? colors.errorBg ?? "var(--ds-red-200)" : colors.bg;
46785
46826
  const fallbackBorder = isErrored ? colors.errorBorder ?? "var(--ds-red-500)" : colors.border;
@@ -46828,8 +46869,285 @@ function Timeline({ spans, viewStart, viewEnd, markers: markers2, selectedId, se
46828
46869
  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) => (
46829
46870
  // Skip the "0s" origin marker since the left edge already implies it.
46830
46871
  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}%` } }, String(marker2.value)) : null
46831
- )) }), 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, onRevealTime }, 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)) })] });
46872
+ )) }), 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, onRevealTime }, 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: formatDurationPrecise(gap.gapMs), rowIndex: gap.rowIndex }, gap.rowIndex)) })] });
46873
+ }
46874
+ const CANVAS_PAD_Y_PX = 6;
46875
+ const MIN_LINE_HEIGHT_PX = 1.5;
46876
+ const MAX_LINE_HEIGHT_PX = 3;
46877
+ const MIN_LINE_WIDTH_PX = 2;
46878
+ const CLICK_DRAG_THRESHOLD_PX = 3;
46879
+ const MIN_BRUSH_WIDTH_PX = 6;
46880
+ const KEYBOARD_PAN_FRACTION = 0.1;
46881
+ const RESOURCE_LINE_TOKENS = {
46882
+ run: "--ds-blue-400",
46883
+ step: "--ds-green-400",
46884
+ hook: "--ds-gray-400",
46885
+ sleep: "--ds-gray-400"
46886
+ };
46887
+ const DEFAULT_LINE_TOKEN = "--ds-gray-400";
46888
+ const ERROR_LINE_TOKEN = "--ds-red-400";
46889
+ function computeDensityLayout(spans, rootStartMs, rootDurationMs, contentWidth, contentHeight) {
46890
+ const count2 = spans.length;
46891
+ const lineHeight = Math.max(MIN_LINE_HEIGHT_PX, Math.min(MAX_LINE_HEIGHT_PX, contentHeight / count2));
46892
+ const rowStep = count2 > 1 ? Math.min((contentHeight - lineHeight) / (count2 - 1), lineHeight + 1) : 0;
46893
+ const rectsByToken = /* @__PURE__ */ new Map();
46894
+ spans.forEach((span, index2) => {
46895
+ const token = isSpanErrored(span) ? ERROR_LINE_TOKEN : RESOURCE_LINE_TOKENS[span.resource] ?? DEFAULT_LINE_TOKEN;
46896
+ const startMs = getHighResInMs(span.startTime);
46897
+ const endMs = getHighResInMs(span.endTime);
46898
+ const x2 = TIMELINE_PADDING_PX + (startMs - rootStartMs) / rootDurationMs * contentWidth;
46899
+ const w2 = Math.max(MIN_LINE_WIDTH_PX, (endMs - startMs) / rootDurationMs * contentWidth);
46900
+ const y2 = CANVAS_PAD_Y_PX + index2 * rowStep;
46901
+ const rects = rectsByToken.get(token) ?? [];
46902
+ rects.push([x2, y2, w2]);
46903
+ rectsByToken.set(token, rects);
46904
+ });
46905
+ return { lineHeight, rectsByToken };
46832
46906
  }
46907
+ function useDpr() {
46908
+ const [dpr, setDpr] = reactExports.useState(1);
46909
+ reactExports.useLayoutEffect(() => {
46910
+ const onChange = () => setDpr(window.devicePixelRatio || 1);
46911
+ const media = matchMedia(`(resolution: ${dpr}dppx)`);
46912
+ media.addEventListener("change", onChange);
46913
+ onChange();
46914
+ return () => media.removeEventListener("change", onChange);
46915
+ }, [dpr]);
46916
+ return dpr;
46917
+ }
46918
+ function useThemeVersion() {
46919
+ const [version2, setVersion] = reactExports.useState(0);
46920
+ reactExports.useEffect(() => {
46921
+ const observer = new MutationObserver(() => setVersion((v2) => v2 + 1));
46922
+ observer.observe(document.documentElement, {
46923
+ attributes: true,
46924
+ attributeFilter: ["class", "data-theme", "style"]
46925
+ });
46926
+ return () => observer.disconnect();
46927
+ }, []);
46928
+ return version2;
46929
+ }
46930
+ const Minimap = reactExports.memo(function Minimap2({ spans, root: root2, viewport, minViewportMs, onViewportChange, onAnimateTo }) {
46931
+ const { startTime: rootStartMs, endTime: rootEndMs, duration: rootDurationMs } = root2;
46932
+ const containerRef = reactExports.useRef(null);
46933
+ const canvasRef = reactExports.useRef(null);
46934
+ const dpr = useDpr();
46935
+ const themeVersion = useThemeVersion();
46936
+ const viewportRef = reactExports.useRef(viewport);
46937
+ viewportRef.current = viewport;
46938
+ const [drag, setDrag] = reactExports.useState(null);
46939
+ const [selection, setSelection] = reactExports.useState(null);
46940
+ const xToTime = reactExports.useCallback((x2, contentWidth) => {
46941
+ if (contentWidth <= 0)
46942
+ return rootStartMs;
46943
+ const fraction = (x2 - TIMELINE_PADDING_PX) / contentWidth;
46944
+ return Math.min(Math.max(rootStartMs + fraction * rootDurationMs, rootStartMs), rootEndMs);
46945
+ }, [rootStartMs, rootDurationMs, rootEndMs]);
46946
+ const clamp2 = reactExports.useCallback((next2) => clampViewportToRoot(next2, rootStartMs, rootEndMs, minViewportMs), [rootStartMs, rootEndMs, minViewportMs]);
46947
+ reactExports.useLayoutEffect(() => {
46948
+ const canvas = canvasRef.current;
46949
+ const container = containerRef.current;
46950
+ const ctx = canvas == null ? void 0 : canvas.getContext("2d");
46951
+ if (!canvas || !container || !ctx)
46952
+ return;
46953
+ const draw = () => {
46954
+ const width = canvas.clientWidth;
46955
+ const height = canvas.clientHeight;
46956
+ const contentWidth = width - TIMELINE_PADDING_PX * 2;
46957
+ if (width <= 0 || height <= 0 || contentWidth <= 0)
46958
+ return;
46959
+ canvas.width = Math.round(width * dpr);
46960
+ canvas.height = Math.round(height * dpr);
46961
+ ctx.scale(dpr, dpr);
46962
+ ctx.clearRect(0, 0, width, height);
46963
+ if (spans.length === 0 || rootDurationMs <= 0)
46964
+ return;
46965
+ const { lineHeight, rectsByToken } = computeDensityLayout(spans, rootStartMs, rootDurationMs, contentWidth, height - CANVAS_PAD_Y_PX * 2);
46966
+ const style2 = getComputedStyle(container);
46967
+ const drawToken = (token) => {
46968
+ const rects = rectsByToken.get(token);
46969
+ if (!rects)
46970
+ return;
46971
+ ctx.fillStyle = style2.getPropertyValue(token).trim() || "rgb(160,160,160)";
46972
+ ctx.beginPath();
46973
+ for (const [x2, y2, w2] of rects) {
46974
+ ctx.roundRect(x2, y2, w2, lineHeight, lineHeight / 2);
46975
+ }
46976
+ ctx.fill();
46977
+ };
46978
+ for (const token of rectsByToken.keys()) {
46979
+ if (token !== ERROR_LINE_TOKEN)
46980
+ drawToken(token);
46981
+ }
46982
+ drawToken(ERROR_LINE_TOKEN);
46983
+ };
46984
+ draw();
46985
+ const observer = new ResizeObserver(draw);
46986
+ observer.observe(container);
46987
+ return () => observer.disconnect();
46988
+ }, [spans, rootStartMs, rootDurationMs, dpr, themeVersion]);
46989
+ const pointerFrame = reactExports.useCallback((e) => {
46990
+ const rect = e.currentTarget.getBoundingClientRect();
46991
+ return {
46992
+ x: e.clientX - rect.left,
46993
+ cw: rect.width - TIMELINE_PADDING_PX * 2
46994
+ };
46995
+ }, []);
46996
+ const resolveDragState = reactExports.useCallback((target2, x2, cw) => {
46997
+ if (target2.closest('[data-minimap-handle="left"]')) {
46998
+ return { mode: "resize-left" };
46999
+ }
47000
+ if (target2.closest('[data-minimap-handle="right"]')) {
47001
+ return { mode: "resize-right" };
47002
+ }
47003
+ const { start, end } = viewportRef.current;
47004
+ const isFullExtent = start - rootStartMs < rootDurationMs * 1e-3 && rootEndMs - end < rootDurationMs * 1e-3;
47005
+ if (target2.closest("[data-minimap-brush]") && !isFullExtent) {
47006
+ return { mode: "pan", grabOffsetMs: xToTime(x2, cw) - start };
47007
+ }
47008
+ return { mode: "select", originX: x2, originMs: xToTime(x2, cw) };
47009
+ }, [xToTime, rootStartMs, rootDurationMs, rootEndMs]);
47010
+ const handlePointerDown = reactExports.useCallback((e) => {
47011
+ if (e.button !== 0)
47012
+ return;
47013
+ const { x: x2, cw } = pointerFrame(e);
47014
+ if (cw <= 0)
47015
+ return;
47016
+ e.currentTarget.setPointerCapture(e.pointerId);
47017
+ setDrag(resolveDragState(e.target, x2, cw));
47018
+ }, [pointerFrame, resolveDragState]);
47019
+ const handlePointerMove = reactExports.useCallback((e) => {
47020
+ if (!drag)
47021
+ return;
47022
+ const { x: x2, cw } = pointerFrame(e);
47023
+ const t = xToTime(x2, cw);
47024
+ const { start, end } = viewportRef.current;
47025
+ if (drag.mode === "pan") {
47026
+ const duration2 = end - start;
47027
+ onViewportChange(clamp2({
47028
+ start: t - drag.grabOffsetMs,
47029
+ end: t - drag.grabOffsetMs + duration2
47030
+ }));
47031
+ } else if (drag.mode === "resize-left") {
47032
+ onViewportChange({ start: Math.min(t, end - minViewportMs), end });
47033
+ } else if (drag.mode === "resize-right") {
47034
+ onViewportChange({ start, end: Math.max(t, start + minViewportMs) });
47035
+ } else if (selection || Math.abs(x2 - drag.originX) > CLICK_DRAG_THRESHOLD_PX) {
47036
+ setSelection({
47037
+ x0: Math.min(drag.originX, x2),
47038
+ x1: Math.max(drag.originX, x2)
47039
+ });
47040
+ }
47041
+ }, [
47042
+ drag,
47043
+ selection,
47044
+ pointerFrame,
47045
+ xToTime,
47046
+ onViewportChange,
47047
+ clamp2,
47048
+ minViewportMs
47049
+ ]);
47050
+ const endDrag = reactExports.useCallback((e) => {
47051
+ if (!drag)
47052
+ return;
47053
+ if (drag.mode === "select") {
47054
+ const { x: x2, cw } = pointerFrame(e);
47055
+ const t = xToTime(x2, cw);
47056
+ if (selection) {
47057
+ onAnimateTo(clamp2({
47058
+ start: Math.min(drag.originMs, t),
47059
+ end: Math.max(drag.originMs, t)
47060
+ }));
47061
+ } else {
47062
+ const { start, end } = viewportRef.current;
47063
+ const duration2 = end - start;
47064
+ onAnimateTo(clamp2({ start: t - duration2 / 2, end: t + duration2 / 2 }));
47065
+ }
47066
+ }
47067
+ setSelection(null);
47068
+ setDrag(null);
47069
+ }, [drag, selection, pointerFrame, xToTime, onAnimateTo, clamp2]);
47070
+ const handleLostPointerCapture = reactExports.useCallback(() => {
47071
+ setSelection(null);
47072
+ setDrag(null);
47073
+ }, []);
47074
+ const handleDoubleClick = reactExports.useCallback(() => {
47075
+ onAnimateTo({ start: rootStartMs, end: rootEndMs });
47076
+ }, [onAnimateTo, rootStartMs, rootEndMs]);
47077
+ reactExports.useEffect(() => {
47078
+ const el = containerRef.current;
47079
+ if (!el || rootDurationMs <= 0)
47080
+ return;
47081
+ const zoomAtCursor = (e, cw, left) => {
47082
+ const scaleFactor = wheelZoomScaleFactor(e);
47083
+ const { start, end } = viewportRef.current;
47084
+ const duration2 = end - start;
47085
+ const cursorFraction = Math.min(Math.max((e.clientX - left - TIMELINE_PADDING_PX) / cw, 0), 1);
47086
+ const cursorMs = rootStartMs + cursorFraction * rootDurationMs;
47087
+ const anchor = Math.min(Math.max(duration2 > 0 ? (cursorMs - start) / duration2 : 0.5, 0), 1);
47088
+ const newDuration = duration2 * scaleFactor;
47089
+ onViewportChange(clamp2({
47090
+ start: cursorMs - anchor * newDuration,
47091
+ end: cursorMs + (1 - anchor) * newDuration
47092
+ }));
47093
+ };
47094
+ const panByMapPixels = (e, cw) => {
47095
+ const dx = wheelDeltaToPixels(e.deltaX, e.deltaMode);
47096
+ const panMs = dx / cw * rootDurationMs;
47097
+ const { start, end } = viewportRef.current;
47098
+ onViewportChange(clamp2({ start: start + panMs, end: end + panMs }));
47099
+ };
47100
+ const onWheel = (e) => {
47101
+ const isZoomGesture = e.ctrlKey || e.metaKey;
47102
+ const hasDeltaX = Math.abs(e.deltaX) > Math.abs(e.deltaY);
47103
+ if (!isZoomGesture && !hasDeltaX)
47104
+ return;
47105
+ e.preventDefault();
47106
+ const rect = el.getBoundingClientRect();
47107
+ const cw = rect.width - TIMELINE_PADDING_PX * 2;
47108
+ if (cw <= 0)
47109
+ return;
47110
+ if (isZoomGesture)
47111
+ zoomAtCursor(e, cw, rect.left);
47112
+ else
47113
+ panByMapPixels(e, cw);
47114
+ };
47115
+ el.addEventListener("wheel", onWheel, { passive: false });
47116
+ return () => el.removeEventListener("wheel", onWheel);
47117
+ }, [rootStartMs, rootDurationMs, onViewportChange, clamp2]);
47118
+ const handleKeyDown = reactExports.useCallback((e) => {
47119
+ const { start, end } = viewportRef.current;
47120
+ const duration2 = end - start;
47121
+ const pan = duration2 * KEYBOARD_PAN_FRACTION;
47122
+ if (e.key === "ArrowLeft") {
47123
+ onViewportChange(clamp2({ start: start - pan, end: end - pan }));
47124
+ } else if (e.key === "ArrowRight") {
47125
+ onViewportChange(clamp2({ start: start + pan, end: end + pan }));
47126
+ } else if (e.key === "Home") {
47127
+ onViewportChange(clamp2({ start: rootStartMs, end: rootStartMs + duration2 }));
47128
+ } else if (e.key === "End") {
47129
+ onViewportChange(clamp2({ start: rootEndMs - duration2, end: rootEndMs }));
47130
+ } else {
47131
+ return;
47132
+ }
47133
+ e.preventDefault();
47134
+ }, [onViewportChange, clamp2, rootStartMs, rootEndMs]);
47135
+ const startFraction = (viewport.start - rootStartMs) / rootDurationMs;
47136
+ const endFraction = (viewport.end - rootStartMs) / rootDurationMs;
47137
+ const trackWidth = `(100% - ${TIMELINE_PADDING_PX * 2}px)`;
47138
+ const brushStyle = {
47139
+ left: `calc(${TIMELINE_PADDING_PX}px + ${startFraction} * ${trackWidth})`,
47140
+ width: `max(${MIN_BRUSH_WIDTH_PX}px, calc(${endFraction - startFraction} * ${trackWidth}))`
47141
+ };
47142
+ const viewDuration = viewport.end - viewport.start;
47143
+ const scrollableMs = Math.max(rootDurationMs - viewDuration, 0);
47144
+ const scrollPercent = scrollableMs > 0 ? Math.round((viewport.start - rootStartMs) / scrollableMs * 100) : 0;
47145
+ return jsxRuntimeExports.jsxs("div", { ref: containerRef, className: cn$4("relative h-10 min-h-10 w-full border-b border-gray-alpha-400 bg-background-100 select-none overflow-hidden touch-none", (drag == null ? void 0 : drag.mode) === "select" && "cursor-crosshair"), onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: endDrag, onPointerCancel: endDrag, onLostPointerCapture: handleLostPointerCapture, onDoubleClick: handleDoubleClick, children: [jsxRuntimeExports.jsx("canvas", { ref: canvasRef, "aria-hidden": true, className: "pointer-events-none absolute inset-0 h-full w-full mix-blend-multiply [.dark-theme_&]:mix-blend-screen [.dark_&]:mix-blend-screen [[data-theme=dark]_&]:mix-blend-screen" }), selection ? jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "pointer-events-none absolute inset-y-0 border border-blue-500 bg-blue-300 opacity-40", style: { left: selection.x0, width: selection.x1 - selection.x0 } }) : null, jsxRuntimeExports.jsxs("div", { "data-minimap-brush": true, role: "scrollbar", "aria-controls": "trace-timeline", "aria-orientation": "horizontal", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": scrollPercent, "aria-valuetext": `Viewing ${formatDurationPrecise(viewport.start - rootStartMs)} to ${formatDurationPrecise(viewport.end - rootStartMs)} of ${formatDurationPrecise(rootDurationMs)}`, "aria-label": "Timeline overview", tabIndex: 0, onKeyDown: handleKeyDown, className: cn$4(
47146
+ // Glass thumb, matching the legacy trace viewer's map window.
47147
+ "group/minimap-brush absolute top-0.5 bottom-0.5 rounded-[3px] border border-gray-alpha-400 bg-gray-alpha-200 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--ds-focus-color)]",
47148
+ (drag == null ? void 0 : drag.mode) === "pan" ? "cursor-grabbing" : "cursor-grab"
47149
+ ), style: brushStyle, children: [jsxRuntimeExports.jsx("div", { "data-minimap-handle": "left", className: "absolute inset-y-0 -left-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: jsxRuntimeExports.jsx("span", { className: cn$4("h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100", drag && "opacity-100") }) }), jsxRuntimeExports.jsx("div", { "data-minimap-handle": "right", className: "absolute inset-y-0 -right-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: jsxRuntimeExports.jsx("span", { className: cn$4("h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100", drag && "opacity-100") }) })] })] });
47150
+ });
46833
47151
  const DEFAULT_PAGE_SIZE = 10;
46834
47152
  function cn(...inputs) {
46835
47153
  return twMerge(clsx(inputs));
@@ -49194,6 +49512,9 @@ async function fetchEventsByCorrelationId(worldEnv, correlationId, params) {
49194
49512
  async function fetchHooks(worldEnv, params) {
49195
49513
  return rpc("fetchHooks", { worldEnv, params });
49196
49514
  }
49515
+ async function fetchHookToken(worldEnv, runId, hookId) {
49516
+ return rpc("fetchHookToken", { worldEnv, runId, hookId });
49517
+ }
49197
49518
  async function fetchHook(worldEnv, hookId, resolveData = "all") {
49198
49519
  return rpc("fetchHook", { worldEnv, hookId, resolveData });
49199
49520
  }
@@ -49258,7 +49579,7 @@ export {
49258
49579
  Button$1 as Z,
49259
49580
  __vitePreload as _,
49260
49581
  TooltipTrigger as a,
49261
- offset as a$,
49582
+ LIVE_UPDATE_INTERVAL_MS as a$,
49262
49583
  Lock as a0,
49263
49584
  CollapsibleRoot as a1,
49264
49585
  CollapsibleTrigger as a2,
@@ -49269,33 +49590,33 @@ export {
49269
49590
  Yr as a7,
49270
49591
  isEncryptedMarker$1 as a8,
49271
49592
  TimestampTooltip as a9,
49272
- searchSpans as aA,
49273
- computeRootBounds as aB,
49274
- computeTimeMarkers as aC,
49275
- getHighResInMs as aD,
49276
- scrollRowIntoView as aE,
49277
- TIMELINE_PADDING_PX as aF,
49278
- Timeline as aG,
49279
- TimelineHeader as aH,
49280
- SidebarDataProvider as aI,
49281
- fetchHook as aJ,
49282
- hydrateResourceIOAsync as aK,
49283
- fetchStep as aL,
49284
- hydrateResourceIO as aM,
49285
- fetchStreams as aN,
49286
- Slot as aO,
49287
- Slottable as aP,
49288
- buttonVariants as aQ,
49289
- fetchEvent as aR,
49290
- fetchEventsByCorrelationId as aS,
49291
- isEncryptedData as aT,
49292
- hydrateData as aU,
49293
- getWebRevivers as aV,
49294
- LIVE_UPDATE_INTERVAL_MS as aW,
49295
- getEncryptionKeyForRun as aX,
49296
- StreamViewer as aY,
49297
- composeRefs as aZ,
49298
- useFloating as a_,
49593
+ useReducedMotion as aA,
49594
+ searchSpans as aB,
49595
+ computeRootBounds as aC,
49596
+ computeTimeMarkers as aD,
49597
+ clampViewportToRoot as aE,
49598
+ getHighResInMs as aF,
49599
+ scrollRowIntoView as aG,
49600
+ TIMELINE_PADDING_PX as aH,
49601
+ Minimap as aI,
49602
+ Timeline as aJ,
49603
+ TimelineHeader as aK,
49604
+ wheelZoomScaleFactor as aL,
49605
+ wheelDeltaToPixels as aM,
49606
+ SidebarDataProvider as aN,
49607
+ fetchHook as aO,
49608
+ hydrateResourceIOAsync as aP,
49609
+ fetchStep as aQ,
49610
+ hydrateResourceIO as aR,
49611
+ fetchStreams as aS,
49612
+ Slot as aT,
49613
+ Slottable as aU,
49614
+ buttonVariants as aV,
49615
+ fetchEvent as aW,
49616
+ fetchEventsByCorrelationId as aX,
49617
+ isEncryptedData as aY,
49618
+ hydrateData as aZ,
49619
+ getWebRevivers as a_,
49299
49620
  formatDuration as aa,
49300
49621
  _r as ab,
49301
49622
  RunClickContext as ac,
@@ -49318,23 +49639,29 @@ export {
49318
49639
  isSpanDimmedBySearch as at,
49319
49640
  ROW_HEIGHT_PX as au,
49320
49641
  getSpanDurationMs as av,
49321
- formatDurationPrecise as aw,
49322
- TooltipProvider as ax,
49323
- ActiveSpanProvider as ay,
49324
- useReducedMotion as az,
49642
+ isSpanErrored as aw,
49643
+ formatDurationPrecise as ax,
49644
+ TooltipProvider as ay,
49645
+ ActiveSpanProvider as az,
49325
49646
  TooltipContent as b,
49326
- shift as b0,
49327
- limitShift as b1,
49328
- flip as b2,
49329
- size as b3,
49330
- arrow as b4,
49331
- hide as b5,
49332
- autoUpdate as b6,
49333
- cancelRun as b7,
49334
- reenqueueRun as b8,
49335
- wakeUpRun as b9,
49336
- resumeHook as ba,
49337
- recreateRun as bb,
49647
+ getEncryptionKeyForRun as b0,
49648
+ StreamViewer as b1,
49649
+ composeRefs as b2,
49650
+ useFloating as b3,
49651
+ offset as b4,
49652
+ shift as b5,
49653
+ limitShift as b6,
49654
+ flip as b7,
49655
+ size as b8,
49656
+ arrow as b9,
49657
+ hide as ba,
49658
+ autoUpdate as bb,
49659
+ cancelRun as bc,
49660
+ reenqueueRun as bd,
49661
+ wakeUpRun as be,
49662
+ resumeHook as bf,
49663
+ fetchHookToken as bg,
49664
+ recreateRun as bh,
49338
49665
  createLucideIcon as c,
49339
49666
  runHealthCheck as d,
49340
49667
  cn as e,