@workflow/web 5.0.0-beta.46 → 5.0.0-beta.48

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/{arrow-up-right-UOc2WcaC.js → arrow-up-right-CSovqivK.js} +1 -1
  2. package/build/client/assets/{highlighted-body-B3W2YXNL-D78gcP7S.js → highlighted-body-B3W2YXNL-BO5_Ufo-.js} +1 -1
  3. package/build/client/assets/{home-DYB1uz9w.js → home-BbyW_T74.js} +3 -3
  4. package/build/client/assets/{loader-circle-oscnpy3L.js → loader-circle-BX6ycuOI.js} +1 -1
  5. package/build/client/assets/{manifest-a701502a.js → manifest-34c486ef.js} +1 -1
  6. package/build/client/assets/{mermaid-3ZIDBTTL-BKGEyEYb.js → mermaid-3ZIDBTTL-BKwl_LgA.js} +282 -124
  7. package/build/client/assets/{root-Zvnb602n.js → root-qx_45_fH.js} +3 -3
  8. package/build/client/assets/{run-detail-CedyZW9h.js → run-detail-BoGFG1Fe.js} +59 -38
  9. package/build/client/assets/{workflow-graph-viewer-Du0ztkb8.js → workflow-graph-viewer-C-1D0sAn.js} +1 -1
  10. package/build/client/assets/{zstd-browser-decoder-DafWVuEG.js → zstd-browser-decoder-By3hr1F0.js} +1 -1
  11. package/build/server/assets/{app-BpmEMaiu.js → app-CeZRs20L.js} +1276 -599
  12. package/build/server/assets/{highlighted-body-B3W2YXNL-C6ES2Pzm.js → highlighted-body-B3W2YXNL-jO_hupW2.js} +1 -1
  13. package/build/server/assets/index-DshIaniU.js +169 -0
  14. package/build/server/assets/{index-QOlZC9D-.js → index-dJuvq1GP.js} +1 -1
  15. package/build/server/assets/{mermaid-3ZIDBTTL-X6IEJ8gj.js → mermaid-3ZIDBTTL-2Pe4e_TP.js} +1 -1
  16. package/build/server/assets/{token-CrxXUTBD.js → token-DAVWictz.js} +1 -1
  17. package/build/server/assets/{token-util-DuToe55u.js → token-util-BMRcW3Qd.js} +1 -1
  18. package/build/server/assets/{websocket-server-CTnzV_B7.js → websocket-server-DXnHomzQ.js} +1 -1
  19. package/build/server/assets/{wrapper-Bjff6YRz.js → wrapper-Bw3PP1up.js} +3 -3
  20. package/build/server/assets/{ws-transport-ByYax88V.js → ws-transport-Dv7yY5un.js} +5 -5
  21. package/build/server/assets/{zstd-browser-decoder-Bfk1d5vU.js → zstd-browser-decoder-DJTnP4ZA.js} +1 -1
  22. package/build/server/index.js +3 -3
  23. package/package.json +10 -10
  24. package/build/server/assets/index-BtQfiVUN.js +0 -163
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, o as reactDomExports, D as ReactDOM, d as useNavigate, e as useSearchParams, c as Link, w as withComponentProps, G as useParams } from "./index-PFjW8YjQ.js";
2
- import { C as CircleAlert, O as parseStepName, B as parseWorkflowName, Q as ErrorCard, U as format, Z as Zap, S as Send, R as ResolveHookModal, q as ChevronUp, X, N as ErrorBoundary, V as Circle, u as unwrapOrThrow, W as WorkflowWebAPIError, I as unwrapServerActionResult, Y as useEscapeKeydown, t as composeEventHandlers, _ as useCallbackRef, $ as useLayoutEffect2, s as useControllableState, a0 as useId, a1 as createContext2, v as Presence, x as createContextScope, n as hideOthers, o as ReactRemoveScroll, a2 as useFocusGuards, a3 as LAYOUT, a4 as wakeUpRun, l as resumeHook, A as Alert, c as AlertTitle, g as getErrorTitle, d as AlertDescription, e as getErrorMessage, a as Skeleton$1, a5 as RunActionsButtons, F as StatusBadge, h as CopyableText, b as RelativeTime, T as Tabs, K as TabsList, L as TabsTrigger, M as TabsContent, a6 as cancelRun, a7 as recreateRun } from "./workflow-graph-viewer-Du0ztkb8.js";
3
- import { c as createLucideIcon, Y as entityEventClass, Z as isSealedNoopEvent$1, $ as cn, a0 as CopyableDataBlock, a1 as CollapsibleRoot, a2 as CollapsibleTrigger, a3 as CollapsibleContent, a4 as CopyButton, O as cva, a5 as RESERVED_ATTRIBUTE_KEY_PREFIX, a6 as Spinner, a7 as TooltipProvider, a8 as Tooltip, a9 as TooltipTrigger, aa as TooltipContent, ab as ContextCardProvider, h as useToast, ac as Skeleton, ad as DecryptClickContext, ae as Yr, af as isEncryptedMarker, m as ChevronRight, ag as TimestampTooltip, ah as formatDuration, C as Check, l as Copy, ai as DataInspector, aj as _r, ak as isHookLifecycleEventType, al as isTerminalStepEventType, am as isWaitEventType, an as isStepEventType, ao as RunClickContext, ap as StreamClickContext, aq as Collapsible, ar as isExpiredMarker, as as isDoStreamStep, at as extractConversation, au as EncryptedDataBlock, av as getEventDataRefFields, aw as hasEncryptedFields, ax as useSidebarDataOptional, ay as isTerminalWorkflowRunStatus, az as clsx, aA as useActiveSpan, aB as useSidebarData, aC as IconButton, J as ChevronDown, aD as useRowWindow, aE as isSpanDimmedBySearch, aF as ROW_HEIGHT_PX, aG as getSpanDurationMs, aH as isSpanErrored, aI as formatDurationPrecise, aJ as ActiveSpanProvider, aK as useReducedMotion, aL as searchSpans, aM as computeRootBounds, aN as computeTimeMarkers, aO as clampViewportToRoot, aP as getHighResInMs, aQ as scrollRowIntoView, aR as TIMELINE_PADDING_PX, aS as Minimap, aT as Timeline, aU as TimelineHeader, aV as wheelZoomScaleFactor, aW as wheelDeltaToPixels, aX as SidebarDataProvider, aY as fetchHook, n as fetchEvents, aZ as hydrateResourceIOAsync, N as fetchRun, a_ as fetchStep, a$ as hydrateResourceIO, b0 as fetchStreams, b1 as apiBase, b2 as Slot, L as useComposedRefs, b3 as Slottable, e as cn$1, b4 as buttonVariants, b5 as fetchEvent, b6 as fetchEventsByCorrelationId, b7 as isEncryptedData, b8 as hydrateData, b9 as decrypt, ba as deriveRunPayloadKeys, bb as getWebRevivers, T as Tooltip$1, a as TooltipTrigger$1, b as TooltipContent$1, bc as LIVE_UPDATE_INTERVAL_MS$1, u as useServerConfig, bd as getEncryptionKeyForRun, t as toast, be as StreamViewerSkeleton, bf as Lock, bg as StreamViewer } from "./mermaid-3ZIDBTTL-BKGEyEYb.js";
4
- import { A as ArrowUpRight } from "./arrow-up-right-UOc2WcaC.js";
2
+ import { C as CircleAlert, O as parseStepName, B as parseWorkflowName, Q as ErrorCard, U as format, Z as Zap, S as Send, R as ResolveHookModal, q as ChevronUp, X, N as ErrorBoundary, V as Circle, u as unwrapOrThrow, W as WorkflowWebAPIError, I as unwrapServerActionResult, Y as useEscapeKeydown, t as composeEventHandlers, _ as useCallbackRef, $ as useLayoutEffect2, s as useControllableState, a0 as useId, a1 as createContext2, v as Presence, x as createContextScope, n as hideOthers, o as ReactRemoveScroll, a2 as useFocusGuards, a3 as LAYOUT, a4 as wakeUpRun, l as resumeHook, A as Alert, c as AlertTitle, g as getErrorTitle, d as AlertDescription, e as getErrorMessage, a as Skeleton$1, a5 as RunActionsButtons, F as StatusBadge, h as CopyableText, b as RelativeTime, T as Tabs, K as TabsList, L as TabsTrigger, M as TabsContent, a6 as cancelRun, a7 as recreateRun } from "./workflow-graph-viewer-C-1D0sAn.js";
3
+ import { c as createLucideIcon, Y as classifyEntityEvent, Z as TERMINAL_EVENT_CLASSES, $ as isSealedNoopEvent$1, a0 as cn, a1 as CopyableDataBlock, a2 as CollapsibleRoot, a3 as CollapsibleTrigger, a4 as CollapsibleContent, a5 as CopyButton, O as cva, a6 as RESERVED_ATTRIBUTE_KEY_PREFIX, a7 as Spinner, a8 as TooltipProvider, a9 as Tooltip, aa as TooltipTrigger, ab as TooltipContent, ac as ContextCardProvider, h as useToast, ad as Skeleton, ae as DecryptClickContext, af as Yr, ag as isEncryptedMarker, m as ChevronRight, ah as TimestampTooltip, ai as formatDuration, C as Check, l as Copy, aj as DataInspector, ak as _r, al as isHookLifecycleEventType, am as isTerminalStepEventType, an as isWaitEventType, ao as isStepEventType, ap as RunClickContext, aq as StreamClickContext, ar as Collapsible, as as isExpiredMarker, at as isDoStreamStep, au as extractConversation, av as EncryptedDataBlock, aw as getEventDataRefFields, ax as hasEncryptedFields, ay as useSidebarDataOptional, az as isTerminalWorkflowRunStatus, aA as clsx, aB as useActiveSpan, aC as useSidebarData, aD as IconButton, J as ChevronDown, aE as useRowWindow, aF as isSpanDimmedBySearch, aG as ROW_HEIGHT_PX, aH as getSpanDurationMs, aI as isSpanErrored, aJ as formatDurationPrecise, aK as ActiveSpanProvider, aL as useReducedMotion, aM as searchSpans, aN as computeRootBounds, aO as computeTimeMarkers, aP as clampViewportToRoot, aQ as getHighResInMs, aR as scrollRowIntoView, aS as TIMELINE_PADDING_PX, aT as Minimap, aU as Timeline, aV as TimelineHeader, aW as wheelZoomScaleFactor, aX as wheelDeltaToPixels, aY as SidebarDataProvider, aZ as fetchHook, n as fetchEvents, a_ as hydrateResourceIOAsync, N as fetchRun, a$ as fetchStep, b0 as hydrateResourceIO, b1 as fetchStreams, b2 as apiBase, b3 as Slot, L as useComposedRefs, b4 as Slottable, e as cn$1, b5 as buttonVariants, b6 as fetchEvent, b7 as fetchEventsByCorrelationId, b8 as isEncryptedData, b9 as hydrateData, ba as decrypt, bb as deriveRunPayloadKeys, bc as getWebRevivers, T as Tooltip$1, a as TooltipTrigger$1, b as TooltipContent$1, bd as LIVE_UPDATE_INTERVAL_MS$1, u as useServerConfig, be as getEncryptionKeyForRun, t as toast, bf as StreamViewerSkeleton, bg as Lock, bh as StreamViewer } from "./mermaid-3ZIDBTTL-BKwl_LgA.js";
4
+ import { A as ArrowUpRight } from "./arrow-up-right-CSovqivK.js";
5
5
  /**
6
6
  * @license lucide-react v0.575.0 - ISC
7
7
  *
@@ -99,15 +99,9 @@ function stripEventIdPrefix(eventId) {
99
99
  function isSlotEventId(eventId) {
100
100
  return isSlotBody(stripEventIdPrefix(eventId));
101
101
  }
102
- const TERMINAL_EVENT_CLASSES = /* @__PURE__ */ new Set([
103
- "step_terminal",
104
- "wait_completed",
105
- "hook_disposed"
106
- ]);
107
102
  const SINGLETON_EVENT_CLASSES = /* @__PURE__ */ new Set([
108
103
  "run_started"
109
104
  ]);
