@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.
- package/README.md +1 -0
- package/build/client/assets/app-BqwHo5GR.css +1 -0
- package/build/client/assets/{arrow-up-right-DDNPFYmg.js → arrow-up-right-Ccx_FPfU.js} +1 -1
- package/build/client/assets/{highlighted-body-B3W2YXNL-CRgNr0YA.js → highlighted-body-B3W2YXNL-DMawUm9n.js} +1 -1
- package/build/client/assets/{home-BqvW8ODs.js → home-B6O_uPSC.js} +3 -2
- package/build/client/assets/loader-circle-BrO0dxVn.js +12 -0
- package/build/client/assets/manifest-7e8691f4.js +1 -0
- package/build/client/assets/{mermaid-3ZIDBTTL-CMP9Tato.js → mermaid-3ZIDBTTL-D20ZkB54.js} +665 -1682
- package/build/client/assets/mermaid-3ZIDBTTL-D8CjRQta.css +1 -0
- package/build/client/assets/root-CxZylOIf.css +1 -0
- package/build/client/assets/{root-2ub-CsWS.js → root-dudvdmvf.js} +6 -2
- package/build/client/assets/{run-detail-B1PK-m7y.js → run-detail-DtCCxxv2.js} +277 -359
- package/build/client/assets/{workflow-graph-viewer-DOLwtzSv.js → workflow-graph-viewer-B01nH75E.js} +65 -86
- package/build/client/assets/{zstd-browser-decoder-BAY5XtBl.js → zstd-browser-decoder-Dw3HhTgO.js} +1 -1
- package/build/server/assets/{server-build-C11Xqmwk.js → app-Bd12Opaf.js} +96186 -87164
- package/build/server/assets/{highlighted-body-B3W2YXNL-DE3KXslx.js → highlighted-body-B3W2YXNL-CFlRme7u.js} +3 -4
- package/build/server/assets/{index-M4Ai7vsa.js → index-B6SJpqpo.js} +65 -63
- package/build/server/assets/{mermaid-3ZIDBTTL-DjL45D7x.js → mermaid-3ZIDBTTL-CQsU8DGa.js} +4 -5
- package/build/server/assets/{token-Ulh8Tdgw.js → token-XJr1pjmC.js} +1 -2
- package/build/server/assets/{token-util-CiVcDWD3.js → token-util-BJaMxWWP.js} +1 -2
- package/build/server/assets/{zstd-browser-decoder-tQARkzJ5.js → zstd-browser-decoder-DL7Vc3pV.js} +4 -5
- package/build/server/index.js +41 -2
- package/handler.d.ts +22 -0
- package/handler.js +186 -0
- package/package.json +20 -8
- package/registry.d.ts +29 -0
- package/registry.js +89 -0
- package/build/client/assets/manifest-7f03c136.js +0 -1
- package/build/client/assets/mermaid-3ZIDBTTL-DDxQhcP4.css +0 -1
- package/build/client/assets/root-15oK726f.css +0 -1
- package/build/client/assets/server-build-DblSGQ6A.css +0 -1
- package/build/client/assets/worker-CqHKTA7D.js +0 -115
- 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
|
|
3
|
-
import { c as createLucideIcon,
|
|
4
|
-
import { A as ArrowUpRight } from "./arrow-up-right-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
return
|
|
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
|
-
|
|
1365
|
-
const
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
];
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
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
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
return
|
|
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
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
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
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
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
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
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
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
2007
|
-
const
|
|
2008
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
3278
|
-
return jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 300, children: jsxRuntimeExports.jsx(ActiveSpanProvider, { spans: trace.spans, children: jsxRuntimeExports.jsx(
|
|
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
|
|
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-
|
|
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
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
5861
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
5862
|
-
|
|
5863
|
-
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
5867
|
-
|
|
5868
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
|
|
5872
|
-
|
|
5873
|
-
|
|
5874
|
-
|
|
5875
|
-
|
|
5876
|
-
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
|
|
5880
|
-
|
|
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
|
-
|
|
5919
|
-
|
|
5920
|
-
|
|
5921
|
-
|
|
5922
|
-
|
|
5923
|
-
|
|
5924
|
-
|
|
5925
|
-
|
|
5926
|
-
|
|
5927
|
-
|
|
5928
|
-
|
|
5929
|
-
|
|
5930
|
-
|
|
5931
|
-
|
|
5932
|
-
|
|
5933
|
-
|
|
5934
|
-
|
|
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
|
]
|