@workflow/web 5.0.0-beta.37 → 5.0.0-beta.39

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 (33) hide show
  1. package/README.md +1 -0
  2. package/build/client/assets/app-BqwHo5GR.css +1 -0
  3. package/build/client/assets/{arrow-up-right-DDNPFYmg.js → arrow-up-right-Ccx_FPfU.js} +1 -1
  4. package/build/client/assets/{highlighted-body-B3W2YXNL-CRgNr0YA.js → highlighted-body-B3W2YXNL-DMawUm9n.js} +1 -1
  5. package/build/client/assets/{home-BqvW8ODs.js → home-B6O_uPSC.js} +3 -2
  6. package/build/client/assets/loader-circle-BrO0dxVn.js +12 -0
  7. package/build/client/assets/manifest-7e8691f4.js +1 -0
  8. package/build/client/assets/{mermaid-3ZIDBTTL-CMP9Tato.js → mermaid-3ZIDBTTL-D20ZkB54.js} +665 -1682
  9. package/build/client/assets/mermaid-3ZIDBTTL-D8CjRQta.css +1 -0
  10. package/build/client/assets/root-CxZylOIf.css +1 -0
  11. package/build/client/assets/{root-2ub-CsWS.js → root-dudvdmvf.js} +6 -2
  12. package/build/client/assets/{run-detail-B1PK-m7y.js → run-detail-DtCCxxv2.js} +277 -359
  13. package/build/client/assets/{workflow-graph-viewer-DOLwtzSv.js → workflow-graph-viewer-B01nH75E.js} +65 -86
  14. package/build/client/assets/{zstd-browser-decoder-BAY5XtBl.js → zstd-browser-decoder-Dw3HhTgO.js} +1 -1
  15. package/build/server/assets/{server-build-C11Xqmwk.js → app-Bd12Opaf.js} +96186 -87164
  16. package/build/server/assets/{highlighted-body-B3W2YXNL-DE3KXslx.js → highlighted-body-B3W2YXNL-CFlRme7u.js} +3 -4
  17. package/build/server/assets/{index-M4Ai7vsa.js → index-B6SJpqpo.js} +65 -63
  18. package/build/server/assets/{mermaid-3ZIDBTTL-DjL45D7x.js → mermaid-3ZIDBTTL-CQsU8DGa.js} +4 -5
  19. package/build/server/assets/{token-Ulh8Tdgw.js → token-XJr1pjmC.js} +1 -2
  20. package/build/server/assets/{token-util-CiVcDWD3.js → token-util-BJaMxWWP.js} +1 -2
  21. package/build/server/assets/{zstd-browser-decoder-tQARkzJ5.js → zstd-browser-decoder-DL7Vc3pV.js} +4 -5
  22. package/build/server/index.js +41 -2
  23. package/handler.d.ts +22 -0
  24. package/handler.js +186 -0
  25. package/package.json +20 -8
  26. package/registry.d.ts +29 -0
  27. package/registry.js +89 -0
  28. package/build/client/assets/manifest-7f03c136.js +0 -1
  29. package/build/client/assets/mermaid-3ZIDBTTL-DDxQhcP4.css +0 -1
  30. package/build/client/assets/root-15oK726f.css +0 -1
  31. package/build/client/assets/server-build-DblSGQ6A.css +0 -1
  32. package/build/client/assets/worker-CqHKTA7D.js +0 -115
  33. package/build/server/assets/app-BaJoK9ck.js +0 -9217