110
- const RUN_ENTITY_KEY = "";
111
105
  const DUPLICATE_EVENT_MESSAGE = "Written by a concurrent replay after an event of the same kind was already recorded and acted on. The run follows the earlier one.";
112
106
  function compareEventId(a, b) {
113
107
  if (a.eventId.length !== b.eventId.length) {
@@ -137,10 +131,10 @@ function foldDuplicates(ordered) {
137
131
  const seenClasses = /* @__PURE__ */ new Set();
138
132
  const closedEntities = /* @__PURE__ */ new Set();
139
133
  for (const event of ordered) {
140
- const eventClass = entityEventClass(event.eventType);
141
- if (eventClass === void 0)
134
+ const classification = classifyEntityEvent(event);
135
+ if (classification === void 0)
142
136
  continue;
143
- const entity = event.correlationId ?? RUN_ENTITY_KEY;
137
+ const { eventClass, entity } = classification;
144
138
  const classKey = `${eventClass}:${entity}`;
145
139
  const repeatsClass = seenClasses.has(classKey);
146
140
  const entityWasClosed = closedEntities.has(entity);
@@ -1150,7 +1144,6 @@ function EventRow$1({ event, index, isFirst, isLast, isExpanded, onToggleExpand,
1150
1144
  }, []);
1151
1145
  reactExports.useEffect(() => {
1152
1146
  if (encryptionKey && hasAttemptedLoad && onLoadEventData) {
1153
- setLoadedEventData(null);
1154
1147
  setHasAttemptedLoad(false);
1155
1148
  onLoadEventData(event).then((data) => {
1156
1149
  if (data !== null && data !== void 0) {
@@ -1765,7 +1758,7 @@ const stepEventsToStepEntity = (events) => {
1765
1758
  specVersion: anchorEvent.specVersion
1766
1759
  };
1767
1760
  };
1768
- function stepToSpan(stepEvents, maxEndTime) {
1761
+ function stepToSpan(stepEvents, maxEndTime, getStepAttributes) {
1769
1762
  const step = stepEventsToStepEntity(stepEvents);
1770
1763
  if (!step) {
1771
1764
  return null;
@@ -1773,7 +1766,11 @@ function stepToSpan(stepEvents, maxEndTime) {
1773
1766
  const parsedName = parseStepName(String(step.stepName)) ?? parseWorkflowName(String(step.stepName));
1774
1767
  const attributes = {
1775
1768
  resource: "step",
1776
- data: step
1769
+ data: {
1770
+ ...getStepAttributes == null ? void 0 : getStepAttributes(stepEvents),
1771
+ // Canonical event-derived fields cannot be overridden by extensions.
1772
+ ...step
1773
+ }
1777
1774
  };
1778
1775
  const resource = "step";
1779
1776
  const events = convertEventsToSpanEvents(stepEvents, false, {
@@ -1951,10 +1948,10 @@ function computeLatestKnownTime(events, run) {
1951
1948
  }
1952
1949
  return new Date(latest);
1953
1950
  }
1954
- function buildSpans(run, groupedEvents, now, latestKnownTime) {
1951
+ function buildSpans(run, groupedEvents, now, latestKnownTime, getStepAttributes) {
1955
1952
  const childMaxEnd = latestKnownTime;
1956
1953
  const runMaxEnd = run.completedAt ?? now;
1957
- const stepSpans = Array.from(groupedEvents.eventsByStepId.values()).map((events) => stepToSpan(events, childMaxEnd)).filter((span) => span !== null);
1954
+ const stepSpans = Array.from(groupedEvents.eventsByStepId.values()).map((events) => stepToSpan(events, childMaxEnd, getStepAttributes)).filter((span) => span !== null);
1958
1955
  const hookSpans = Array.from(groupedEvents.hookEvents.values()).map((events) => hookToSpan(events, childMaxEnd)).filter((span) => span !== null);
1959
1956
  const waitSpans = Array.from(groupedEvents.timerEvents.values()).map((events) => waitToSpan(events, childMaxEnd, runMaxEnd)).filter((span) => span !== null);
1960
1957
  return {
@@ -1979,14 +1976,14 @@ function cascadeSpans(runSpan, spans) {
1979
1976
  };
1980
1977
  });
1981
1978
  }
1982
- function buildTrace(run, events, now, { isCompleteHistory = false } = {}) {
1979
+ function buildTrace(run, events, now, { isCompleteHistory = false, getStepAttributes } = {}) {
1983
1980
  const duplicateEventIds = findDuplicateEventIds(events, {
1984
1981
  isCompleteHistory
1985
1982
  });
1986
1983
  const actedOnEvents = events.filter((event) => !duplicateEventIds.has(event.eventId) && !isSealedNoopEvent(event));
1987
1984
  const groupedEvents = groupEventsByCorrelation(actedOnEvents);
1988
1985
  const latestKnownTime = computeLatestKnownTime(actedOnEvents, run);
1989
- const { runSpan, spans } = buildSpans(run, groupedEvents, now, latestKnownTime);
1986
+ const { runSpan, spans } = buildSpans(run, groupedEvents, now, latestKnownTime, getStepAttributes);
1990
1987
  const sortedCascadingSpans = cascadeSpans(runSpan, spans);
1991
1988
  const traceStartMs = otelTimeToMs(runSpan.startTime);
1992
1989
  const knownDurationMs = latestKnownTime.getTime() - traceStartMs;
@@ -3422,6 +3419,42 @@ function TraceShortcutHelper({ hasMultipleSpans, reducedMotion }) {
3422
3419
  };
3423
3420
  return jsxRuntimeExports.jsxs("div", { className: "group pointer-events-auto hidden h-8 w-fit items-center gap-1 text-label-12 leading-none text-gray-900 @min-[480px]:flex", children: [jsxRuntimeExports.jsx("span", { "aria-live": "polite", "aria-atomic": "true", className: "inline-flex items-center whitespace-nowrap", children: reducedMotion ? jsxRuntimeExports.jsx(AltHint, {}) : jsxRuntimeExports.jsx("span", { className: `inline-flex items-center ${styles.hint}`, children: index === 0 ? jsxRuntimeExports.jsx(AltHint, {}) : jsxRuntimeExports.jsx(NavHint, {}) }, index) }), jsxRuntimeExports.jsx("button", { type: "button", className: "inline-flex h-5 w-5 items-center justify-center rounded text-muted-foreground opacity-0 transition-opacity hover:bg-accent hover:text-foreground group-hover:opacity-100 focus-visible:opacity-100 motion-reduce:transition-none", onClick: dismiss, "aria-label": "Dismiss trace shortcuts helper", children: jsxRuntimeExports.jsx(X, { className: "h-3 w-3" }) })] });
3424
3421
  }
3422
+ function isAltModifierKey(key) {
3423
+ return key === "Alt" || key === "AltGraph";
3424
+ }
3425
+ function isTypingTarget(target) {
3426
+ return target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLElement && target.isContentEditable;
3427
+ }
3428
+ function useAltHeld() {
3429
+ const [altHeld, setAltHeld] = reactExports.useState(false);
3430
+ reactExports.useEffect(() => {
3431
+ const onKeyDown = (e) => {
3432
+ if (!isAltModifierKey(e.key))
3433
+ return;
3434
+ if (!isTypingTarget(e.target)) {
3435
+ e.preventDefault();
3436
+ }
3437
+ setAltHeld(true);
3438
+ };
3439
+ const onKeyUp = (e) => {
3440
+ if (isAltModifierKey(e.key))
3441
+ setAltHeld(false);
3442
+ };
3443
+ const onBlur = () => setAltHeld(false);
3444
+ const onPointerMove = (e) => setAltHeld(e.altKey);
3445
+ window.addEventListener("keydown", onKeyDown, true);
3446
+ window.addEventListener("keyup", onKeyUp, true);
3447
+ window.addEventListener("blur", onBlur);
3448
+ window.addEventListener("pointermove", onPointerMove, true);
3449
+ return () => {
3450
+ window.removeEventListener("keydown", onKeyDown, true);
3451
+ window.removeEventListener("keyup", onKeyUp, true);
3452
+ window.removeEventListener("blur", onBlur);
3453
+ window.removeEventListener("pointermove", onPointerMove, true);
3454
+ };
3455
+ }, []);
3456
+ return { altHeld };
3457
+ }
3425
3458
  const MIN_VIEWPORT_MS = 1e-3;
3426
3459
  const ZOOM_DEBOUNCE_MS = 150;
3427
3460
  function useAnimatedViewport(initial) {
@@ -3621,28 +3654,15 @@ function TraceViewerContent({ trace, onLoadMore, hasMore, isLoadingMore }) {
3621
3654
  focusViewportOnSpan(spanId);
3622
3655
  }, ZOOM_DEBOUNCE_MS);
3623
3656
  }, [setActiveSpan, scrollSpanIntoView, cancelPendingZoom, focusViewportOnSpan]);
3624
- const [altHeld, setAltHeld] = reactExports.useState(false);
3657
+ const { altHeld } = useAltHeld();
3625
3658
  reactExports.useEffect(() => {
3626
3659
  const onKeyDown = (e) => {
3627
3660
  if (e.key === "Escape") {
3628
3661
  handleClearActiveSpan();
3629
- } else if (e.key === "Alt") {
3630
- setAltHeld(true);
3631
3662
  }
3632
3663
  };
3633
- const onKeyUp = (e) => {
3634
- if (e.key === "Alt")
3635
- setAltHeld(false);
3636
- };
3637
- const onBlur = () => setAltHeld(false);
3638
3664
  window.addEventListener("keydown", onKeyDown);
3639
- window.addEventListener("keyup", onKeyUp);
3640
- window.addEventListener("blur", onBlur);
3641
- return () => {
3642
- window.removeEventListener("keydown", onKeyDown);
3643
- window.removeEventListener("keyup", onKeyUp);
3644
- window.removeEventListener("blur", onBlur);
3645
- };
3665
+ return () => window.removeEventListener("keydown", onKeyDown);
3646
3666
  }, [handleClearActiveSpan]);
3647
3667
  const timelineRef = reactExports.useRef(null);
3648
3668
  const [hover, setHover] = reactExports.useState(null);
@@ -3718,15 +3738,16 @@ function TraceViewerContent({ trace, onLoadMore, hasMore, isLoadingMore }) {
3718
3738
  }
3719
3739
  }, placeholder: "Search spans...", "aria-label": "Search spans", className: "flex-1 min-w-0 bg-transparent text-label-14 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-label-16 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, { variant: "outline", size: "search", children: "Esc" }) })] }), endHeader: jsxRuntimeExports.jsx(TimelineHeader, { markers: timeMarkers, hoverInfo }), children: [jsxRuntimeExports.jsxs("div", { className: "block overflow-visible", children: [jsxRuntimeExports.jsx(EventList, { spans: trace.spans, activeSpanId, searchResult, onSelectSpan: handleSelectSpan }), jsxRuntimeExports.jsx("div", { ref: loadMoreSentinelRef, className: "flex justify-center", children: isLoadingMore ? jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center gap-2 py-3 text-label-14 text-gray-800", children: [jsxRuntimeExports.jsx(Spinner, { size: 14 }), jsxRuntimeExports.jsx("span", { children: "Loading spans…" })] }) : null })] }), jsxRuntimeExports.jsx("div", { ref: timelineRef, id: "trace-timeline", className: "@container block min-h-0 overflow-visible relative", onDoubleClick: resetZoom, onMouseMove: handleTimelineMouseMove, onMouseLeave: handleTimelineMouseLeave, children: jsxRuntimeExports.jsx(Timeline, { spans: trace.spans, viewStart: viewport.start, viewEnd: viewport.end, markers: timeMarkers, selectedId: activeSpanId, searchResult, onSelect: handleSelectSpan, onRevealTime: handleRevealTime, hover, altHeld }) }), jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(TraceShortcutHelper, { hasMultipleSpans: trace.spans.length > 1, reducedMotion }), jsxRuntimeExports.jsxs("div", { className: "pointer-events-auto 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, disabled: isAtMinZoom, "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, disabled: isAtMaxZoom, "aria-label": "Zoom in", children: jsxRuntimeExports.jsx(ZoomIn, { className: "w-4 h-4" }) })] })] })] })] }), jsxRuntimeExports.jsx(TraceDetailPanel, { containerRef: paneRootRef, onNavigateToSpan: navigateToSpan, onClose: handleClearActiveSpan })] });