@@ -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 Check, a as Copy, d as CircleAlert, U as parseStepName, G as parseWorkflowName, V as ErrorCard, Y as format, Z as Zap, S as Send, R as ResolveHookModal, t as ChevronUp, X, Q as ErrorBoundary, _ as Circle, u as unwrapOrThrow, W as WorkflowWebAPIError, K as unwrapServerActionResult, $ as useEscapeKeydown, w as composeEventHandlers, a0 as useCallbackRef, a1 as useLayoutEffect2, v as useControllableState, a2 as useId, a3 as createContext2, x as Presence, z as createContextScope, p as hideOthers, q as ReactRemoveScroll, a4 as useFocusGuards, a5 as LAYOUT, a6 as wakeUpRun, n as resumeHook, A as Alert, e as AlertTitle, g as getErrorTitle, h as AlertDescription, i as getErrorMessage, b as Skeleton$1, a7 as RunActionsButtons, H as StatusBadge, j as CopyableText, c as RelativeTime, T as Tabs, M as TabsList, N as TabsTrigger, O as TabsContent, B as cancelRun, a8 as recreateRun } from "./workflow-graph-viewer-DOLwtzSv.js";
3
- import { c as createLucideIcon, W as cn, X as DataInspector, Y as DecryptClickContext, Z as Button, $ as Spinner, a0 as Lock, a1 as CollapsibleRoot, a2 as CollapsibleTrigger, a3 as CollapsibleContent, M as cva, a4 as RESERVED_ATTRIBUTE_KEY_PREFIX, a5 as ContextCardProvider, h as useToast, a6 as Skeleton, a7 as Yr, a8 as isEncryptedMarker, C as ChevronRight, a9 as TimestampTooltip, aa as formatDuration, ab as isHookLifecycleEventType, ac as isTerminalStepEventType, ad as isWaitEventType, ae as isStepEventType, af as _r, ag as RunClickContext, ah as StreamClickContext, ai as Collapsible, aj as isExpiredMarker, ak as isDoStreamStep, al as extractConversation, am as getEventDataRefFields, an as hasEncryptedFields, ao as useSidebarDataOptional, ap as isTerminalWorkflowRunStatus, aq as clsx, ar as useActiveSpan, as as useSidebarData, at as Tooltip, au as TooltipTrigger, av as IconButton, aw as TooltipContent, H as ChevronDown, ax as useRowWindow, ay as isSpanDimmedBySearch, az as ROW_HEIGHT_PX, aA as getSpanDurationMs, aB as isSpanErrored, aC as formatDurationPrecise, aD as TooltipProvider, aE as ActiveSpanProvider, aF as useReducedMotion, aG as searchSpans, aH as computeRootBounds, aI as computeTimeMarkers, aJ as clampViewportToRoot, aK as getHighResInMs, aL as scrollRowIntoView, aM as TIMELINE_PADDING_PX, aN as Minimap, aO as Timeline, aP as TimelineHeader, aQ as wheelZoomScaleFactor, aR as wheelDeltaToPixels, aS as SidebarDataProvider, aT as fetchHook, l as fetchEvents, aU as hydrateResourceIOAsync, J as fetchRun, aV as fetchStep, aW as hydrateResourceIO, aX as fetchStreams, aY as Slot, I as useComposedRefs, aZ as Slottable, e as cn$1, a_ as buttonVariants, a$ as fetchEvent, b0 as fetchEventsByCorrelationId, b1 as isEncryptedData, b2 as hydrateData, b3 as decrypt, b4 as deriveRunPayloadKeys, b5 as getWebRevivers, T as Tooltip$1, a as TooltipTrigger$1, b as TooltipContent$1, b6 as LIVE_UPDATE_INTERVAL_MS$1, u as useServerConfig, b7 as getEncryptionKeyForRun, t as toast, L as LoaderCircle, b8 as StreamViewer } from "./mermaid-3ZIDBTTL-CMP9Tato.js";
4
- import { A as ArrowUpRight } from "./arrow-up-right-DDNPFYmg.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, y as cancelRun, a6 as recreateRun } from "./workflow-graph-viewer-B01nH75E.js";
3
+ import { c as createLucideIcon, X as cn, Y as CopyableDataBlock, Z as CollapsibleRoot, $ as CollapsibleTrigger, a0 as CollapsibleContent, a1 as CopyButton, N as cva, a2 as RESERVED_ATTRIBUTE_KEY_PREFIX, a3 as Spinner, a4 as ContextCardProvider, h as useToast, a5 as Skeleton, a6 as DecryptClickContext, a7 as Yr, a8 as isEncryptedMarker, m as ChevronRight, a9 as TimestampTooltip, aa as formatDuration, C as Check, l as Copy, ab as DataInspector, ac as _r, ad as isHookLifecycleEventType, ae as isTerminalStepEventType, af as isWaitEventType, ag as isStepEventType, ah as RunClickContext, ai as StreamClickContext, aj as Collapsible, ak as isExpiredMarker, al as isDoStreamStep, am as extractConversation, an as EncryptedDataBlock, ao as getEventDataRefFields, ap as hasEncryptedFields, aq as useSidebarDataOptional, ar as isTerminalWorkflowRunStatus, as as clsx, at as useActiveSpan, au as useSidebarData, av as Tooltip, aw as TooltipTrigger, ax as IconButton, ay as TooltipContent, J as ChevronDown, az as useRowWindow, aA as isSpanDimmedBySearch, aB as ROW_HEIGHT_PX, aC as getSpanDurationMs, aD as isSpanErrored, aE as formatDurationPrecise, aF as TooltipProvider, aG as ActiveSpanProvider, aH as useReducedMotion, aI as searchSpans, aJ as computeRootBounds, aK as computeTimeMarkers, aL as clampViewportToRoot, aM as getHighResInMs, aN as scrollRowIntoView, aO as TIMELINE_PADDING_PX, aP as Minimap, aQ as Timeline, aR as TimelineHeader, aS as wheelZoomScaleFactor, aT as wheelDeltaToPixels, aU as SidebarDataProvider, aV as fetchHook, n as fetchEvents, aW as hydrateResourceIOAsync, M as fetchRun, aX as fetchStep, aY as hydrateResourceIO, aZ as fetchStreams, a_ as apiBase, a$ as Slot, L as useComposedRefs, b0 as Slottable, e as cn$1, b1 as buttonVariants, b2 as fetchEvent, b3 as fetchEventsByCorrelationId, b4 as isEncryptedData, b5 as hydrateData, b6 as decrypt, b7 as deriveRunPayloadKeys, b8 as getWebRevivers, T as Tooltip$1, a as TooltipTrigger$1, b as TooltipContent$1, b9 as LIVE_UPDATE_INTERVAL_MS$1, u as useServerConfig, ba as getEncryptionKeyForRun, t as toast, bb as StreamViewerSkeleton, bc as Lock, bd as StreamViewer } from "./mermaid-3ZIDBTTL-D20ZkB54.js";
4
+ import { A as ArrowUpRight } from "./arrow-up-right-Ccx_FPfU.js";
5
5
  /**
6
6
  * @license lucide-react v0.575.0 - ISC
7
7
  *
@@ -103,27 +103,6 @@ function looksLikeWorkflowIdSearchInput(query) {
103
103
  }
104
104
  return /\d/.test(trimmed);
105
105
  }
106
- function CopyButton({ copyText, ariaLabel, className }) {
107
- const [copied, setCopied] = reactExports.useState(false);
108
- const timeoutRef = reactExports.useRef(null);
109
- reactExports.useEffect(() => {
110
- return () => {
111
- if (timeoutRef.current) {
112
- clearTimeout(timeoutRef.current);
113
- }
114
- };
115
- }, []);
116
- return jsxRuntimeExports.jsx("button", { type: "button", "aria-label": ariaLabel, className: cn("cursor-pointer text-gray-800 hover:text-gray-1000 bg-transparent border-0 p-1 m-0", className), onClick: (e) => {
117
- e.stopPropagation();
118
- if (timeoutRef.current) {
119
- clearTimeout(timeoutRef.current);
120
- }
121
- void navigator.clipboard.writeText(copyText).then(() => {
122
- setCopied(true);
123
- timeoutRef.current = setTimeout(() => setCopied(false), 1e3);
124
- });
125
- }, children: jsxRuntimeExports.jsxs("div", { className: "relative w-3 h-3", children: [jsxRuntimeExports.jsx("div", { className: cn("absolute inset-0 flex items-center justify-center transition-all duration-150 ease-out", copied ? "scale-100 opacity-100" : "scale-0 opacity-0"), children: jsxRuntimeExports.jsx(Check, { className: "w-3 h-3" }) }), jsxRuntimeExports.jsx("div", { className: cn("absolute inset-0 flex items-center justify-center transition-all duration-150 ease-out", copied ? "scale-0 opacity-0" : "scale-100 opacity-100"), children: jsxRuntimeExports.jsx(Copy, { className: "w-3 h-3" }) })] }) });
126
- }
127
106
  const ELLIPSIS = "…";
128
107
  const MIN_START = 3;
129
108
  const MIN_END = 3;
@@ -404,29 +383,6 @@ function MiddleTruncate({ value, className, onCopy: onCopyProp, ...props }) {
404
383
  }, [onCopyProp, isTruncated, prefixText, suffixText, value]);
405
384
  return jsxRuntimeExports.jsxs("span", { title: isTruncated ? value : void 0, ...props, ref, className: cn("relative inline-grid min-w-0 max-w-full overflow-hidden whitespace-nowrap", className), onCopy: handleCopy, children: [isTruncated && jsxRuntimeExports.jsx("span", { className: "sr-only select-none", children: value }), jsxRuntimeExports.jsx("span", { "aria-hidden": "true", className: "pointer-events-none col-start-1 row-start-1 invisible select-none whitespace-nowrap", children: value }), jsxRuntimeExports.jsx("span", { "aria-hidden": isTruncated || void 0, className: "col-start-1 row-start-1 min-w-0 overflow-hidden", ref: visibleRef, children: isTruncated ? jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("span", { children: prefixText }), jsxRuntimeExports.jsx("span", { children: ELLIPSIS }), jsxRuntimeExports.jsx("span", { children: suffixText })] }) : displayText }), jsxRuntimeExports.jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute left-0 top-0 inline-block invisible select-none whitespace-nowrap", ref: measureRef })] });
406
385
  }
407
- const encryptedPlaceholderPreview = `{
408
- "input": "[encrypted]",
409
- "result": "[encrypted]"
410
- }`;
411
- function EncryptedDataBlock() {
412
- const ctx = reactExports.useContext(DecryptClickContext);
413
- return jsxRuntimeExports.jsxs("div", { className: "relative min-h-20 overflow-hidden rounded-md border border-gray-alpha-400 bg-background-100", children: [jsxRuntimeExports.jsx("pre", { "aria-hidden": "true", className: "pointer-events-none m-0 select-none p-3 font-mono text-label-12 text-gray-900 blur-[4px]", children: encryptedPlaceholderPreview }), jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: ctx ? jsxRuntimeExports.jsxs(Button, { onClick: ctx.onDecrypt, disabled: ctx.isDecrypting, size: "xs", children: [ctx.isDecrypting ? jsxRuntimeExports.jsx(Spinner, { size: 10 }) : jsxRuntimeExports.jsx(Lock, { className: "h-3 w-3" }), jsxRuntimeExports.jsx("span", { children: "Decrypt" })] }) : jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-gray-alpha-400 bg-gray-100 px-1.5 py-0.5 text-button-12 font-medium text-gray-700", children: [jsxRuntimeExports.jsx(Lock, { className: "h-3 w-3" }), "Encrypted"] }) })] });
414
- }
415
- const serializeForClipboard = (value) => {
416
- if (typeof value === "string")
417
- return value;
418
- if (typeof value === "number" || typeof value === "boolean" || value === null) {
419
- return String(value);
420
- }
421
- try {
422
- return JSON.stringify(value, null, 2);
423
- } catch {
424
- return String(value);
425
- }
426
- };
427
- function CopyableDataBlock({ data }) {
428
- return jsxRuntimeExports.jsxs("div", { className: "relative overflow-x-auto rounded-md border border-gray-alpha-400 p-3", children: [jsxRuntimeExports.jsx(CopyButton, { copyText: serializeForClipboard(data), ariaLabel: "Copy data", className: "absolute right-2 top-2 z-10 flex h-6 w-6 items-center justify-center rounded-md border border-gray-alpha-400 !bg-background-100 p-0 text-gray-900 transition-transform transition-colors duration-100 hover:bg-gray-200 active:scale-95 active:bg-gray-300" }), jsxRuntimeExports.jsx(DataInspector, { data })] });
429
- }
430
386
  function isReservedAttributeKey(key) {
431
387
  return key.startsWith(RESERVED_ATTRIBUTE_KEY_PREFIX);
432
388
  }
@@ -560,14 +516,14 @@ ${stack}` : body;
560
516
  color: "var(--ds-red-900)",
561
517
  borderBottom: "1px solid var(--ds-red-400)"
562
518
  }, children: [jsxRuntimeExports.jsx(CircleAlert, { className: "h-4 w-4 shrink-0" }), jsxRuntimeExports.jsx("p", {
563
- className: "text-xs font-semibold m-0 truncate",
519
+ className: "text-label-12 font-semibold m-0 truncate",
564
520
  // The full message or stack is in the body below; the header just
565
521
  // shows the first line, single-line, with overflow
566
522
  // ellipsised so a long title doesn't push the copy button or
567
523
  // wrap into the framed hint/docs lines.
568
524
  title: message,
569
525
  children: title
570
- })] }), body && jsxRuntimeExports.jsx("pre", { className: "px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0", style: {
526
+ })] }), body && jsxRuntimeExports.jsx("pre", { className: "px-3 py-2.5 text-label-12-mono whitespace-pre-wrap break-words overflow-auto m-0", style: {
571
527
  color: "var(--ds-red-900)",
572
528
  background: "var(--ds-red-200)"
573
529
  }, children: body })] });
@@ -914,10 +870,10 @@ function PayloadBlock({ data, eventType }) {
914
870
  if (eventType === "run_cancelled") {
915
871
  const cancelReason = cleaned != null && typeof cleaned === "object" && typeof cleaned.cancelReason === "string" ? cleaned.cancelReason : null;
916
872
  if (cancelReason) {
917
- return jsxRuntimeExports.jsxs("div", { className: "p-2 text-xs", style: { color: "var(--ds-gray-1000)" }, children: [jsxRuntimeExports.jsx("span", { style: { color: "var(--ds-gray-900)" }, children: "Reason: " }), jsxRuntimeExports.jsx("span", { className: "whitespace-pre-wrap break-words", children: cancelReason })] });
873
+ return jsxRuntimeExports.jsxs("div", { className: "p-2 text-label-12", style: { color: "var(--ds-gray-1000)" }, children: [jsxRuntimeExports.jsx("span", { style: { color: "var(--ds-gray-900)" }, children: "Reason: " }), jsxRuntimeExports.jsx("span", { className: "whitespace-pre-wrap break-words", children: cancelReason })] });
918
874
  }
919
875
  }
920
- return jsxRuntimeExports.jsxs("div", { className: "relative group/payload", children: [jsxRuntimeExports.jsx("div", { className: "overflow-x-auto p-2 text-[11px]", style: { color: "var(--ds-gray-1000)" }, children: jsxRuntimeExports.jsx(DataInspector, { data: cleaned, expandLevel: 2 }) }), jsxRuntimeExports.jsx("button", { type: "button", onClick: handleCopy, className: "absolute bottom-2 right-2 opacity-0 group-hover/payload:opacity-100 transition-opacity flex items-center gap-1 px-2 py-1 rounded-md text-xs hover:bg-[var(--ds-gray-alpha-200)]", style: { ...BUTTON_RESET_STYLE, color: "var(--ds-gray-700)" }, "aria-label": "Copy payload", children: copied ? jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Check, { className: "h-3 w-3", style: { color: "var(--ds-green-700)" } }), jsxRuntimeExports.jsx("span", { style: { color: "var(--ds-green-700)" }, children: "Copied" })] }) : jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Copy, { className: "h-3 w-3" }), jsxRuntimeExports.jsx("span", { children: "Copy" })] }) })] });
876
+ return jsxRuntimeExports.jsxs("div", { className: "relative group/payload", children: [jsxRuntimeExports.jsx("div", { className: "overflow-x-auto p-2 text-[11px]", style: { color: "var(--ds-gray-1000)" }, children: jsxRuntimeExports.jsx(DataInspector, { data: cleaned, expandLevel: 2 }) }), jsxRuntimeExports.jsx("button", { type: "button", onClick: handleCopy, className: "absolute bottom-2 right-2 opacity-0 group-hover/payload:opacity-100 transition-opacity flex items-center gap-1 px-2 py-1 rounded-md text-button-12 hover:bg-[var(--ds-gray-alpha-200)]", style: { ...BUTTON_RESET_STYLE, color: "var(--ds-gray-700)" }, "aria-label": "Copy payload", children: copied ? jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Check, { className: "h-3 w-3", style: { color: "var(--ds-green-700)" } }), jsxRuntimeExports.jsx("span", { style: { color: "var(--ds-green-700)" }, children: "Copied" })] }) : jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(Copy, { className: "h-3 w-3" }), jsxRuntimeExports.jsx("span", { children: "Copy" })] }) })] });
921
877
  }
922
878
  const SORT_OPTIONS = [
923
879
  { value: "desc", label: "Newest" },
@@ -1050,7 +1006,7 @@ function EventRow$1({ event, index, isFirst, isLast, isExpanded, onToggleExpand,
1050
1006
  return jsxRuntimeExports.jsxs("div", { "data-event-id": event.eventId, onMouseEnter: () => onHoverGroup(rowGroupKey), onMouseLeave: () => onHoverGroup(void 0), children: [jsxRuntimeExports.jsxs("div", { role: "button", tabIndex: 0, onClick: handleRowClick, onKeyDown: (e) => {
1051
1007
  if (e.key === "Enter" || e.key === " ")
1052
1008
  handleRowClick();
1053
- }, className: "w-full text-left flex items-center gap-0 text-[13px] hover:bg-[var(--ds-gray-alpha-100)] transition-colors cursor-pointer", style: { minHeight: 40 }, children: [jsxRuntimeExports.jsx(TreeGutter, { isFirst, isLast: isLast && !isExpanded, isRunLevel: isRun, statusDotColor, pulse: isPulsing, hasSelection: hasActive, showBranch, showLaneLine, isLaneStart, isLaneEnd }), jsxRuntimeExports.jsxs("div", { className: "flex items-center flex-1 min-w-0", style: { opacity: contentOpacity, transition: "opacity 150ms" }, children: [jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center w-5 h-5 flex-shrink-0 rounded", style: {
1009
+ }, className: "w-full text-left flex items-center gap-0 text-label-13 hover:bg-[var(--ds-gray-alpha-100)] transition-colors cursor-pointer", style: { minHeight: 40 }, children: [jsxRuntimeExports.jsx(TreeGutter, { isFirst, isLast: isLast && !isExpanded, isRunLevel: isRun, statusDotColor, pulse: isPulsing, hasSelection: hasActive, showBranch, showLaneLine, isLaneStart, isLaneEnd }), jsxRuntimeExports.jsxs("div", { className: "flex items-center flex-1 min-w-0", style: { opacity: contentOpacity, transition: "opacity 150ms" }, children: [jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center w-5 h-5 flex-shrink-0 rounded", style: {
1054
1010
  border: "1px solid var(--ds-gray-400)"
1055
1011
  }, children: jsxRuntimeExports.jsx(ChevronRight, { className: "h-3 w-3 transition-transform", style: {
1056
1012
  color: "var(--ds-gray-900)",
@@ -1078,11 +1034,11 @@ function EventRow$1({ event, index, isFirst, isLast, isExpanded, onToggleExpand,
1078
1034
  borderColor: "var(--ds-gray-alpha-200)",
1079
1035
  opacity: contentOpacity,
1080
1036
  transition: "opacity 150ms"
1081
- }, children: [((durationInfo == null ? void 0 : durationInfo.queued) !== void 0 || (durationInfo == null ? void 0 : durationInfo.ran) !== void 0) && jsxRuntimeExports.jsxs("div", { className: "px-2 pb-1.5 text-xs flex gap-3", style: { color: "var(--ds-gray-900)" }, children: [durationInfo.queued !== void 0 && durationInfo.queued > 0 && jsxRuntimeExports.jsxs("span", { children: ["Queued for", " ", jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.queued) })] }), durationInfo.ran !== void 0 && jsxRuntimeExports.jsxs("span", { children: ["Ran for", " ", jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.ran) })] })] }), displayPayload != null ? jsxRuntimeExports.jsx(PayloadBlock, { data: displayPayload, eventType: event.eventType }) : loadError ? jsxRuntimeExports.jsx("div", { className: "rounded-md border p-3 text-xs", style: {
1037
+ }, children: [((durationInfo == null ? void 0 : durationInfo.queued) !== void 0 || (durationInfo == null ? void 0 : durationInfo.ran) !== void 0) && jsxRuntimeExports.jsxs("div", { className: "px-2 pb-1.5 text-label-12 flex gap-3", style: { color: "var(--ds-gray-900)" }, children: [durationInfo.queued !== void 0 && durationInfo.queued > 0 && jsxRuntimeExports.jsxs("span", { children: ["Queued for", " ", jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.queued) })] }), durationInfo.ran !== void 0 && jsxRuntimeExports.jsxs("span", { children: ["Ran for", " ", jsxRuntimeExports.jsx("span", { className: "font-mono tabular-nums", children: formatDuration(durationInfo.ran) })] })] }), displayPayload != null ? jsxRuntimeExports.jsx(PayloadBlock, { data: displayPayload, eventType: event.eventType }) : loadError ? jsxRuntimeExports.jsx("div", { className: "rounded-md border p-3 text-label-12", style: {
1082
1038
  borderColor: "var(--ds-red-400)",
1083
1039
  backgroundColor: "var(--ds-red-100)",
1084
1040
  color: "var(--ds-red-900)"
1085
- }, children: loadError }) : isLoading || loadedEventData === null && !hasAttemptedLoad && event.correlationId ? jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 p-3", children: [jsxRuntimeExports.jsx(Skeleton, { className: "h-3", style: { width: "75%" } }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3", style: { width: "50%" } }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3", style: { width: "60%" } })] }) : jsxRuntimeExports.jsx("div", { className: "p-2 text-xs", style: { color: "var(--ds-gray-900)" }, children: "No data" })] })] })] });
1041
+ }, children: loadError }) : isLoading || loadedEventData === null && !hasAttemptedLoad && event.correlationId ? jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 p-3", children: [jsxRuntimeExports.jsx(Skeleton, { className: "h-3", style: { width: "75%" } }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3", style: { width: "50%" } }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3", style: { width: "60%" } })] }) : jsxRuntimeExports.jsx("div", { className: "p-2 text-label-12", style: { color: "var(--ds-gray-900)" }, children: "No data" })] })] })] });
1086
1042
  }
1087
1043
  function EventListViewInner({ events, run, onLoadEventData, hasMoreEvents = false, isLoadingMoreEvents = false, onLoadMoreEvents, encryptionKey, isLoading = false, sortOrder: sortOrderProp, onSortOrderChange, onDecrypt, isDecrypting = false, hasEncryptedData: hasEncryptedDataProp = false, onExactIdSearch, showSeparateEventOccurrenceTimestamps = false }) {
1088
1044
  const toast2 = useToast();
@@ -1334,11 +1290,11 @@ function EventListViewInner({ events, run, onLoadEventData, hasMoreEvents = fals
1334
1290
  width: "100%",
1335
1291
  opacity: onExactIdSearch ? 1 : 0.5,
1336
1292
  cursor: onExactIdSearch ? "text" : "not-allowed"
1337
- } })] }), jsxRuntimeExports.jsx(MenuDropdown, { options: SORT_OPTIONS, value: effectiveSortOrder, onChange: handleSortOrderChange }), (hasEncryptedData || encryptionKey) && onDecrypt && jsxRuntimeExports.jsx(DecryptButton, { decrypted: !!encryptionKey, loading: isDecrypting, onClick: onDecrypt })] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-0 text-[13px] font-medium h-10 border-b flex-shrink-0", style: {
1293
+ } })] }), jsxRuntimeExports.jsx(MenuDropdown, { options: SORT_OPTIONS, value: effectiveSortOrder, onChange: handleSortOrderChange }), (hasEncryptedData || encryptionKey) && onDecrypt && jsxRuntimeExports.jsx(DecryptButton, { decrypted: !!encryptionKey, loading: isDecrypting, onClick: onDecrypt })] }), jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-0 text-label-13 font-medium h-10 border-b flex-shrink-0", style: {
1338
1294
  borderColor: "var(--ds-gray-alpha-200)",
1339
1295
  color: "var(--ds-gray-900)",
1340
1296
  backgroundColor: "var(--ds-background-100)"
1341
- }, children: [jsxRuntimeExports.jsx("div", { className: "flex-shrink-0", style: { width: GUTTER_WIDTH } }), jsxRuntimeExports.jsx("div", { className: "w-5 flex-shrink-0" }), showSeparateEventOccurrenceTimestamps && jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Occurred" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Created" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Event Type" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Name" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "3 1 0%" }, children: "Correlation ID" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "3 1 0%" }, children: "Event ID" })] }), isRefetching || searchLoading ? jsxRuntimeExports.jsx(RowsSkeleton, { showSeparateEventOccurrenceTimestamps }) : sortedEvents.length === 0 ? jsxRuntimeExports.jsx("div", { className: "flex flex-1 items-center justify-center px-6 text-center text-sm", style: { color: "var(--ds-gray-700)" }, children: searchNotFound && searchQuery.trim() ? `No events found for ${searchQuery.trim()}` : searchError ? searchError : parsedSearchId && searchQuery.trim() && !onExactIdSearch ? "Exact ID search is unavailable in this view." : "No events found" }) : jsxRuntimeExports.jsx(Yr, { ref: virtuosoRef, totalCount: sortedEvents.length, overscan: 20, defaultItemHeight: 40, endReached: () => {
1297
+ }, children: [jsxRuntimeExports.jsx("div", { className: "flex-shrink-0", style: { width: GUTTER_WIDTH } }), jsxRuntimeExports.jsx("div", { className: "w-5 flex-shrink-0" }), showSeparateEventOccurrenceTimestamps && jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Occurred" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Created" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Event Type" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "2 1 0%" }, children: "Name" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "3 1 0%" }, children: "Correlation ID" }), jsxRuntimeExports.jsx("div", { className: "min-w-0 px-4", style: { flex: "3 1 0%" }, children: "Event ID" })] }), isRefetching || searchLoading ? jsxRuntimeExports.jsx(RowsSkeleton, { showSeparateEventOccurrenceTimestamps }) : sortedEvents.length === 0 ? jsxRuntimeExports.jsx("div", { className: "flex flex-1 items-center justify-center px-6 text-center text-copy-14", style: { color: "var(--ds-gray-700)" }, children: searchNotFound && searchQuery.trim() ? `No events found for ${searchQuery.trim()}` : searchError ? searchError : parsedSearchId && searchQuery.trim() && !onExactIdSearch ? "Exact ID search is unavailable in this view." : "No events found" }) : jsxRuntimeExports.jsx(Yr, { ref: virtuosoRef, totalCount: sortedEvents.length, overscan: 20, defaultItemHeight: 40, endReached: () => {
1342
1298
  if (isExactSearchActive || !hasMoreEvents || isLoadingMoreEvents) {
1343
1299
  return;
1344
1300
  }
@@ -1346,7 +1302,7 @@ function EventListViewInner({ events, run, onLoadEventData, hasMoreEvents = fals
1346
1302
  }, itemContent: (index) => {
1347
1303
  const ev = sortedEvents[index];
1348
1304
  return jsxRuntimeExports.jsx(EventRow$1, { event: ev, index, isFirst: index === 0, isLast: index === sortedEvents.length - 1, isExpanded: expandedEventIds.has(ev.eventId), onToggleExpand: toggleEventExpanded, activeGroupKey, selectedGroupKey, selectedGroupRange, correlationNameMap, workflowName, durationMap, onSelectGroup, onHoverGroup, onLoadEventData, cachedEventData: eventDataCacheRef.current.get(ev.eventId) ?? null, onCacheEventData: cacheEventData, encryptionKey, onEncryptedDataDetected: handleEncryptedDataDetected, suppressGroupDimming: isExactSearchActive, showSeparateEventOccurrenceTimestamps });
1349
- }, style: { flex: 1, minHeight: 0 } }), jsxRuntimeExports.jsxs("div", { className: "relative flex-shrink-0 flex items-center h-10 border-t px-4 text-xs", style: {
1305
+ }, style: { flex: 1, minHeight: 0 } }), jsxRuntimeExports.jsxs("div", { className: "relative flex-shrink-0 flex items-center h-10 border-t px-4 text-label-12", style: {
1350
1306
  borderColor: "var(--ds-gray-alpha-200)",
1351
1307
  color: "var(--ds-gray-900)",
1352
1308
  backgroundColor: "var(--ds-background-100)"
@@ -1355,31 +1311,111 @@ function EventListViewInner({ events, run, onLoadEventData, hasMoreEvents = fals
1355
1311
  function EventListView(props) {
1356
1312
  return jsxRuntimeExports.jsx(ContextCardProvider, { children: jsxRuntimeExports.jsx(EventListViewInner, { ...props }) });
1357
1313
  }
1358
- const GUTTER_PX = 1;
1359
- const MIN_PX = 50;
1360
- const DEFAULT_START_PX = 340;
1361
- function paneColTemplate(startPx) {
1362
- return `${startPx}px ${GUTTER_PX}px minmax(${MIN_PX}px, 1fr)`;
1314
+ function ConversationView({ messages }) {
1315
+ if (messages.length === 0) {
1316
+ return jsxRuntimeExports.jsx("div", { className: "text-center py-8 text-[11px]", style: { color: "var(--ds-gray-600)" }, children: "No messages" });
1317
+ }
1318
+ return jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-3 p-3", children: messages.map((message, index) => jsxRuntimeExports.jsx(MessageBubble, { message }, index)) });
1363
1319
  }
1364
- const COL_TEMPLATE = paneColTemplate(DEFAULT_START_PX);
1365
- const ROWS = [
1366
- { id: "r0", name: 62, off: 0, bar: 72 },
1367
- { id: "r1", name: 78, off: 6, bar: 48 },
1368
- { id: "r2", name: 50, off: 10, bar: 55 },
1369
- { id: "r3", name: 84, off: 18, bar: 30 },
1370
- { id: "r4", name: 45, off: 18, bar: 42 },
1371
- { id: "r5", name: 66, off: 34, bar: 38 },
1372
- { id: "r6", name: 55, off: 41, bar: 25 },
1373
- { id: "r7", name: 40, off: 50, bar: 30 }
1374
- ];
1375
- const HEADER_MARKERS = ["m0", "m1", "m2", "m3"];
1376
- const HeaderDivider = () => jsxRuntimeExports.jsx("div", { className: "flex justify-center", children: jsxRuntimeExports.jsx("span", { "aria-hidden": true, className: "h-full w-px bg-gray-alpha-400" }) });
1377
- function TraceViewerSkeleton() {
1378
- return jsxRuntimeExports.jsxs("output", { "aria-busy": "true", "aria-label": "Loading trace", className: "flex flex-col w-full h-full min-h-0 bg-background-100", children: [jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Loading trace…" }), jsxRuntimeExports.jsx("div", { className: "relative h-10 min-h-10 shrink-0 border-b border-gray-alpha-400", children: jsxRuntimeExports.jsx("div", { className: "absolute inset-x-4 top-[6px]", children: ROWS.map((row, index) => jsxRuntimeExports.jsx(Skeleton, { className: "absolute h-[3px] rounded-full", style: {
1379
- left: `${row.off}%`,
1380
- width: `${row.bar}%`,
1381
- top: index * 3.5
1382
- } }, row.id)) }) }), jsxRuntimeExports.jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: COL_TEMPLATE }, children: [jsxRuntimeExports.jsxs("div", { className: "h-10 min-h-10 flex items-center border-b border-gray-alpha-400 pl-4 pr-2 gap-1.5", children: [jsxRuntimeExports.jsx(Skeleton, { className: "w-3.5 h-3.5 shrink-0 rounded-sm" }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3.5 w-40" })] }), jsxRuntimeExports.jsx(HeaderDivider, {}), jsxRuntimeExports.jsx("div", { className: "h-10 min-h-10 flex items-end border-b border-gray-alpha-400 px-4 pb-1 gap-2", children: jsxRuntimeExports.jsx("div", { className: "relative flex-1 flex items-end justify-between", children: HEADER_MARKERS.map((id) => jsxRuntimeExports.jsx(Skeleton, { className: "h-3.5 w-9" }, id)) }) })] }), jsxRuntimeExports.jsxs("div", { className: "grid flex-1 min-h-0 overflow-hidden", style: { gridTemplateColumns: COL_TEMPLATE }, children: [jsxRuntimeExports.jsx("div", { className: "block overflow-visible", children: jsxRuntimeExports.jsx("ul", { className: "block divide-y divide-gray-alpha-400 border-b border-gray-alpha-400", children: ROWS.map((row) => jsxRuntimeExports.jsxs("li", { className: "h-10 flex items-center pl-4 pr-2", children: [jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [jsxRuntimeExports.jsx(Skeleton, { className: "w-4 h-4 shrink-0 rounded-sm" }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3.5", style: { width: `${row.name}%` } })] }), jsxRuntimeExports.jsx(Skeleton, { className: "ml-2 h-3.5 w-10 shrink-0" })] }, row.id)) }) }), jsxRuntimeExports.jsx("span", { "aria-hidden": true, className: "h-full w-px bg-gray-alpha-400" }), jsxRuntimeExports.jsx("div", { className: "relative min-h-0", children: ROWS.map((row) => jsxRuntimeExports.jsx("div", { className: "relative h-10", children: jsxRuntimeExports.jsx("div", { className: "absolute inset-x-4 inset-y-0", children: jsxRuntimeExports.jsx(Skeleton, { className: "absolute top-1/2 -translate-y-1/2 h-6 rounded-[0.25rem]", style: { left: `${row.off}%`, width: `${row.bar}%` } }) }) }, row.id)) })] })] });
1320
+ function MessageBubble({ message }) {
1321
+ const role = message.role;
1322
+ const parts = parseContent(message.content);
1323
+ const style = getRoleStyle(role);
1324
+ return jsxRuntimeExports.jsxs("div", { className: "rounded-md border text-[11px]", style: {
1325
+ backgroundColor: style.bg,
1326
+ borderColor: style.border
1327
+ }, children: [jsxRuntimeExports.jsx("div", { className: "px-2.5 py-1 border-b text-[10px] font-medium uppercase tracking-wide", style: {
1328
+ borderColor: style.border,
1329
+ color: style.label
1330
+ }, children: role }), jsxRuntimeExports.jsx("div", { className: "px-2.5 py-2 space-y-2", children: parts.map((part, i) => jsxRuntimeExports.jsx(ContentPart, { part, role }, i)) })] });
1331
+ }
1332
+ function ContentPart({ part, role }) {
1333
+ if (part.type === "text") {
1334
+ if (!part.text)
1335
+ return null;
1336
+ if (role === "assistant") {
1337
+ return jsxRuntimeExports.jsx("div", { className: "prose prose-sm max-w-none text-[11px] [&>*:first-child]:mt-0 [&>*:last-child]:mb-0", style: { color: "var(--ds-gray-1000)" }, children: jsxRuntimeExports.jsx(_r, { children: part.text }) });
1338
+ }
1339
+ return jsxRuntimeExports.jsx("div", { className: "whitespace-pre-wrap break-words", style: { color: "var(--ds-gray-1000)" }, children: part.text });
1340
+ }
1341
+ if (part.type === "tool-call") {
1342
+ return jsxRuntimeExports.jsxs("div", { className: "rounded border px-2 py-1.5", style: {
1343
+ backgroundColor: "var(--ds-purple-100)",
1344
+ borderColor: "var(--ds-purple-300)"
1345
+ }, children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-[10px] font-medium", children: [jsxRuntimeExports.jsx("span", { children: "🔧" }), jsxRuntimeExports.jsx("span", { style: { color: "var(--ds-purple-900)" }, children: part.toolName })] }), part.input != null && jsxRuntimeExports.jsx("div", { className: "mt-1.5 overflow-x-auto p-1.5 rounded", style: { backgroundColor: "var(--ds-gray-100)" }, children: typeof part.input === "string" ? jsxRuntimeExports.jsx("pre", { className: "text-[10px]", style: { color: "var(--ds-gray-800)" }, children: part.input }) : jsxRuntimeExports.jsx(DataInspector, { data: part.input }) })] });
1346
+ }
1347
+ if (part.type === "tool-result") {
1348
+ return jsxRuntimeExports.jsxs("div", { className: "rounded border px-2 py-1.5", style: {
1349
+ backgroundColor: "var(--ds-green-100)",
1350
+ borderColor: "var(--ds-green-300)"
1351
+ }, children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-[10px] font-medium", children: [jsxRuntimeExports.jsx("span", { children: "✓" }), jsxRuntimeExports.jsxs("span", { style: { color: "var(--ds-green-900)" }, children: [part.toolName, " result"] })] }), part.output != null && jsxRuntimeExports.jsx("div", { className: "mt-1.5 overflow-x-auto max-h-[200px] overflow-y-auto p-1.5 rounded", style: { backgroundColor: "var(--ds-gray-100)" }, children: typeof part.output === "string" ? jsxRuntimeExports.jsx("pre", { className: "text-[10px]", style: { color: "var(--ds-gray-800)" }, children: part.output }) : jsxRuntimeExports.jsx(DataInspector, { data: part.output, expandLevel: 1 }) })] });
1352
+ }
1353
+ return null;
1354
+ }
1355
+ function getRoleStyle(role) {
1356
+ switch (role) {
1357
+ case "user":
1358
+ return {
1359
+ bg: "var(--ds-blue-100)",
1360
+ border: "var(--ds-blue-300)",
1361
+ label: "var(--ds-blue-700)"
1362
+ };
1363
+ case "assistant":
1364
+ return {
1365
+ bg: "var(--ds-gray-100)",
1366
+ border: "var(--ds-gray-300)",
1367
+ label: "var(--ds-gray-700)"
1368
+ };
1369
+ case "system":
1370
+ return {
1371
+ bg: "var(--ds-amber-100)",
1372
+ border: "var(--ds-amber-300)",
1373
+ label: "var(--ds-amber-700)"
1374
+ };
1375
+ case "tool":
1376
+ return {
1377
+ bg: "var(--ds-green-50)",
1378
+ border: "var(--ds-green-300)",
1379
+ label: "var(--ds-green-700)"
1380
+ };
1381
+ default:
1382
+ return {
1383
+ bg: "var(--ds-gray-100)",
1384
+ border: "var(--ds-gray-300)",
1385
+ label: "var(--ds-gray-700)"
1386
+ };
1387
+ }
1388
+ }
1389
+ function parseContent(content) {
1390
+ if (typeof content === "string") {
1391
+ return [{ type: "text", text: content }];
1392
+ }
1393
+ if (Array.isArray(content)) {
1394
+ return content.map((part) => {
1395
+ if (typeof part === "string") {
1396
+ return { type: "text", text: part };
1397
+ }
1398
+ if ((part == null ? void 0 : part.type) === "text") {
1399
+ return { type: "text", text: String(part.text ?? "") };
1400
+ }
1401
+ if ((part == null ? void 0 : part.type) === "tool-call") {
1402
+ return {
1403
+ type: "tool-call",
1404
+ toolName: part.toolName,
1405
+ input: part.input
1406
+ };
1407
+ }
1408
+ if ((part == null ? void 0 : part.type) === "tool-result") {
1409
+ return {
1410
+ type: "tool-result",
1411
+ toolName: part.toolName,
1412
+ output: part.output
1413
+ };
1414
+ }
1415
+ return { type: "text", text: "" };
1416
+ });
1417
+ }
1418
+ return [];
1383
1419
  }
1384
1420
  function shouldShowVerticalLine(eventType) {
1385
1421
  if (isHookLifecycleEventType(eventType)) {
@@ -1794,111 +1830,86 @@ function buildTrace(run, events, now) {
1794
1830
  knownDurationMs: Math.max(0, knownDurationMs)
1795
1831
  };
1796
1832
  }
1797
- function ConversationView({ messages }) {
1798
- if (messages.length === 0) {
1799
- return jsxRuntimeExports.jsx("div", { className: "text-center py-8 text-[11px]", style: { color: "var(--ds-gray-600)" }, children: "No messages" });
1800
- }
1801
- return jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-3 p-3", children: messages.map((message, index) => jsxRuntimeExports.jsx(MessageBubble, { message }, index)) });
1833
+ const GUTTER_PX = 1;
1834
+ const MIN_PX = 50;
1835
+ const DEFAULT_START_PX = 340;
1836
+ function paneColTemplate(startPx) {
1837
+ return `${startPx}px ${GUTTER_PX}px minmax(${MIN_PX}px, 1fr)`;
1802
1838
  }
1803
- function MessageBubble({ message }) {
1804
- const role = message.role;
1805
- const parts = parseContent(message.content);
1806
- const style = getRoleStyle(role);
1807
- return jsxRuntimeExports.jsxs("div", { className: "rounded-md border text-[11px]", style: {
1808
- backgroundColor: style.bg,
1809
- borderColor: style.border
1810
- }, children: [jsxRuntimeExports.jsx("div", { className: "px-2.5 py-1 border-b text-[10px] font-medium uppercase tracking-wide", style: {
1811
- borderColor: style.border,
1812
- color: style.label
1813
- }, children: role }), jsxRuntimeExports.jsx("div", { className: "px-2.5 py-2 space-y-2", children: parts.map((part, i) => jsxRuntimeExports.jsx(ContentPart, { part, role }, i)) })] });
1839
+ const COL_TEMPLATE = paneColTemplate(DEFAULT_START_PX);
1840
+ const ROWS = [
1841
+ { id: "r0", name: 62, off: 0, bar: 72 },
1842
+ { id: "r1", name: 78, off: 6, bar: 48 },
1843
+ { id: "r2", name: 50, off: 10, bar: 55 },
1844
+ { id: "r3", name: 84, off: 18, bar: 30 },
1845
+ { id: "r4", name: 45, off: 18, bar: 42 },
1846
+ { id: "r5", name: 66, off: 34, bar: 38 },
1847
+ { id: "r6", name: 55, off: 41, bar: 25 },
1848
+ { id: "r7", name: 40, off: 50, bar: 30 }
1849
+ ];
1850
+ const HEADER_MARKERS = ["m0", "m1", "m2", "m3"];
1851
+ const HeaderDivider = () => jsxRuntimeExports.jsx("div", { className: "flex justify-center", children: jsxRuntimeExports.jsx("span", { "aria-hidden": true, className: "h-full w-px bg-gray-alpha-400" }) });
1852
+ function TraceViewerSkeleton() {
1853
+ return jsxRuntimeExports.jsxs("output", { "aria-busy": "true", "aria-label": "Loading trace", className: "flex flex-col w-full h-full min-h-0 bg-background-100", children: [jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Loading trace…" }), jsxRuntimeExports.jsx("div", { className: "relative h-10 min-h-10 shrink-0 border-b border-gray-alpha-400", children: jsxRuntimeExports.jsx("div", { className: "absolute inset-x-4 top-[6px]", children: ROWS.map((row, index) => jsxRuntimeExports.jsx(Skeleton, { className: "absolute h-[3px] rounded-full", style: {
1854
+ left: `${row.off}%`,
1855
+ width: `${row.bar}%`,
1856
+ top: index * 3.5
1857
+ } }, row.id)) }) }), jsxRuntimeExports.jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: COL_TEMPLATE }, children: [jsxRuntimeExports.jsxs("div", { className: "h-10 min-h-10 flex items-center border-b border-gray-alpha-400 pl-4 pr-2 gap-1.5", children: [jsxRuntimeExports.jsx(Skeleton, { className: "w-3.5 h-3.5 shrink-0 rounded-sm" }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3.5 w-40" })] }), jsxRuntimeExports.jsx(HeaderDivider, {}), jsxRuntimeExports.jsx("div", { className: "h-10 min-h-10 flex items-end border-b border-gray-alpha-400 px-4 pb-1 gap-2", children: jsxRuntimeExports.jsx("div", { className: "relative flex-1 flex items-end justify-between", children: HEADER_MARKERS.map((id) => jsxRuntimeExports.jsx(Skeleton, { className: "h-3.5 w-9" }, id)) }) })] }), jsxRuntimeExports.jsxs("div", { className: "grid flex-1 min-h-0 overflow-hidden", style: { gridTemplateColumns: COL_TEMPLATE }, children: [jsxRuntimeExports.jsx("div", { className: "block overflow-visible", children: jsxRuntimeExports.jsx("ul", { className: "block divide-y divide-gray-alpha-400 border-b border-gray-alpha-400", children: ROWS.map((row) => jsxRuntimeExports.jsxs("li", { className: "h-10 flex items-center pl-4 pr-2", children: [jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [jsxRuntimeExports.jsx(Skeleton, { className: "w-4 h-4 shrink-0 rounded-sm" }), jsxRuntimeExports.jsx(Skeleton, { className: "h-3.5", style: { width: `${row.name}%` } })] }), jsxRuntimeExports.jsx(Skeleton, { className: "ml-2 h-3.5 w-10 shrink-0" })] }, row.id)) }) }), jsxRuntimeExports.jsx("span", { "aria-hidden": true, className: "h-full w-px bg-gray-alpha-400" }), jsxRuntimeExports.jsx("div", { className: "relative min-h-0", children: ROWS.map((row) => jsxRuntimeExports.jsx("div", { className: "relative h-10", children: jsxRuntimeExports.jsx("div", { className: "absolute inset-x-4 inset-y-0", children: jsxRuntimeExports.jsx(Skeleton, { className: "absolute top-1/2 -translate-y-1/2 h-6 rounded-[0.25rem]", style: { left: `${row.off}%`, width: `${row.bar}%` } }) }) }, row.id)) })] })] });
1814
1858
  }
1815
- function ContentPart({ part, role }) {
1816
- if (part.type === "text") {
1817
- if (!part.text)
1818
- return null;
1819
- if (role === "assistant") {
1820
- return jsxRuntimeExports.jsx("div", { className: "prose prose-sm max-w-none text-[11px] [&>*:first-child]:mt-0 [&>*:last-child]:mb-0", style: { color: "var(--ds-gray-1000)" }, children: jsxRuntimeExports.jsx(_r, { children: part.text }) });
1821
- }
1822
- return jsxRuntimeExports.jsx("div", { className: "whitespace-pre-wrap break-words", style: { color: "var(--ds-gray-1000)" }, children: part.text });
1823
- }
1824
- if (part.type === "tool-call") {
1825
- return jsxRuntimeExports.jsxs("div", { className: "rounded border px-2 py-1.5", style: {
1826
- backgroundColor: "var(--ds-purple-100)",
1827
- borderColor: "var(--ds-purple-300)"
1828
- }, children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-[10px] font-medium", children: [jsxRuntimeExports.jsx("span", { children: "🔧" }), jsxRuntimeExports.jsx("span", { style: { color: "var(--ds-purple-900)" }, children: part.toolName })] }), part.input != null && jsxRuntimeExports.jsx("div", { className: "mt-1.5 overflow-x-auto p-1.5 rounded", style: { backgroundColor: "var(--ds-gray-100)" }, children: typeof part.input === "string" ? jsxRuntimeExports.jsx("pre", { className: "text-[10px]", style: { color: "var(--ds-gray-800)" }, children: part.input }) : jsxRuntimeExports.jsx(DataInspector, { data: part.input }) })] });
1829
- }
1830
- if (part.type === "tool-result") {
1831
- return jsxRuntimeExports.jsxs("div", { className: "rounded border px-2 py-1.5", style: {
1832
- backgroundColor: "var(--ds-green-100)",
1833
- borderColor: "var(--ds-green-300)"
1834
- }, children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-[10px] font-medium", children: [jsxRuntimeExports.jsx("span", { children: "✓" }), jsxRuntimeExports.jsxs("span", { style: { color: "var(--ds-green-900)" }, children: [part.toolName, " result"] })] }), part.output != null && jsxRuntimeExports.jsx("div", { className: "mt-1.5 overflow-x-auto max-h-[200px] overflow-y-auto p-1.5 rounded", style: { backgroundColor: "var(--ds-gray-100)" }, children: typeof part.output === "string" ? jsxRuntimeExports.jsx("pre", { className: "text-[10px]", style: { color: "var(--ds-gray-800)" }, children: part.output }) : jsxRuntimeExports.jsx(DataInspector, { data: part.output, expandLevel: 1 }) })] });
1835
- }
1836
- return null;
1859
+ function useIntersectionObserver(elementRef, { threshold = 0, rootRef, rootMargin = "0%", freezeOnceVisible = false } = {}) {
1860
+ const [entry, setEntry] = reactExports.useState();
1861
+ const frozen = (entry == null ? void 0 : entry.isIntersecting) && freezeOnceVisible;
1862
+ reactExports.useEffect(() => {
1863
+ const node = elementRef == null ? void 0 : elementRef.current;
1864
+ const hasIOSupport = !!window.IntersectionObserver;
1865
+ if (!hasIOSupport || frozen || !node)
1866
+ return;
1867
+ const updateEntry = ([entry2]) => {
1868
+ setEntry(entry2);
1869
+ };
1870
+ const observer = new IntersectionObserver(updateEntry, {
1871
+ threshold,
1872
+ root: (rootRef == null ? void 0 : rootRef.current) ?? null,
1873
+ rootMargin
1874
+ });
1875
+ observer.observe(node);
1876
+ return () => observer.disconnect();
1877
+ }, [elementRef, threshold, rootRef, rootMargin, frozen]);
1878
+ return entry;
1837
1879
  }
1838
- function getRoleStyle(role) {
1839
- switch (role) {
1840
- case "user":
1841
- return {
1842
- bg: "var(--ds-blue-100)",
1843
- border: "var(--ds-blue-300)",
1844
- label: "var(--ds-blue-700)"
1845
- };
1846
- case "assistant":
1847
- return {
1848
- bg: "var(--ds-gray-100)",
1849
- border: "var(--ds-gray-300)",
1850
- label: "var(--ds-gray-700)"
1851
- };
1852
- case "system":
1853
- return {
1854
- bg: "var(--ds-amber-100)",
1855
- border: "var(--ds-amber-300)",
1856
- label: "var(--ds-amber-700)"
1857
- };
1858
- case "tool":
1859
- return {
1860
- bg: "var(--ds-green-50)",
1861
- border: "var(--ds-green-300)",
1862
- label: "var(--ds-green-700)"
1863
- };
1864
- default:
1865
- return {
1866
- bg: "var(--ds-gray-100)",
1867
- border: "var(--ds-gray-300)",
1868
- label: "var(--ds-gray-700)"
1869
- };
1870
- }
1880
+ function useLoadMoreOnScroll(loadMore, { hasMore, isLoadingMore, rootRef, rootMargin = "400px" }) {
1881
+ const sentinelRef = reactExports.useRef(null);
1882
+ const entry = useIntersectionObserver(sentinelRef, { rootRef, rootMargin });
1883
+ const loadMoreRef = reactExports.useRef(loadMore);
1884
+ reactExports.useEffect(() => {
1885
+ loadMoreRef.current = loadMore;
1886
+ }, [loadMore]);
1887
+ reactExports.useEffect(() => {
1888
+ if ((entry == null ? void 0 : entry.isIntersecting) && hasMore && !isLoadingMore) {
1889
+ loadMoreRef.current();
1890
+ }
1891
+ }, [entry == null ? void 0 : entry.isIntersecting, hasMore, isLoadingMore]);
1892
+ return sentinelRef;
1871
1893
  }
1872
- function parseContent(content) {
1873
- if (typeof content === "string") {
1874
- return [{ type: "text", text: content }];
1875
- }
1876
- if (Array.isArray(content)) {
1877
- return content.map((part) => {
1878
- if (typeof part === "string") {
1879
- return { type: "text", text: part };
1880
- }
1881
- if ((part == null ? void 0 : part.type) === "text") {
1882
- return { type: "text", text: String(part.text ?? "") };
1883
- }
1884
- if ((part == null ? void 0 : part.type) === "tool-call") {
1885
- return {
1886
- type: "tool-call",
1887
- toolName: part.toolName,
1888
- input: part.input
1889
- };
1890
- }
1891
- if ((part == null ? void 0 : part.type) === "tool-result") {
1892
- return {
1893
- type: "tool-result",
1894
- toolName: part.toolName,
1895
- output: part.output
1896
- };
1897
- }
1898
- return { type: "text", text: "" };
1899
- });
1894
+ const kbdVariants = cva("inline-flex items-center justify-center rounded px-1 text-center font-sans", {
1895
+ variants: {
1896
+ variant: {
1897
+ subtle: "bg-background-100/20",
1898
+ outline: "border border-gray-alpha-400 bg-background-100 font-medium text-gray-900"
1899
+ },
1900
+ size: {
1901
+ default: "h-5 min-w-5 text-label-12 leading-none",
1902
+ compact: "h-4 min-h-4 min-w-4 text-[11px] leading-none",
1903
+ search: "h-5 min-h-5 min-w-5 text-label-13 leading-[1.7em]"
1904
+ }
1905
+ },
1906
+ defaultVariants: {
1907
+ variant: "subtle",
1908
+ size: "default"
1900
1909
  }
1901
- return [];
1910
+ });
1911
+ function Kbd({ children, className, variant, size, ...props }) {
1912
+ return jsxRuntimeExports.jsx("kbd", { className: cn(kbdVariants({ variant, size, className })), ...props, children });
1902
1913
  }
1903
1914
  function TabButton({ active, onClick, children }) {
1904
1915
  return jsxRuntimeExports.jsx("button", { type: "button", role: "tab", "aria-selected": active, tabIndex: active ? 0 : -1, onClick, className: "px-3 py-1.5 text-[11px] font-medium transition-colors -mb-px", style: {
@@ -1945,7 +1956,7 @@ function EncryptedFieldBlock() {
1945
1956
  return jsxRuntimeExports.jsx(EncryptedDataBlock, {});
1946
1957
  }
1947
1958
  function ExpiredFieldBlock() {
1948
- return jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-xs", style: {
1959
+ return jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-label-12", style: {
1949
1960
  borderColor: "var(--ds-gray-300)",
1950
1961
  backgroundColor: "var(--ds-gray-100)",
1951
1962
  color: "var(--ds-gray-700)"
@@ -1976,12 +1987,16 @@ const attributeOrder = [
1976
1987
  "runId",
1977
1988
  "attempt",
1978
1989
  "token",
1990
+ "isWebhook",
1991
+ "isSystem",
1979
1992
  "receivedCount",
1980
1993
  "lastReceivedAt",
1981
1994
  "disposedAt",
1982
1995
  "correlationId",
1983
1996
  "eventType",
1984
1997
  "deploymentId",
1998
+ "vercelId",
1999
+ "computeInstanceId",
1985
2000
  "specVersion",
1986
2001
  "workflowCoreVersion",
1987
2002
  "ownerId",
@@ -1995,6 +2010,7 @@ const attributeOrder = [
1995
2010
  "completedAt",
1996
2011
  "expiredAt",
1997
2012
  "retryAfter",
2013
+ "errorCode",
1998
2014
  "error",
1999
2015
  "metadata",
2000
2016
  "eventData",
@@ -2003,11 +2019,11 @@ const attributeOrder = [
2003
2019
  "attributes",
2004
2020
  "resumeAt"
2005
2021
  ];
2006
- const sortByAttributeOrder = (a, b) => {
2007
- const aIndex = attributeOrder.indexOf(a) || 0;
2008
- const bIndex = attributeOrder.indexOf(b) || 0;
2009
- return aIndex - bIndex;
2022
+ const attributeOrderIndex = (attribute) => {
2023
+ const index = attributeOrder.indexOf(attribute);
2024
+ return index === -1 ? attributeOrder.length : index;
2010
2025
  };
2026
+ const sortByAttributeOrder = (a, b) => attributeOrderIndex(a) - attributeOrderIndex(b);
2011
2027
  const attributeDisplayNames = {
2012
2028
  moduleSpecifier: "Module",
2013
2029
  workflowName: "Workflow Name",
@@ -2022,6 +2038,8 @@ const attributeDisplayNames = {
2022
2038
  errorCode: "Error Code",
2023
2039
  correlationId: "Correlation ID",
2024
2040
  deploymentId: "Deployment ID",
2041
+ vercelId: "Request ID",
2042
+ computeInstanceId: "Compute Instance ID",
2025
2043
  specVersion: "Spec Version",
2026
2044
  workflowCoreVersion: "@workflow/core version",
2027
2045
  occurredAt: "Occurred",
@@ -2078,6 +2096,7 @@ const timestampWithTooltipOrNull = (value) => {
2078
2096
  return null;
2079
2097
  return jsxRuntimeExports.jsx(TimestampTooltip, { date, children: jsxRuntimeExports.jsx("span", { children: formatLocalMillisecondTime(date) }) });
2080
2098
  };
2099
+ const opaqueIdOrNull = (value) => hasDisplayContent(value) ? String(value) : null;
2081
2100
  const attributeToDisplayFn = {
2082
2101
  // Names that need pretty-printing
2083
2102
  workflowName: (_value) => null,
@@ -2100,11 +2119,15 @@ const attributeToDisplayFn = {
2100
2119
  disposedAt: localMillisecondTimeOrNull,
2101
2120
  // Internal resume plumbing — not surfaced in the UI
2102
2121
  resumeContext: (_value) => null,
2122
+ resumeId: (_value) => null,
2123
+ resumeCapabilities: (_value) => null,
2103
2124
  // Event details
2104
2125
  eventType: (value) => String(value),
2105
2126
  correlationId: (value) => String(value),
2106
2127
  // Project details
2107
2128
  deploymentId: (value) => String(value),
2129
+ vercelId: opaqueIdOrNull,
2130
+ computeInstanceId: opaqueIdOrNull,
2108
2131
  specVersion: (value) => String(value),
2109
2132
  workflowCoreVersion: (value) => String(value),
2110
2133
  // Tenancy (we don't show these)
@@ -2227,7 +2250,7 @@ const selfHeaderedAttributes = /* @__PURE__ */ new Set([
2227
2250
  "attributes",
2228
2251
  "eventData"
2229
2252
  ]);
2230
- const ExpiredDataMessage = () => jsxRuntimeExports.jsx("div", { className: "text-copy-12 rounded-md border p-4 my-2", style: {
2253
+ const ExpiredDataMessage = () => jsxRuntimeExports.jsx("div", { className: "text-label-12 rounded-md border p-4 my-2", style: {
2231
2254
  borderColor: "var(--ds-gray-300)",
2232
2255
  backgroundColor: "var(--ds-gray-100)",
2233
2256
  color: "var(--ds-gray-700)"
@@ -2237,6 +2260,8 @@ const copyableBasicAttributes = /* @__PURE__ */ new Set([
2237
2260
  "hookId",
2238
2261
  "eventId",
2239
2262
  "deploymentId",
2263
+ "vercelId",
2264
+ "computeInstanceId",
2240
2265
  "moduleSpecifier",
2241
2266
  "token"
2242
2267
  ]);
@@ -2276,7 +2301,7 @@ const AttributeBlock = ({ attribute, value, isLoading, inline = false, context }
2276
2301
  if (selfHeaderedAttributes.has(attribute)) {
2277
2302
  return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: displayValue });
2278
2303
  }
2279
- return jsxRuntimeExports.jsxs("div", { className: "relative", children: [typeof isLoading === "boolean" && isLoading && jsxRuntimeExports.jsx("div", { className: "absolute top-9 right-4", children: jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2", style: { borderColor: "var(--ds-gray-900)" } }) }), jsxRuntimeExports.jsxs("div", { className: "my-2 flex flex-col gap-0", children: [jsxRuntimeExports.jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), jsxRuntimeExports.jsx("span", { className: "text-xs", style: { color: "var(--ds-gray-1000)" }, children: displayValue })] }, attribute)] });
2304
+ return jsxRuntimeExports.jsxs("div", { className: "relative", children: [typeof isLoading === "boolean" && isLoading && jsxRuntimeExports.jsx("div", { className: "absolute top-9 right-4", children: jsxRuntimeExports.jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2", style: { borderColor: "var(--ds-gray-900)" } }) }), jsxRuntimeExports.jsxs("div", { className: "my-2 flex flex-col gap-0", children: [jsxRuntimeExports.jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), jsxRuntimeExports.jsx("span", { className: "text-label-12", style: { color: "var(--ds-gray-1000)" }, children: displayValue })] }, attribute)] });
2280
2305
  };
2281
2306
  const AttributePanel = ({ data, moduleSpecifier, moduleSourceUrl, isLoading, error, expiredAt, onStreamClick, onRunClick, onDecrypt, isDecrypting = false, resource }) => {
2282
2307
  const displayData = reactExports.useMemo(() => {
@@ -2435,7 +2460,7 @@ function hasOnlyExpiredFields(data, eventType) {
2435
2460
  }
2436
2461
  function EventDataBlock({ eventType, data }) {
2437
2462
  if (isExpiredMarker(data) || hasOnlyExpiredFields(data, eventType)) {
2438
- return jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-xs", style: {
2463
+ return jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-label-12", style: {
2439
2464
  borderColor: "var(--ds-gray-300)",
2440
2465
  backgroundColor: "var(--ds-gray-100)",
2441
2466
  color: "var(--ds-gray-700)"
@@ -2778,69 +2803,14 @@ function EntityDetailPanel({ run, onStreamClick, onRunClick, fetchSpanDetail, on
2778
2803
  return jsxRuntimeExports.jsxs("div", { className: "flex h-full flex-col", children: [jsxRuntimeExports.jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting, hasEncryptedData } : void 0, children: jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto px-4 pb-8", children: [hasPendingActions && jsxRuntimeExports.jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
2779
2804
  borderColor: "var(--ds-gray-300)",
2780
2805
  backgroundColor: "var(--ds-gray-100)"
2781
- }, children: [jsxRuntimeExports.jsx("p", { className: "mb-2 px-1 text-[13px] font-medium uppercase tracking-wide", style: { color: "var(--ds-gray-700)" }, children: "Actions" }), jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [resource === "sleep" && canWakeUp && jsxRuntimeExports.jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx("flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium", "disabled:opacity-50 disabled:cursor-not-allowed transition-colors", stoppingSleep ? "opacity-50 cursor-not-allowed" : "cursor-pointer"), style: {
2806
+ }, children: [jsxRuntimeExports.jsx("p", { className: "mb-2 px-1 text-label-13 font-medium uppercase tracking-wide", style: { color: "var(--ds-gray-700)" }, children: "Actions" }), jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [resource === "sleep" && canWakeUp && jsxRuntimeExports.jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx("flex items-center justify-center gap-2 rounded-md px-3 py-2 text-button-14", "disabled:opacity-50 disabled:cursor-not-allowed transition-colors", stoppingSleep ? "opacity-50 cursor-not-allowed" : "cursor-pointer"), style: {
2782
2807
  background: "var(--ds-amber-200)",
2783
2808
  color: "var(--ds-amber-900)"
2784
- }, children: [jsxRuntimeExports.jsx(Zap, { className: "h-4 w-4" }), stoppingSleep ? "Waking up..." : "Wake Up Sleep"] }), resource === "hook" && canResolveHook && jsxRuntimeExports.jsxs("button", { type: "button", onClick: () => setShowResolveHookModal(true), disabled: resolvingHook, className: clsx("flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium", "disabled:opacity-50 disabled:cursor-not-allowed transition-colors", resolvingHook ? "opacity-50 cursor-not-allowed" : "cursor-pointer"), style: {
2809
+ }, children: [jsxRuntimeExports.jsx(Zap, { className: "h-4 w-4" }), stoppingSleep ? "Waking up..." : "Wake Up Sleep"] }), resource === "hook" && canResolveHook && jsxRuntimeExports.jsxs("button", { type: "button", onClick: () => setShowResolveHookModal(true), disabled: resolvingHook, className: clsx("flex items-center justify-center gap-2 rounded-md px-3 py-2 text-button-14", "disabled:opacity-50 disabled:cursor-not-allowed transition-colors", resolvingHook ? "opacity-50 cursor-not-allowed" : "cursor-pointer"), style: {
2785
2810
  background: "var(--ds-gray-1000)",
2786
2811
  color: "var(--ds-background-100)"
2787
2812
  }, children: [jsxRuntimeExports.jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] })] })] }), jsxRuntimeExports.jsx(AttributePanel, { data: displayData, moduleSpecifier, moduleSourceUrl, expiredAt: run.expiredAt, isLoading: loading, error: error ?? void 0, onStreamClick, onRunClick, onDecrypt, isDecrypting, resource }), rawEvents && jsxRuntimeExports.jsx(EventsList, { events: rawEvents, onLoadEventData, onStreamClick, onRunClick, encryptionKey, showSeparateEventOccurrenceTimestamps })] }) }), jsxRuntimeExports.jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] });
2788
2813
  }
2789
- function useIntersectionObserver(elementRef, { threshold = 0, rootRef, rootMargin = "0%", freezeOnceVisible = false } = {}) {
2790
- const [entry, setEntry] = reactExports.useState();
2791
- const frozen = (entry == null ? void 0 : entry.isIntersecting) && freezeOnceVisible;
2792
- reactExports.useEffect(() => {
2793
- const node = elementRef == null ? void 0 : elementRef.current;
2794
- const hasIOSupport = !!window.IntersectionObserver;
2795
- if (!hasIOSupport || frozen || !node)
2796
- return;
2797
- const updateEntry = ([entry2]) => {
2798
- setEntry(entry2);
2799
- };
2800
- const observer = new IntersectionObserver(updateEntry, {
2801
- threshold,
2802
- root: (rootRef == null ? void 0 : rootRef.current) ?? null,
2803
- rootMargin
2804
- });
2805
- observer.observe(node);
2806
- return () => observer.disconnect();
2807
- }, [elementRef, threshold, rootRef, rootMargin, frozen]);
2808
- return entry;
2809
- }
2810
- function useLoadMoreOnScroll(loadMore, { hasMore, isLoadingMore, rootRef, rootMargin = "400px" }) {
2811
- const sentinelRef = reactExports.useRef(null);
2812
- const entry = useIntersectionObserver(sentinelRef, { rootRef, rootMargin });
2813
- const loadMoreRef = reactExports.useRef(loadMore);
2814
- reactExports.useEffect(() => {
2815
- loadMoreRef.current = loadMore;
2816
- }, [loadMore]);
2817
- reactExports.useEffect(() => {
2818
- if ((entry == null ? void 0 : entry.isIntersecting) && hasMore && !isLoadingMore) {
2819
- loadMoreRef.current();
2820
- }
2821
- }, [entry == null ? void 0 : entry.isIntersecting, hasMore, isLoadingMore]);
2822
- return sentinelRef;
2823
- }
2824
- const kbdVariants = cva("inline-flex items-center justify-center rounded px-1 text-center font-sans", {
2825
- variants: {
2826
- variant: {
2827
- subtle: "bg-background-100/20",
2828
- outline: "border border-gray-alpha-400 bg-background-100 font-medium text-gray-900"
2829
- },
2830
- size: {
2831
- default: "h-5 min-w-5 text-xs leading-none",
2832
- compact: "h-4 min-h-4 min-w-4 text-[11px] leading-none",
2833
- search: "h-5 min-h-5 min-w-5 text-[13px] leading-[1.7em]"
2834
- }
2835
- },
2836
- defaultVariants: {
2837
- variant: "subtle",
2838
- size: "default"
2839
- }
2840
- });
2841
- function Kbd({ children, className, variant, size, ...props }) {
2842
- return jsxRuntimeExports.jsx("kbd", { className: cn(kbdVariants({ variant, size, className })), ...props, children });
2843
- }
2844
2814
  const PANEL_MIN_WIDTH = 280;
2845
2815
  const PANEL_HARD_MAX_WIDTH = 1300;
2846
2816
  const PANEL_DEFAULT_WIDTH = 360;
@@ -3218,7 +3188,7 @@ function TraceShortcutHelper({ hasMultipleSpans, reducedMotion }) {
3218
3188
  }
3219
3189
  setVisible(false);
3220
3190
  };
3221
- return jsxRuntimeExports.jsxs("div", { className: "group pointer-events-auto hidden h-8 w-fit items-center gap-1 text-xs 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" }) })] });
3191
+ 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" }) })] });
3222
3192
  }
3223
3193
  const MIN_VIEWPORT_MS = 1e-3;
3224
3194
  const ZOOM_DEBOUNCE_MS = 150;
@@ -3274,10 +3244,10 @@ function useAnimatedViewport(initial) {
3274
3244
  reactExports.useEffect(() => cancel, [cancel]);
3275
3245
  return { viewport, setViewport, animateTo };
3276
3246
  }
3277
- function NewTraceViewer$1({ trace, onLoadMore, hasMore, isLoadingMore }) {
3278
- return jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 300, children: jsxRuntimeExports.jsx(ActiveSpanProvider, { spans: trace.spans, children: jsxRuntimeExports.jsx(NewTraceViewerContent, { trace, onLoadMore, hasMore, isLoadingMore }) }) });
3247
+ function TraceViewer$1({ trace, onLoadMore, hasMore, isLoadingMore }) {
3248
+ return jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 300, children: jsxRuntimeExports.jsx(ActiveSpanProvider, { spans: trace.spans, children: jsxRuntimeExports.jsx(TraceViewerContent, { trace, onLoadMore, hasMore, isLoadingMore }) }) });
3279
3249
  }