3720
3740
  }
3721
- const TraceViewer = ({ run, events, sidebarData, onLoadMore, hasMore, isLoadingMore, loading = false }) => {
3741
+ const TraceViewer = ({ run, events, sidebarData, onLoadMore, hasMore, isLoadingMore, loading = false, getStepAttributes }) => {
3722
3742
  const trace = reactExports.useMemo(() => {
3723
3743
  if (!(run == null ? void 0 : run.runId)) {
3724
3744
  return void 0;
3725
3745
  }
3726
3746
  return buildTrace(run, events, /* @__PURE__ */ new Date(), {
3727
- isCompleteHistory: !hasMore
3747
+ isCompleteHistory: !hasMore,
3748
+ getStepAttributes
3728
3749
  });
3729
- }, [run, events, hasMore]);
3750
+ }, [run, events, hasMore, getStepAttributes]);
3730
3751
  const sidebarValue = reactExports.useMemo(() => ({ ...sidebarData, duplicateEventIds: trace == null ? void 0 : trace.duplicateEventIds }), [sidebarData, trace]);
3731
3752
  if (!trace || loading && events.length === 0) {
3732
3753
  return jsxRuntimeExports.jsx(TraceViewerSkeleton, {});
@@ -5213,7 +5234,7 @@ function BreadcrumbSeparator({
5213
5234
  }
5214
5235
  const INITIAL_PAGE_SIZE = 100;
5215
5236
  const LOAD_MORE_PAGE_SIZE = 100;
5216
- const MAX_CORRELATION_SEARCH_PAGES = 30;
5237
+ const MAX_CORRELATION_SEARCH_PAGES = 5;
5217
5238
  function useEventsListData(env, runId, options = {}) {
5218
5239
  const { sortOrder = "asc", encryptionKey, enabled = true } = options;
5219
5240
  const [events, setEvents] = reactExports.useState([]);
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { c as createLucideIcon, J as ChevronDown, $ as cn, e as cn$1, O as cva, bh as composeRefs, L as useComposedRefs, bi as useFloating, bj as offset, bk as shift, bl as limitShift, bm as flip, bn as size, bo as arrow, bp as hide, bq as autoUpdate, m as ChevronRight, C as Check, br as VERCEL_403_ERROR_MESSAGE, bs as bulkCancelRuns$1, bt as reenqueueRun$1, bu as wakeUpRun$1, bv as resumeHook$1, bw as fetchHookToken$1, bx as cancelRun$1, by as recreateRun$1, T as Tooltip, a as TooltipTrigger, l as Copy, b as TooltipContent, z as createContextScope$1, p as useComposedRefs$1, E as createSlot, ah as formatDuration, B as Button, t as toast, w as useId$1, P as Primitive$1, q as composeEventHandlers$1, G as useControllableState$1, o as useCallbackRef$2, U as Presence$1 } from "./mermaid-3ZIDBTTL-BKGEyEYb.js";
4
+ import { c as createLucideIcon, J as ChevronDown, a0 as cn, e as cn$1, O as cva, bi as composeRefs, L as useComposedRefs, bj as useFloating, bk as offset, bl as shift, bm as limitShift, bn as flip, bo as size, bp as arrow, bq as hide, br as autoUpdate, m as ChevronRight, C as Check, bs as VERCEL_403_ERROR_MESSAGE, bt as bulkCancelRuns$1, bu as reenqueueRun$1, bv as wakeUpRun$1, bw as resumeHook$1, bx as fetchHookToken$1, by as cancelRun$1, bz as recreateRun$1, T as Tooltip, a as TooltipTrigger, l as Copy, b as TooltipContent, z as createContextScope$1, p as useComposedRefs$1, E as createSlot, ai as formatDuration, B as Button, t as toast, w as useId$1, P as Primitive$1, q as composeEventHandlers$1, G as useControllableState$1, o as useCallbackRef$2, U as Presence$1 } from "./mermaid-3ZIDBTTL-BKwl_LgA.js";
5
5
  import { r as reactExports, j as jsxRuntimeExports, o as reactDomExports, R as ReactExports, H as React, D as ReactDOM, f as requireReact, I as getDefaultExportFromCjs } from "./index-PFjW8YjQ.js";
6
6
  function parseName(tag, name) {
7
7
  if (typeof name !== "string") {
@@ -1,4 +1,4 @@
1
- import { r as registerZstdDecoder, _ as __vitePreload } from "./mermaid-3ZIDBTTL-BKGEyEYb.js";
1
+ import { r as registerZstdDecoder, _ as __vitePreload } from "./mermaid-3ZIDBTTL-BKwl_LgA.js";
2
2
  import "./index-PFjW8YjQ.js";
3
3
  let registered = false;
4
4
  let modulePromise;