3280
- function NewTraceViewerContent({ trace, onLoadMore, hasMore, isLoadingMore }) {
3250
+ function TraceViewerContent({ trace, onLoadMore, hasMore, isLoadingMore }) {
3281
3251
  const { activeSpanId, setActiveSpan, clearActiveSpan } = useActiveSpan();
3282
3252
  const reducedMotion = useReducedMotion();
3283
3253
  const [searchQuery, setSearchQuery] = reactExports.useState("");
@@ -3514,9 +3484,9 @@ function NewTraceViewerContent({ trace, onLoadMore, hasMore, isLoadingMore }) {
3514
3484
  e.stopPropagation();
3515
3485
  setSearchQuery("");
3516
3486
  }
3517
- }, placeholder: "Search spans...", "aria-label": "Search spans", className: "flex-1 min-w-0 bg-transparent text-sm text-gray-1000 placeholder:text-gray-800 outline-none" }), searchQuery && jsxRuntimeExports.jsx("button", { type: "button", "aria-label": "Clear search", onClick: () => setSearchQuery(""), className: "-mr-2 hidden h-full max-w-full shrink-0 cursor-pointer items-center rounded-r-md border-0 bg-transparent px-2.5 font-inherit text-base text-gray-900 no-underline transition-colors duration-150 ease-in hover:text-gray-1000 focus-visible:-outline-offset-1 focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] min-[961px]:flex", children: jsxRuntimeExports.jsx(Kbd, { 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-sm 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 })] });
3487
+ }, 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 })] });
3518
3488
  }
3519
- const NewTraceViewer = ({ run, events, sidebarData, onLoadMore, hasMore, isLoadingMore, loading = false }) => {
3489
+ const TraceViewer = ({ run, events, sidebarData, onLoadMore, hasMore, isLoadingMore, loading = false }) => {
3520
3490
  const trace = reactExports.useMemo(() => {
3521
3491
  if (!(run == null ? void 0 : run.runId)) {
3522
3492
  return void 0;
@@ -3526,7 +3496,7 @@ const NewTraceViewer = ({ run, events, sidebarData, onLoadMore, hasMore, isLoadi
3526
3496
  if (!trace || loading && events.length === 0) {
3527
3497
  return jsxRuntimeExports.jsx(TraceViewerSkeleton, {});
3528
3498
  }
3529
- return jsxRuntimeExports.jsx(SidebarDataProvider, { value: sidebarData, children: jsxRuntimeExports.jsx("div", { className: "relative w-full h-full flex", children: jsxRuntimeExports.jsx(NewTraceViewer$1, { trace, onLoadMore, hasMore, isLoadingMore }) }) });
3499
+ return jsxRuntimeExports.jsx(SidebarDataProvider, { value: sidebarData, children: jsxRuntimeExports.jsx("div", { className: "relative w-full h-full flex", children: jsxRuntimeExports.jsx(TraceViewer$1, { trace, onLoadMore, hasMore, isLoadingMore }) }) });
3530
3500
  };
3531
3501
  async function fetchResourceWithCorrelationId(env, resource, resourceId, options = {}) {
3532
3502
  const resolveData = options.resolveData ?? "all";
@@ -3835,7 +3805,7 @@ async function readStream(_env, streamId, runId, signal, cursor) {
3835
3805
  if (cursor) {
3836
3806
  params.set("cursor", cursor);
3837
3807
  }
3838
- const url = `/api/stream/${encodeURIComponent(streamId)}?${params.toString()}`;
3808
+ const url = `${apiBase()}/api/stream/${encodeURIComponent(streamId)}?${params.toString()}`;
3839
3809
  const response = await fetch(url, { signal });
3840
3810
  if (!response.ok) {
3841
3811
  const errorData = await response.json().catch(() => null);
@@ -5174,6 +5144,9 @@ function detectEncoding(data) {
5174
5144
  function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5175
5145
  const [chunks, setChunks] = reactExports.useState([]);
5176
5146
  const [isLive, setIsLive] = reactExports.useState(false);
5147
+ const [isInitialLoading, setIsInitialLoading] = reactExports.useState(
5148
+ Boolean(streamId && runId)
5149
+ );
5177
5150
  const [error, setError] = reactExports.useState(null);
5178
5151
  const abortControllerRef = reactExports.useRef(null);
5179
5152
  const chunkIdRef = reactExports.useRef(0);
@@ -5220,6 +5193,8 @@ function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5220
5193
  reactExports.useEffect(() => {
5221
5194
  setChunks([]);
5222
5195
  setError(null);
5196
+ setIsLive(false);
5197
+ setIsInitialLoading(Boolean(streamId && runId));
5223
5198
  chunkIdRef.current = 0;
5224
5199
  frameCountRef.current = 0;
5225
5200
  serverCursorRef.current = null;
@@ -5228,13 +5203,12 @@ function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5228
5203
  pollTimerRef.current = null;
5229
5204
  }
5230
5205
  if (!streamId || !runId) {
5231
- setIsLive(false);
5206
+ setIsInitialLoading(false);
5232
5207
  return;
5233
5208
  }
5234
5209
  let mounted = true;
5235
5210
  const abortController = new AbortController();
5236
5211
  abortControllerRef.current = abortController;
5237
- setIsLive(true);
5238
5212
  const revivers = getWebRevivers();
5239
5213
  const parseLegacyLine = (line) => {
5240
5214
  const chunkId = chunkIdRef.current++;
@@ -5363,6 +5337,7 @@ function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5363
5337
  if (mounted) {
5364
5338
  setError("This stream is encrypted. Click Decrypt to view.");
5365
5339
  setIsLive(false);
5340
+ setIsInitialLoading(false);
5366
5341
  }
5367
5342
  return;
5368
5343
  }
@@ -5370,11 +5345,13 @@ function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5370
5345
  serverCursorRef.current = result.cursor;
5371
5346
  if (!mounted || abortController.signal.aborted) return;
5372
5347
  setChunks(initialChunks);
5348
+ setIsInitialLoading(false);
5373
5349
  if (result.done) {
5374
5350
  setIsLive(false);
5375
5351
  return;
5376
5352
  }
5377
5353
  if (isRunActive(runStatusRef.current)) {
5354
+ setIsLive(true);
5378
5355
  const poll = async () => {
5379
5356
  if (!mounted || abortController.signal.aborted) return;
5380
5357
  try {
@@ -5412,6 +5389,7 @@ function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5412
5389
  if (mounted) {
5413
5390
  setError(err instanceof Error ? err.message : String(err));
5414
5391
  setIsLive(false);
5392
+ setIsInitialLoading(false);
5415
5393
  }
5416
5394
  }
5417
5395
  };
@@ -5432,7 +5410,7 @@ function useStreamReader(env, streamId, runId, encryptionKey, runStatus) {
5432
5410
  setIsLive(false);
5433
5411
  }
5434
5412
  }, [runStatus]);
5435
- return { chunks, isLive, error };
5413
+ return { chunks, isLive, isInitialLoading, error };
5436
5414
  }
5437
5415
  function LiveStatus({ hasError, errorMessage }) {
5438
5416
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
@@ -5643,6 +5621,7 @@ function RunDetailView({
5643
5621
  const {
5644
5622
  chunks: streamChunks,
5645
5623
  isLive: streamIsLive,
5624
+ isInitialLoading: streamIsInitialLoading,
5646
5625
  error: streamError
5647
5626
  } = useStreamReader(env, selectedStreamId, runId, encryptionKey, run.status);
5648
5627
  const handleCancelClick = () => {
@@ -5827,7 +5806,7 @@ function RunDetailView({
5827
5806
  ] })
5828
5807
  ] }),
5829
5808
  /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "trace", className: "mt-0 flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { title: "Failed to load trace viewer", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-full -mx-6 bg-background-100 border-t border-gray-alpha-400 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
5830
- NewTraceViewer,
5809
+ TraceViewer,
5831
5810
  {
5832
5811
  run,
5833
5812
  events: allEvents ?? [],
@@ -5857,115 +5836,54 @@ function RunDetailView({
5857
5836
  onExactIdSearch: searchByExactId
5858
5837
  }
5859
5838
  ) }) }) }),
5860
- /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "streams", className: "mt-0 flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { title: "Failed to load stream data", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex gap-4", children: [
5861
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
5862
- "div",
5863
- {
5864
- className: "w-64 flex-shrink-0 border rounded-lg overflow-hidden",
5865
- style: {
5866
- borderColor: "var(--ds-gray-300)",
5867
- backgroundColor: "var(--ds-background-100)"
5868
- },
5869
- children: [
5870
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
5871
- "div",
5872
- {
5873
- className: "px-3 py-2 border-b text-xs font-medium",
5874
- style: {
5875
- borderColor: "var(--ds-gray-300)",
5876
- color: "var(--ds-gray-900)"
5877
- },
5878
- children: [
5879
- "Streams (",
5880
- streams.length,
5881
- ")"
5882
- ]
5883
- }
5884
- ),
5885
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-auto max-h-[calc(100vh-400px)]", children: streamsLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "h-4 w-4 animate-spin text-muted-foreground" }) }) : streamsError ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 text-xs text-destructive", children: streamsError.message }) : streams.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(
5886
- "div",
5887
- {
5888
- className: "p-4 text-xs",
5889
- style: { color: "var(--ds-gray-600)" },
5890
- children: "No streams found for this run"
5891
- }
5892
- ) : streams.map((streamId) => /* @__PURE__ */ jsxRuntimeExports.jsx(
5893
- "button",
5894
- {
5895
- type: "button",
5896
- onClick: () => setSelectedStreamId(streamId),
5897
- className: "w-full text-left px-3 py-2 text-xs font-mono truncate hover:bg-accent transition-colors",
5898
- style: {
5899
- backgroundColor: selectedStreamId === streamId ? "var(--ds-gray-200)" : "transparent",
5900
- color: "var(--ds-gray-1000)"
5901
- },
5902
- title: streamId,
5903
- children: streamId
5904
- },
5905
- streamId
5906
- )) })
5907
- ]
5908
- }
5909
- ),
5910
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: selectedStreamId ? (streamError == null ? void 0 : streamError.includes("encrypted")) && !encryptionKey ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
5911
- "div",
5912
- {
5913
- className: "h-full flex flex-col items-center justify-center gap-3 rounded-lg border p-4",
5914
- style: {
5915
- borderColor: "var(--ds-gray-300)",
5916
- backgroundColor: "var(--ds-gray-100)"
5839
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "streams", className: "mt-0 flex-1 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { title: "Failed to load stream data", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative -mx-6 flex h-full min-h-0 overflow-hidden border-t border-gray-alpha-400 bg-background-100", children: [
5840
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex w-[340px] shrink-0 flex-col border-r border-gray-alpha-400 bg-background-100", children: [
5841
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5842
+ "div",
5843
+ {
5844
+ "aria-hidden": "true",
5845
+ className: "h-10 min-h-10 border-b border-gray-alpha-400"
5846
+ }
5847
+ ),
5848
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-0 flex-1 divide-y divide-gray-400 overflow-y-auto", children: streamsLoading ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col divide-y divide-gray-400", children: [
5849
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-10 items-center pl-4 pr-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton$1, { className: "h-3.5 w-24" }) }),
5850
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-10 items-center pl-4 pr-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton$1, { className: "h-3.5 w-32" }) }),
5851
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-10 items-center pl-4 pr-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton$1, { className: "h-3.5 w-20" }) })
5852
+ ] }) : streamsError ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 py-2 text-label-12 text-red-900", children: streamsError.message }) : streams.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-10 items-center px-4 text-label-12 text-gray-900", children: "No streams found for this run" }) : streams.map((streamId) => /* @__PURE__ */ jsxRuntimeExports.jsx(
5853
+ "button",
5854
+ {
5855
+ type: "button",
5856
+ onClick: () => setSelectedStreamId(streamId),
5857
+ className: `flex h-10 w-full min-w-0 items-center truncate pl-4 pr-2 text-left text-label-14 transition-colors ${selectedStreamId === streamId ? "bg-gray-100 text-gray-1000 hover:bg-gray-200 active:bg-gray-200" : "bg-transparent text-gray-900 hover:bg-gray-100 hover:text-gray-1000 focus-visible:bg-gray-100 focus-visible:text-gray-1000"}`,
5858
+ title: streamId,
5859
+ children: streamId
5917
5860
  },
5918
- children: [
5919
- /* @__PURE__ */ jsxRuntimeExports.jsx(
5920
- Lock,
5921
- {
5922
- className: "h-6 w-6",
5923
- style: { color: "var(--ds-gray-700)" }
5924
- }
5925
- ),
5926
- /* @__PURE__ */ jsxRuntimeExports.jsx(
5927
- "div",
5928
- {
5929
- className: "text-sm",
5930
- style: { color: "var(--ds-gray-900)" },
5931
- children: "This stream is encrypted."
5932
- }
5933
- ),
5934
- /* @__PURE__ */ jsxRuntimeExports.jsx(
5935
- DecryptButton,
5936
- {
5937
- onClick: handleDecrypt,
5938
- loading: isDecrypting
5939
- }
5940
- )
5941
- ]
5942
- }
5943
- ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
5861
+ streamId
5862
+ )) })
5863
+ ] }),
5864
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden bg-background-100", children: streamsLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(StreamViewerSkeleton, {}) }) : selectedStreamId ? (streamError == null ? void 0 : streamError.includes("encrypted")) && !encryptionKey ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [
5865
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Lock, { className: "h-8 w-8 text-gray-700" }),
5866
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1", children: [
5867
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-label-14 font-medium text-gray-1000", children: "Encrypted Stream" }),
5868
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-label-12 text-gray-900", children: "Decrypt this stream to view its chunks." })
5869
+ ] }),
5870
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
5871
+ DecryptButton,
5872
+ {
5873
+ onClick: handleDecrypt,
5874
+ loading: isDecrypting
5875
+ }
5876
+ )
5877
+ ] }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
5944
5878
  StreamViewer,
5945
5879
  {
5946
5880
  streamId: selectedStreamId,
5947
5881
  chunks: streamChunks,
5948
5882
  isLive: streamIsLive,
5883
+ isLoading: streamIsInitialLoading,
5949
5884
  error: (streamError == null ? void 0 : streamError.includes("encrypted")) ? null : streamError
5950
5885
  }
5951
- ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
5952
- "div",
5953
- {
5954
- className: "h-full flex items-center justify-center rounded-lg border",
5955
- style: {
5956
- borderColor: "var(--ds-gray-300)",
5957
- backgroundColor: "var(--ds-gray-100)"
5958
- },
5959
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
5960
- "div",
5961
- {
5962
- className: "text-sm",
5963
- style: { color: "var(--ds-gray-600)" },
5964
- children: streams.length > 0 ? "Select a stream to view its data" : "No streams available"
5965
- }
5966
- )
5967
- }
5968
- ) })
5886
+ ) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-label-14 text-gray-600", children: streams.length > 0 ? "Select a stream to view its data" : "No streams available" }) }) })
5969
5887
  ] }) }) }),
5970
5888
  false
5971
5889
  ]