@workflow/web-shared 5.0.0-beta.1 → 5.0.0-beta.2
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 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/event-list-view.d.ts +3 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +53 -53
- package/dist/components/event-list-view.js.map +1 -1
- package/dist/components/hook-actions.js.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/run-trace-view.d.ts +2 -1
- package/dist/components/run-trace-view.d.ts.map +1 -1
- package/dist/components/run-trace-view.js +2 -2
- package/dist/components/run-trace-view.js.map +1 -1
- package/dist/components/sidebar/attribute-panel.d.ts +7 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +36 -26
- package/dist/components/sidebar/attribute-panel.js.map +1 -1
- package/dist/components/sidebar/conversation-view.js.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js.map +1 -1
- package/dist/components/sidebar/detail-card.js.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.d.ts +5 -1
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +18 -16
- package/dist/components/sidebar/entity-detail-panel.js.map +1 -1
- package/dist/components/sidebar/events-list.js.map +1 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +1 -1
- package/dist/components/stream-viewer.js.map +1 -1
- package/dist/components/trace-viewer/components/map.js.map +1 -1
- package/dist/components/trace-viewer/components/markers.js.map +1 -1
- package/dist/components/trace-viewer/components/node.js.map +1 -1
- package/dist/components/trace-viewer/components/search-input.js.map +1 -1
- package/dist/components/trace-viewer/components/search.js.map +1 -1
- package/dist/components/trace-viewer/components/span-content.js.map +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +1 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +1 -1
- package/dist/components/trace-viewer/components/ui.js.map +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +1 -1
- package/dist/components/trace-viewer/context.js.map +1 -1
- package/dist/components/trace-viewer/index.js.map +1 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +1 -1
- package/dist/components/trace-viewer/types.js.map +1 -1
- package/dist/components/trace-viewer/util/constants.js.map +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +1 -1
- package/dist/components/trace-viewer/util/timing.js.map +1 -1
- package/dist/components/trace-viewer/util/tree.js.map +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +1 -1
- package/dist/components/trace-viewer/worker.js.map +1 -1
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/data-inspector.d.ts +17 -1
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +116 -21
- package/dist/components/ui/data-inspector.js.map +1 -1
- package/dist/components/ui/decrypt-button.js.map +1 -1
- package/dist/components/ui/error-card.js.map +1 -1
- package/dist/components/ui/error-stack-block.js.map +1 -1
- package/dist/components/ui/inspector-theme.js.map +1 -1
- package/dist/components/ui/load-more-button.js.map +1 -1
- package/dist/components/ui/menu-dropdown.js.map +1 -1
- package/dist/components/ui/skeleton.js.map +1 -1
- package/dist/components/ui/spinner.js.map +1 -1
- package/dist/components/ui/timestamp-tooltip.js.map +1 -1
- package/dist/components/workflow-trace-view.d.ts +5 -1
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +7 -2
- package/dist/components/workflow-trace-view.js.map +1 -1
- package/dist/components/workflow-traces/event-colors.js.map +1 -1
- package/dist/components/workflow-traces/trace-colors.js.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +1 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +1 -1
- package/dist/hooks/use-dark-mode.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/event-analysis.js.map +1 -1
- package/dist/lib/event-materialization.js.map +1 -1
- package/dist/lib/hydration.d.ts +8 -1
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +32 -2
- package/dist/lib/hydration.js.map +1 -1
- package/dist/lib/toast.js.map +1 -1
- package/dist/lib/trace-builder.js.map +1 -1
- package/dist/lib/utils.js.map +1 -1
- package/package.json +3 -3
- package/src/components/event-list-view.tsx +181 -173
- package/src/components/index.ts +6 -1
- package/src/components/run-trace-view.tsx +3 -0
- package/src/components/sidebar/attribute-panel.tsx +160 -109
- package/src/components/sidebar/entity-detail-panel.tsx +111 -96
- package/src/components/ui/data-inspector.tsx +205 -31
- package/src/components/workflow-trace-view.tsx +14 -0
- package/src/components/workflow-traces/trace-span-construction.ts +1 -1
- package/src/index.ts +1 -0
- package/src/lib/hydration.ts +37 -0
|
@@ -8,22 +8,31 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
8
8
|
* and expand behavior.
|
|
9
9
|
*/
|
|
10
10
|
import { Lock } from 'lucide-react';
|
|
11
|
-
import { createContext, useContext, useEffect, useRef, useState } from 'react';
|
|
11
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
12
12
|
import { ObjectInspector, ObjectLabel, ObjectName, ObjectRootLabel, ObjectValue, } from 'react-inspector';
|
|
13
13
|
import { useDarkMode } from '../../hooks/use-dark-mode';
|
|
14
14
|
import { ENCRYPTED_DISPLAY_NAME } from '../../lib/hydration';
|
|
15
15
|
import { inspectorThemeDark, inspectorThemeExtendedDark, inspectorThemeExtendedLight, inspectorThemeLight, } from './inspector-theme';
|
|
16
|
+
import { Spinner } from './spinner';
|
|
16
17
|
// ---------------------------------------------------------------------------
|
|
17
18
|
// StreamRef / ClassInstanceRef type detection
|
|
18
19
|
// (inline to avoid circular deps with hydration module)
|
|
19
20
|
// ---------------------------------------------------------------------------
|
|
20
21
|
const STREAM_REF_TYPE = '__workflow_stream_ref__';
|
|
21
22
|
const CLASS_INSTANCE_REF_TYPE = '__workflow_class_instance_ref__';
|
|
23
|
+
const RUN_REF_TYPE = '__workflow_run_ref__';
|
|
22
24
|
function isStreamRef(value) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
if (value === null || typeof value !== 'object')
|
|
26
|
+
return false;
|
|
27
|
+
// Check both enumerable and non-enumerable __type (opaque refs use non-enumerable)
|
|
28
|
+
const desc = Object.getOwnPropertyDescriptor(value, '__type');
|
|
29
|
+
return desc?.value === STREAM_REF_TYPE;
|
|
30
|
+
}
|
|
31
|
+
function isRunRef(value) {
|
|
32
|
+
if (value === null || typeof value !== 'object')
|
|
33
|
+
return false;
|
|
34
|
+
const desc = Object.getOwnPropertyDescriptor(value, '__type');
|
|
35
|
+
return desc?.value === RUN_REF_TYPE;
|
|
27
36
|
}
|
|
28
37
|
function isClassInstanceRef(value) {
|
|
29
38
|
return (value !== null &&
|
|
@@ -39,13 +48,54 @@ function isClassInstanceRef(value) {
|
|
|
39
48
|
* Exported so that parent components (e.g., AttributePanel) can provide the handler.
|
|
40
49
|
*/
|
|
41
50
|
export const StreamClickContext = createContext(undefined);
|
|
51
|
+
export const DecryptClickContext = createContext(undefined);
|
|
52
|
+
export const RunClickContext = createContext(undefined);
|
|
53
|
+
function EncryptedInlineLabel() {
|
|
54
|
+
const ctx = useContext(DecryptClickContext);
|
|
55
|
+
if (ctx) {
|
|
56
|
+
return (_jsxs("button", { type: "button", className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[11px] cursor-pointer", style: {
|
|
57
|
+
backgroundColor: 'var(--ds-gray-100)',
|
|
58
|
+
color: 'var(--ds-gray-700)',
|
|
59
|
+
border: '1px solid var(--ds-gray-400)',
|
|
60
|
+
fontStyle: 'italic',
|
|
61
|
+
opacity: ctx.isDecrypting ? 0.6 : 1,
|
|
62
|
+
}, disabled: ctx.isDecrypting, onClick: (e) => {
|
|
63
|
+
e.stopPropagation();
|
|
64
|
+
ctx.onDecrypt();
|
|
65
|
+
}, title: "Click to decrypt", children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 12 })) : (_jsx(Lock, { className: "h-3 w-3", style: { display: 'inline', flexShrink: 0 } })), _jsx("span", { children: ctx.isDecrypting ? 'Decrypting…' : 'Decrypt' })] }));
|
|
66
|
+
}
|
|
67
|
+
return (_jsxs("span", { style: { color: 'var(--ds-gray-600)', fontStyle: 'italic' }, children: [_jsx(Lock, { className: "h-3 w-3", style: {
|
|
68
|
+
display: 'inline',
|
|
69
|
+
verticalAlign: 'middle',
|
|
70
|
+
marginRight: '3px',
|
|
71
|
+
marginTop: '-1px',
|
|
72
|
+
} }), "Encrypted"] }));
|
|
73
|
+
}
|
|
42
74
|
function StreamRefInline({ streamRef }) {
|
|
43
75
|
const onStreamClick = useContext(StreamClickContext);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
76
|
+
const [hovered, setHovered] = useState(false);
|
|
77
|
+
return (_jsxs("button", { type: "button", className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors", style: {
|
|
78
|
+
backgroundColor: hovered ? 'var(--ds-blue-200)' : 'var(--ds-blue-100)',
|
|
79
|
+
color: 'var(--ds-blue-900)',
|
|
47
80
|
border: '1px solid var(--ds-blue-300)',
|
|
48
|
-
},
|
|
81
|
+
}, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), onClick: (e) => {
|
|
82
|
+
e.stopPropagation();
|
|
83
|
+
onStreamClick?.(streamRef.streamId);
|
|
84
|
+
}, title: `View stream: ${streamRef.streamId}`, children: [_jsx("span", { children: "\uD83D\uDCE1" }), _jsx("span", { children: streamRef.streamId })] }));
|
|
85
|
+
}
|
|
86
|
+
function RunRefInline({ runRef }) {
|
|
87
|
+
const onRunClick = useContext(RunClickContext);
|
|
88
|
+
const [hovered, setHovered] = useState(false);
|
|
89
|
+
return (_jsx("button", { type: "button", className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors", style: {
|
|
90
|
+
backgroundColor: hovered
|
|
91
|
+
? 'var(--ds-purple-200)'
|
|
92
|
+
: 'var(--ds-purple-100)',
|
|
93
|
+
color: 'var(--ds-purple-900)',
|
|
94
|
+
border: '1px solid var(--ds-purple-300)',
|
|
95
|
+
}, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), onClick: (e) => {
|
|
96
|
+
e.stopPropagation();
|
|
97
|
+
onRunClick?.(runRef.runId);
|
|
98
|
+
}, title: `View run: ${runRef.runId}`, children: _jsx("span", { children: runRef.runId }) }));
|
|
49
99
|
}
|
|
50
100
|
// ---------------------------------------------------------------------------
|
|
51
101
|
// Extended theme context (for colors react-inspector doesn't support natively)
|
|
@@ -67,16 +117,11 @@ const ExtendedThemeContext = createContext(inspectorThemeExtendedLight);
|
|
|
67
117
|
*/
|
|
68
118
|
function NodeRenderer({ depth, name, data, isNonenumerable, }) {
|
|
69
119
|
const extendedTheme = useContext(ExtendedThemeContext);
|
|
70
|
-
// Encrypted marker → flat label with Lock icon,
|
|
120
|
+
// Encrypted marker → flat label with Lock icon, clickable when onDecrypt is available
|
|
71
121
|
if (data !== null &&
|
|
72
122
|
typeof data === 'object' &&
|
|
73
123
|
data.constructor?.name === ENCRYPTED_DISPLAY_NAME) {
|
|
74
|
-
const label = (
|
|
75
|
-
display: 'inline',
|
|
76
|
-
verticalAlign: 'middle',
|
|
77
|
-
marginRight: '3px',
|
|
78
|
-
marginTop: '-1px',
|
|
79
|
-
} }), "Encrypted"] }));
|
|
124
|
+
const label = _jsx(EncryptedInlineLabel, {});
|
|
80
125
|
if (depth === 0) {
|
|
81
126
|
return label;
|
|
82
127
|
}
|
|
@@ -86,6 +131,10 @@ function NodeRenderer({ depth, name, data, isNonenumerable, }) {
|
|
|
86
131
|
if (isStreamRef(data)) {
|
|
87
132
|
return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx(StreamRefInline, { streamRef: data })] }));
|
|
88
133
|
}
|
|
134
|
+
// RunRef → inline clickable badge linking to the target run
|
|
135
|
+
if (isRunRef(data)) {
|
|
136
|
+
return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx(RunRefInline, { runRef: data })] }));
|
|
137
|
+
}
|
|
89
138
|
// ClassInstanceRef → show className as type, data as the inspectable value
|
|
90
139
|
if (isClassInstanceRef(data)) {
|
|
91
140
|
if (depth === 0) {
|
|
@@ -108,8 +157,48 @@ function NodeRenderer({ depth, name, data, isNonenumerable, }) {
|
|
|
108
157
|
}
|
|
109
158
|
return (_jsx(ObjectLabel, { name: name, data: data, isNonenumerable: isNonenumerable }));
|
|
110
159
|
}
|
|
111
|
-
|
|
112
|
-
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Public component
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
/**
|
|
164
|
+
* Create a non-expandable wrapper that carries ref data as non-enumerable
|
|
165
|
+
* properties. ObjectInspector won't render children for objects with no
|
|
166
|
+
* enumerable keys, but our NodeRenderer can still detect them.
|
|
167
|
+
*/
|
|
168
|
+
function makeOpaqueRef(ref) {
|
|
169
|
+
const opaque = Object.create(null);
|
|
170
|
+
for (const [key, value] of Object.entries(ref)) {
|
|
171
|
+
Object.defineProperty(opaque, key, { value, enumerable: false });
|
|
172
|
+
}
|
|
173
|
+
return opaque;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Recursively walk data and replace RunRef/StreamRef objects with
|
|
177
|
+
* non-expandable versions so ObjectInspector doesn't show their internals.
|
|
178
|
+
* Only recurses into plain objects and arrays to avoid stripping class
|
|
179
|
+
* instances (Date, Error, Map, Set, URL, Headers, etc.) that have their
|
|
180
|
+
* own rendering in NodeRenderer.
|
|
181
|
+
*/
|
|
182
|
+
function collapseRefs(data) {
|
|
183
|
+
if (data === null || typeof data !== 'object')
|
|
184
|
+
return data;
|
|
185
|
+
if (isRunRef(data) || isStreamRef(data))
|
|
186
|
+
return makeOpaqueRef(data);
|
|
187
|
+
if (Array.isArray(data))
|
|
188
|
+
return data.map(collapseRefs);
|
|
189
|
+
// Only recurse into plain objects — leave class instances untouched
|
|
190
|
+
const proto = Object.getPrototypeOf(data);
|
|
191
|
+
if (proto !== Object.prototype && proto !== null)
|
|
192
|
+
return data;
|
|
193
|
+
const result = {};
|
|
194
|
+
for (const [key, value] of Object.entries(data)) {
|
|
195
|
+
result[key] = collapseRefs(value);
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
export function DataInspector({ data, expandLevel = 2, name, onStreamClick, onRunClick, onDecrypt, isDecrypting = false, }) {
|
|
200
|
+
const collapsedData = useMemo(() => collapseRefs(data), [data]);
|
|
201
|
+
const stableData = useStableInspectorData(collapsedData);
|
|
113
202
|
const [initialExpandLevel, setInitialExpandLevel] = useState(expandLevel);
|
|
114
203
|
const isDark = useDarkMode();
|
|
115
204
|
const extendedTheme = isDark
|
|
@@ -124,11 +213,17 @@ export function DataInspector({ data, expandLevel = 2, name, onStreamClick, }) {
|
|
|
124
213
|
// @ts-expect-error react-inspector accepts theme objects at runtime despite
|
|
125
214
|
// types declaring string only — see https://github.com/storybookjs/react-inspector/blob/main/README.md#theme
|
|
126
215
|
theme: isDark ? inspectorThemeDark : inspectorThemeLight, expandLevel: initialExpandLevel, nodeRenderer: NodeRenderer }) }));
|
|
127
|
-
|
|
216
|
+
let wrapped = content;
|
|
128
217
|
if (onStreamClick) {
|
|
129
|
-
|
|
218
|
+
wrapped = (_jsx(StreamClickContext.Provider, { value: onStreamClick, children: wrapped }));
|
|
219
|
+
}
|
|
220
|
+
if (onRunClick) {
|
|
221
|
+
wrapped = (_jsx(RunClickContext.Provider, { value: onRunClick, children: wrapped }));
|
|
222
|
+
}
|
|
223
|
+
if (onDecrypt) {
|
|
224
|
+
wrapped = (_jsx(DecryptClickContext.Provider, { value: { onDecrypt, isDecrypting }, children: wrapped }));
|
|
130
225
|
}
|
|
131
|
-
return
|
|
226
|
+
return wrapped;
|
|
132
227
|
}
|
|
133
228
|
function useStableInspectorData(next) {
|
|
134
229
|
const previousRef = useRef(next);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-inspector.js","sourceRoot":"","sources":["../../../src/components/ui/data-inspector.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-inspector.js","sourceRoot":"","sources":["../../../src/components/ui/data-inspector.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\n/**\n * Reusable data inspector component built on react-inspector.\n *\n * All data rendering in the o11y UI should use this component to ensure\n * consistent theming, custom type handling (StreamRef, ClassInstanceRef),\n * and expand behavior.\n */\n\nimport { Lock } from 'lucide-react';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n ObjectInspector,\n ObjectLabel,\n ObjectName,\n ObjectRootLabel,\n ObjectValue,\n} from 'react-inspector';\nimport { useDarkMode } from '../../hooks/use-dark-mode';\nimport { ENCRYPTED_DISPLAY_NAME } from '../../lib/hydration';\nimport {\n type InspectorThemeExtended,\n inspectorThemeDark,\n inspectorThemeExtendedDark,\n inspectorThemeExtendedLight,\n inspectorThemeLight,\n} from './inspector-theme';\nimport { Spinner } from './spinner';\n\n// ---------------------------------------------------------------------------\n// StreamRef / ClassInstanceRef type detection\n// (inline to avoid circular deps with hydration module)\n// ---------------------------------------------------------------------------\n\nconst STREAM_REF_TYPE = '__workflow_stream_ref__';\nconst CLASS_INSTANCE_REF_TYPE = '__workflow_class_instance_ref__';\nconst RUN_REF_TYPE = '__workflow_run_ref__';\n\ninterface StreamRef {\n __type: typeof STREAM_REF_TYPE;\n streamId: string;\n}\n\ninterface RunRef {\n __type: typeof RUN_REF_TYPE;\n runId: string;\n}\n\nfunction isStreamRef(value: unknown): value is StreamRef {\n if (value === null || typeof value !== 'object') return false;\n // Check both enumerable and non-enumerable __type (opaque refs use non-enumerable)\n const desc = Object.getOwnPropertyDescriptor(value, '__type');\n return desc?.value === STREAM_REF_TYPE;\n}\n\nfunction isRunRef(value: unknown): value is RunRef {\n if (value === null || typeof value !== 'object') return false;\n const desc = Object.getOwnPropertyDescriptor(value, '__type');\n return desc?.value === RUN_REF_TYPE;\n}\n\nfunction isClassInstanceRef(value: unknown): value is {\n __type: string;\n className: string;\n classId: string;\n data: unknown;\n} {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__type' in value &&\n (value as Record<string, unknown>).__type === CLASS_INSTANCE_REF_TYPE\n );\n}\n\n// ---------------------------------------------------------------------------\n// Stream click context (passed through from the panel)\n// ---------------------------------------------------------------------------\n\n/**\n * Context for passing stream click handlers down to DataInspector instances.\n * Exported so that parent components (e.g., AttributePanel) can provide the handler.\n */\nexport const StreamClickContext = createContext<\n ((streamId: string) => void) | undefined\n>(undefined);\n\n/**\n * Context for passing a decrypt handler down to DataInspector instances.\n * When provided, encrypted markers become clickable buttons that trigger decryption.\n */\nexport type DecryptClickContextValue = {\n onDecrypt: () => void;\n isDecrypting: boolean;\n};\n\nexport const DecryptClickContext = createContext<\n DecryptClickContextValue | undefined\n>(undefined);\n\nexport const RunClickContext = createContext<\n ((runId: string) => void) | undefined\n>(undefined);\n\nfunction EncryptedInlineLabel() {\n const ctx = useContext(DecryptClickContext);\n if (ctx) {\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[11px] cursor-pointer\"\n style={{\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n border: '1px solid var(--ds-gray-400)',\n fontStyle: 'italic',\n opacity: ctx.isDecrypting ? 0.6 : 1,\n }}\n disabled={ctx.isDecrypting}\n onClick={(e) => {\n e.stopPropagation();\n ctx.onDecrypt();\n }}\n title=\"Click to decrypt\"\n >\n {ctx.isDecrypting ? (\n <Spinner size={12} />\n ) : (\n <Lock\n className=\"h-3 w-3\"\n style={{ display: 'inline', flexShrink: 0 }}\n />\n )}\n <span>{ctx.isDecrypting ? 'Decrypting…' : 'Decrypt'}</span>\n </button>\n );\n }\n return (\n <span style={{ color: 'var(--ds-gray-600)', fontStyle: 'italic' }}>\n <Lock\n className=\"h-3 w-3\"\n style={{\n display: 'inline',\n verticalAlign: 'middle',\n marginRight: '3px',\n marginTop: '-1px',\n }}\n />\n Encrypted\n </span>\n );\n}\nfunction StreamRefInline({ streamRef }: { streamRef: StreamRef }) {\n const onStreamClick = useContext(StreamClickContext);\n const [hovered, setHovered] = useState(false);\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors\"\n style={{\n backgroundColor: hovered ? 'var(--ds-blue-200)' : 'var(--ds-blue-100)',\n color: 'var(--ds-blue-900)',\n border: '1px solid var(--ds-blue-300)',\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={(e) => {\n e.stopPropagation();\n onStreamClick?.(streamRef.streamId);\n }}\n title={`View stream: ${streamRef.streamId}`}\n >\n <span>📡</span>\n <span>{streamRef.streamId}</span>\n </button>\n );\n}\n\nfunction RunRefInline({ runRef }: { runRef: RunRef }) {\n const onRunClick = useContext(RunClickContext);\n const [hovered, setHovered] = useState(false);\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors\"\n style={{\n backgroundColor: hovered\n ? 'var(--ds-purple-200)'\n : 'var(--ds-purple-100)',\n color: 'var(--ds-purple-900)',\n border: '1px solid var(--ds-purple-300)',\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={(e) => {\n e.stopPropagation();\n onRunClick?.(runRef.runId);\n }}\n title={`View run: ${runRef.runId}`}\n >\n <span>{runRef.runId}</span>\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Extended theme context (for colors react-inspector doesn't support natively)\n// ---------------------------------------------------------------------------\n\nconst ExtendedThemeContext = createContext<InspectorThemeExtended>(\n inspectorThemeExtendedLight\n);\n\n// ---------------------------------------------------------------------------\n// Custom nodeRenderer\n// ---------------------------------------------------------------------------\n\n/**\n * Extends the default react-inspector nodeRenderer with special handling\n * for ClassInstanceRef, StreamRef, and Date types.\n *\n * react-inspector renders Date instances as unstyled plain text (no theme\n * key exists for them), so we intercept here and apply the magenta color\n * from our extended theme — matching Node.js util.inspect()'s date style.\n *\n * Default nodeRenderer reference:\n * https://github.com/storybookjs/react-inspector/blob/main/README.md#noderenderer\n */\nfunction NodeRenderer({\n depth,\n name,\n data,\n isNonenumerable,\n}: {\n depth: number;\n name?: string;\n data: unknown;\n isNonenumerable?: boolean;\n expanded?: boolean;\n}) {\n const extendedTheme = useContext(ExtendedThemeContext);\n\n // Encrypted marker → flat label with Lock icon, clickable when onDecrypt is available\n if (\n data !== null &&\n typeof data === 'object' &&\n data.constructor?.name === ENCRYPTED_DISPLAY_NAME\n ) {\n const label = <EncryptedInlineLabel />;\n if (depth === 0) {\n return label;\n }\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n {label}\n </span>\n );\n }\n\n // StreamRef → inline clickable badge\n if (isStreamRef(data)) {\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <StreamRefInline streamRef={data} />\n </span>\n );\n }\n\n // RunRef → inline clickable badge linking to the target run\n if (isRunRef(data)) {\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <RunRefInline runRef={data} />\n </span>\n );\n }\n\n // ClassInstanceRef → show className as type, data as the inspectable value\n if (isClassInstanceRef(data)) {\n if (depth === 0) {\n return <ObjectRootLabel name={data.className} data={data.data} />;\n }\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <span style={{ fontStyle: 'italic' }}>{data.className} </span>\n <ObjectValue object={data.data} />\n </span>\n );\n }\n\n // Date → magenta color (Node.js: 'date' → 'magenta')\n // react-inspector has no OBJECT_VALUE_DATE_COLOR theme key, so we handle it here.\n if (data instanceof Date) {\n const dateStr = data.toISOString();\n if (depth === 0) {\n return (\n <span style={{ color: extendedTheme.OBJECT_VALUE_DATE_COLOR }}>\n {dateStr}\n </span>\n );\n }\n return (\n <span>\n {name != null && <ObjectName name={name} />}\n {name != null && <span>: </span>}\n <span style={{ color: extendedTheme.OBJECT_VALUE_DATE_COLOR }}>\n {dateStr}\n </span>\n </span>\n );\n }\n\n // Default rendering (same as react-inspector's built-in)\n if (depth === 0) {\n return <ObjectRootLabel name={name} data={data} />;\n }\n return (\n <ObjectLabel name={name} data={data} isNonenumerable={isNonenumerable} />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\n/**\n * Create a non-expandable wrapper that carries ref data as non-enumerable\n * properties. ObjectInspector won't render children for objects with no\n * enumerable keys, but our NodeRenderer can still detect them.\n */\nfunction makeOpaqueRef(ref: Record<string, unknown>): unknown {\n const opaque = Object.create(null);\n for (const [key, value] of Object.entries(ref)) {\n Object.defineProperty(opaque, key, { value, enumerable: false });\n }\n return opaque;\n}\n\n/**\n * Recursively walk data and replace RunRef/StreamRef objects with\n * non-expandable versions so ObjectInspector doesn't show their internals.\n * Only recurses into plain objects and arrays to avoid stripping class\n * instances (Date, Error, Map, Set, URL, Headers, etc.) that have their\n * own rendering in NodeRenderer.\n */\nfunction collapseRefs(data: unknown): unknown {\n if (data === null || typeof data !== 'object') return data;\n if (isRunRef(data) || isStreamRef(data))\n return makeOpaqueRef(data as unknown as Record<string, unknown>);\n if (Array.isArray(data)) return data.map(collapseRefs);\n // Only recurse into plain objects — leave class instances untouched\n const proto = Object.getPrototypeOf(data);\n if (proto !== Object.prototype && proto !== null) return data;\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n result[key] = collapseRefs(value);\n }\n return result;\n}\n\nexport interface DataInspectorProps {\n /** The data to inspect */\n data: unknown;\n /** Initial expand depth (default: 2) */\n expandLevel?: number;\n /** Optional name for the root node */\n name?: string;\n /** Callback when a stream reference is clicked */\n onStreamClick?: (streamId: string) => void;\n /** Callback when a run reference is clicked */\n onRunClick?: (runId: string) => void;\n /** Callback when an encrypted marker is clicked (triggers decryption) */\n onDecrypt?: () => void;\n /** Whether decryption is currently in progress */\n isDecrypting?: boolean;\n}\n\nexport function DataInspector({\n data,\n expandLevel = 2,\n name,\n onStreamClick,\n onRunClick,\n onDecrypt,\n isDecrypting = false,\n}: DataInspectorProps) {\n const collapsedData = useMemo(() => collapseRefs(data), [data]);\n const stableData = useStableInspectorData(collapsedData);\n const [initialExpandLevel, setInitialExpandLevel] = useState(expandLevel);\n const isDark = useDarkMode();\n const extendedTheme = isDark\n ? inspectorThemeExtendedDark\n : inspectorThemeExtendedLight;\n\n useEffect(() => {\n // react-inspector reapplies expandLevel on every data change, which can\n // reopen paths the user manually collapsed. Apply it only on mount.\n setInitialExpandLevel(0);\n }, []);\n\n const content = (\n <ExtendedThemeContext.Provider value={extendedTheme}>\n <ObjectInspector\n data={stableData}\n name={name}\n // @ts-expect-error react-inspector accepts theme objects at runtime despite\n // types declaring string only — see https://github.com/storybookjs/react-inspector/blob/main/README.md#theme\n theme={isDark ? inspectorThemeDark : inspectorThemeLight}\n expandLevel={initialExpandLevel}\n nodeRenderer={NodeRenderer}\n />\n </ExtendedThemeContext.Provider>\n );\n\n let wrapped = content;\n\n if (onStreamClick) {\n wrapped = (\n <StreamClickContext.Provider value={onStreamClick}>\n {wrapped}\n </StreamClickContext.Provider>\n );\n }\n if (onRunClick) {\n wrapped = (\n <RunClickContext.Provider value={onRunClick}>\n {wrapped}\n </RunClickContext.Provider>\n );\n }\n if (onDecrypt) {\n wrapped = (\n <DecryptClickContext.Provider value={{ onDecrypt, isDecrypting }}>\n {wrapped}\n </DecryptClickContext.Provider>\n );\n }\n\n return wrapped;\n}\n\nfunction useStableInspectorData<T>(next: T): T {\n const previousRef = useRef<T>(next);\n if (!isDeepEqual(previousRef.current, next)) {\n previousRef.current = next;\n }\n return previousRef.current;\n}\n\nfunction isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isDeepEqual(a: unknown, b: unknown, seen = new WeakMap()): boolean {\n if (Object.is(a, b)) return true;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a.entries()) {\n if (!b.has(key) || !isDeepEqual(value, b.get(key), seen)) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a.values()) {\n if (!b.has(value)) return false;\n }\n return true;\n }\n\n if (!isObjectLike(a) || !isObjectLike(b)) {\n return false;\n }\n\n if (seen.get(a) === b) return true;\n seen.set(a, b);\n\n const aIsArray = Array.isArray(a);\n const bIsArray = Array.isArray(b);\n if (aIsArray !== bIsArray) return false;\n\n if (aIsArray && bIsArray) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n if (!isDeepEqual(a[i], b[i], seen)) return false;\n }\n return true;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!Object.hasOwn(b, key)) return false;\n if (!isDeepEqual(a[key], b[key], seen)) return false;\n }\n\n return true;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decrypt-button.js","sourceRoot":"","sources":["../../../src/components/ui/decrypt-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,2lBAA2lB,CAAC;AAW3mB;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,OAAO,GACY;IACnB,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EACxC,QAAQ,EAAE,SAAS,IAAI,OAAO,EAC9B,SAAS,EAAE,kBAAkB,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,EAAE,aAE/E,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,CACtB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,yBAAyB,GAAG,IAChC,CACP,CAAC,CAAC,CAAC,CACF,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,0BAA0B,GAAG,IACjC,CACP,EACA,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IACvD,IACR,CACJ,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"decrypt-button.js","sourceRoot":"","sources":["../../../src/components/ui/decrypt-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,2lBAA2lB,CAAC;AAW3mB;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,OAAO,GACY;IACnB,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EACxC,QAAQ,EAAE,SAAS,IAAI,OAAO,EAC9B,SAAS,EAAE,kBAAkB,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,EAAE,aAE/E,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,CACtB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CACd,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,yBAAyB,GAAG,IAChC,CACP,CAAC,CAAC,CAAC,CACF,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,0BAA0B,GAAG,IACjC,CACP,EACA,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IACvD,IACR,CACJ,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { Spinner } from './spinner';\n\nconst STYLES = `.wf-decrypt-btn{appearance:none;-webkit-appearance:none;border:none;display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 12px;border-radius:6px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;white-space:nowrap;gap:6px;transition:background 150ms}.wf-decrypt-idle{color:var(--ds-gray-1000);background:var(--ds-background-100);box-shadow:0 0 0 1px var(--ds-gray-400)}.wf-decrypt-idle:hover{background:var(--ds-gray-alpha-200)}.wf-decrypt-done{color:var(--ds-green-900);background:var(--ds-green-100);box-shadow:0 0 0 1px var(--ds-green-400);cursor:default}`;\n\ninterface DecryptButtonProps {\n /** Whether an encryption key has been obtained (decryption is active). */\n decrypted?: boolean;\n /** Whether the key is currently being fetched. */\n loading?: boolean;\n /** Called when the user clicks to initiate decryption. */\n onClick?: () => void;\n}\n\n/**\n * Decrypt/Decrypted button using Geist secondary style.\n * Three states: idle (secondary gray), decrypting (spinner), decrypted (green success).\n */\nexport function DecryptButton({\n decrypted = false,\n loading = false,\n onClick,\n}: DecryptButtonProps) {\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n <button\n type=\"button\"\n onClick={decrypted ? undefined : onClick}\n disabled={decrypted || loading}\n className={`wf-decrypt-btn ${decrypted ? 'wf-decrypt-done' : 'wf-decrypt-idle'}`}\n >\n {loading ? (\n <Spinner size={14} />\n ) : decrypted ? (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 9.9-1\" />\n </svg>\n ) : (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n )}\n {loading ? 'Decrypting…' : decrypted ? 'Decrypted' : 'Decrypt'}\n </button>\n </>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-card.js","sourceRoot":"","sources":["../../../src/components/ui/error-card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAWrC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,SAAS,EACT,OAAO,GAAG,eAAe,GACV;IACf,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,eACE,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,SAAS,CACV,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAE1C,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,EACzC,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,aAErC,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,WAAW,IAAC,SAAS,EAAC,kBAAkB,GAAG,EAC5C,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,IAChD,EACN,eAAK,SAAS,EAAC,sCAAsC,aACnD,eAAM,SAAS,EAAC,SAAS,sCAA6B,EACtD,KAAC,WAAW,IACV,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,UAAU,IAAI,YAAY,CAC3B,GACD,IACE,IACC,EAER,UAAU,IAAI,OAAO,IAAI,CACxB,cACE,SAAS,EAAC,WAAW,EACrB,KAAK,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,YAEnD,cACE,SAAS,EAAC,qFAAqF,EAC/F,KAAK,EAAE;4BACL,UAAU,EAAE,mBAAmB;4BAC/B,KAAK,EAAE,mBAAmB;yBAC3B,YAEA,OAAO,GACJ,GACF,CACP,IACG,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-card.js","sourceRoot":"","sources":["../../../src/components/ui/error-card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAWrC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,SAAS,EACT,OAAO,GAAG,eAAe,GACV;IACf,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,eACE,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,SAAS,CACV,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAE1C,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,EACzC,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,aAErC,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,WAAW,IAAC,SAAS,EAAC,kBAAkB,GAAG,EAC5C,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,IAChD,EACN,eAAK,SAAS,EAAC,sCAAsC,aACnD,eAAM,SAAS,EAAC,SAAS,sCAA6B,EACtD,KAAC,WAAW,IACV,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,UAAU,IAAI,YAAY,CAC3B,GACD,IACE,IACC,EAER,UAAU,IAAI,OAAO,IAAI,CACxB,cACE,SAAS,EAAC,WAAW,EACrB,KAAK,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,YAEnD,cACE,SAAS,EAAC,qFAAqF,EAC/F,KAAK,EAAE;4BACL,UAAU,EAAE,mBAAmB;4BAC/B,KAAK,EAAE,mBAAmB;yBAC3B,YAEA,OAAO,GACJ,GACF,CACP,IACG,GACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { AlertCircle, ChevronDown } from 'lucide-react';\nimport { useState } from 'react';\nimport { cn } from '../../lib/utils';\n\ninterface ErrorCardProps {\n /** Title shown in the header */\n title: string;\n /** Error message or details to show when expanded */\n details?: string;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * A collapsible error card that shows a title with an error icon,\n * and expands to reveal details when clicked.\n */\nexport function ErrorCard({\n title,\n className,\n details = 'Unknown error',\n}: ErrorCardProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n return (\n <div className=\"flex justify-center w-full\">\n <div\n className={cn(\n 'rounded-lg border border-red-400 w-full max-w-[800px]',\n className\n )}\n style={{ background: 'var(--ds-red-100)' }}\n >\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full px-4 py-3 flex items-center justify-between gap-2 text-left transition-colors\"\n style={{ color: 'var(--ds-red-900)' }}\n >\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n <span className=\"font-medium text-sm\">{title}</span>\n </div>\n <div className=\"flex items-center gap-1.5 opacity-70\">\n <span className=\"text-xs\">Click to show details</span>\n <ChevronDown\n className={cn(\n 'h-4 w-4 transition-transform duration-200',\n isExpanded && 'rotate-180'\n )}\n />\n </div>\n </button>\n\n {isExpanded && details && (\n <div\n className=\"px-4 pb-3\"\n style={{ borderTop: '1px solid var(--ds-red-400)' }}\n >\n <pre\n className=\"mt-3 p-3 rounded-md text-xs font-mono whitespace-pre-wrap break-words overflow-auto\"\n style={{\n background: 'var(--ds-red-200)',\n color: 'var(--ds-red-900)',\n }}\n >\n {details}\n </pre>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-stack-block.js","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,OAAO,CACL,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,IAAI,KAAK;QAChB,OAAQ,KAAiC,CAAC,KAAK,KAAK,QAAQ,CAC7D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,GAGN;IACC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5D,OAAO,CACL,eACE,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAE;YACL,WAAW,EAAE,mBAAmB;YAChC,UAAU,EAAE,mBAAmB;SAChC,aAED,iBACE,IAAI,EAAC,QAAQ,gBACF,YAAY,EACvB,KAAK,EAAC,MAAM,EACZ,SAAS,EAAC,gMAAgM,EAC1M,KAAK,EAAE;oBACL,WAAW,EAAE,mBAAmB;oBAChC,UAAU,EAAE,mBAAmB;oBAC/B,KAAK,EAAE,mBAAmB;iBAC3B,EACD,OAAO,EAAE,GAAG,EAAE;oBACZ,SAAS,CAAC,SAAS;yBAChB,SAAS,CAAC,QAAQ,CAAC;yBACnB,IAAI,CAAC,GAAG,EAAE;wBACT,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;oBACvC,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE;wBACV,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;gBACP,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,GACX,EAER,OAAO,IAAI,CACV,eACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE;oBACL,KAAK,EAAE,mBAAmB;oBAC1B,YAAY,EAAE,6BAA6B;iBAC5C,aAED,KAAC,WAAW,IAAC,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,GAAI,EACrE,YAAG,SAAS,EAAC,uCAAuC,YAAE,OAAO,GAAK,IAC9D,CACP,EACD,cACE,SAAS,EAAC,iFAAiF,EAC3F,KAAK,EAAE;oBACL,KAAK,EAAE,mBAAmB;oBAC1B,UAAU,EAAE,mBAAmB;iBAChC,YAEA,KAAK,GACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-stack-block.js","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,OAAO,CACL,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,IAAI,KAAK;QAChB,OAAQ,KAAiC,CAAC,KAAK,KAAK,QAAQ,CAC7D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,GAGN;IACC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5D,OAAO,CACL,eACE,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAE;YACL,WAAW,EAAE,mBAAmB;YAChC,UAAU,EAAE,mBAAmB;SAChC,aAED,iBACE,IAAI,EAAC,QAAQ,gBACF,YAAY,EACvB,KAAK,EAAC,MAAM,EACZ,SAAS,EAAC,gMAAgM,EAC1M,KAAK,EAAE;oBACL,WAAW,EAAE,mBAAmB;oBAChC,UAAU,EAAE,mBAAmB;oBAC/B,KAAK,EAAE,mBAAmB;iBAC3B,EACD,OAAO,EAAE,GAAG,EAAE;oBACZ,SAAS,CAAC,SAAS;yBAChB,SAAS,CAAC,QAAQ,CAAC;yBACnB,IAAI,CAAC,GAAG,EAAE;wBACT,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;oBACvC,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE;wBACV,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;gBACP,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,GACX,EAER,OAAO,IAAI,CACV,eACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE;oBACL,KAAK,EAAE,mBAAmB;oBAC1B,YAAY,EAAE,6BAA6B;iBAC5C,aAED,KAAC,WAAW,IAAC,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,GAAI,EACrE,YAAG,SAAS,EAAC,uCAAuC,YAAE,OAAO,GAAK,IAC9D,CACP,EACD,cACE,SAAS,EAAC,iFAAiF,EAC3F,KAAK,EAAE;oBACL,KAAK,EAAE,mBAAmB;oBAC1B,UAAU,EAAE,mBAAmB;iBAChC,YAEA,KAAK,GACF,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { AlertCircle, Copy } from 'lucide-react';\nimport { useToast } from '../../lib/toast';\n\n/**\n * Check whether `value` looks like a structured error object with a `stack`\n * field that we can render as pre-formatted text.\n */\nexport function isStructuredErrorWithStack(\n value: unknown\n): value is Record<string, unknown> & { stack: string } {\n return (\n value != null &&\n typeof value === 'object' &&\n 'stack' in value &&\n typeof (value as Record<string, unknown>).stack === 'string'\n );\n}\n\n/**\n * Renders an error with a `stack` field as a visually distinct error block.\n * Shows the error message with an alert icon at the top, separated from\n * the stack trace below.\n */\nexport function ErrorStackBlock({\n value,\n}: {\n value: Record<string, unknown> & { stack: string };\n}) {\n const toast = useToast();\n const stack = value.stack;\n const message = typeof value.message === 'string' ? value.message : undefined;\n const copyText = message ? `${message}\\n\\n${stack}` : stack;\n\n return (\n <div\n className=\"relative overflow-hidden rounded-md border\"\n style={{\n borderColor: 'var(--ds-red-400)',\n background: 'var(--ds-red-100)',\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Copy error\"\n title=\"Copy\"\n className=\"!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border transition-transform transition-colors duration-100 hover:!bg-[var(--ds-red-200)] active:!scale-95\"\n style={{\n borderColor: 'var(--ds-red-400)',\n background: 'var(--ds-red-100)',\n color: 'var(--ds-red-900)',\n }}\n onClick={() => {\n navigator.clipboard\n .writeText(copyText)\n .then(() => {\n toast.success('Copied to clipboard');\n })\n .catch(() => {\n toast.error('Failed to copy');\n });\n }}\n >\n <Copy size={12} />\n </button>\n\n {message && (\n <div\n className=\"flex items-start gap-2 px-3 py-2.5 pr-10\"\n style={{\n color: 'var(--ds-red-900)',\n borderBottom: '1px solid var(--ds-red-400)',\n }}\n >\n <AlertCircle className=\"h-4 w-4 shrink-0\" style={{ marginTop: 1 }} />\n <p className=\"text-xs font-semibold m-0 break-words\">{message}</p>\n </div>\n )}\n <pre\n className=\"px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0\"\n style={{\n color: 'var(--ds-red-900)',\n background: 'var(--ds-red-200)',\n }}\n >\n {stack}\n </pre>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector-theme.js","sourceRoot":"","sources":["../../../src/components/ui/inspector-theme.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"inspector-theme.js","sourceRoot":"","sources":["../../../src/components/ui/inspector-theme.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared theme configuration for react-inspector's ObjectInspector.\n *\n * Color choices are inspired by Node.js `util.inspect()` ANSI stylizing:\n * - property names: unstyled (default foreground — dark text on light, light text on dark)\n * - strings / symbols: green\n * - numbers / booleans / bigint: yellow\n * - null: bold (foreground)\n * - undefined: grey\n * - regexp: red\n * - functions (special): cyan\n * - date: magenta\n *\n * See: https://github.com/nodejs/node/blob/main/lib/internal/util/inspect.js\n */\n\n// ---------------------------------------------------------------------------\n// Extended color tokens not supported by react-inspector's built-in theme\n// system, applied via our custom nodeRenderer in data-inspector.tsx.\n// ---------------------------------------------------------------------------\n\nexport interface InspectorThemeExtended {\n /** Color for Date values (Node: 'magenta') */\n OBJECT_VALUE_DATE_COLOR: string;\n}\n\nexport const inspectorThemeExtendedLight: InspectorThemeExtended = {\n OBJECT_VALUE_DATE_COLOR: '#a21caf', // fuchsia-700\n};\n\nexport const inspectorThemeExtendedDark: InspectorThemeExtended = {\n OBJECT_VALUE_DATE_COLOR: '#e879f9', // fuchsia-400\n};\n\n// ---------------------------------------------------------------------------\n// Shared structural values (same in both themes)\n// ---------------------------------------------------------------------------\n\nconst shared = {\n BASE_FONT_SIZE: '11px',\n BASE_LINE_HEIGHT: 1.4,\n BASE_BACKGROUND_COLOR: 'transparent',\n OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES: 10,\n OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES: 5,\n HTML_TAGNAME_TEXT_TRANSFORM: 'lowercase' as const,\n ARROW_MARGIN_RIGHT: 3,\n ARROW_FONT_SIZE: 12,\n TREENODE_FONT_FAMILY: 'var(--font-mono)',\n TREENODE_FONT_SIZE: '11px',\n TREENODE_LINE_HEIGHT: 1.4,\n TREENODE_PADDING_LEFT: 12,\n TABLE_DATA_BACKGROUND_IMAGE: 'none',\n TABLE_DATA_BACKGROUND_SIZE: '0',\n};\n\n// ---------------------------------------------------------------------------\n// Light theme\n// ---------------------------------------------------------------------------\n\nexport const inspectorThemeLight = {\n ...shared,\n\n // Base text\n BASE_COLOR: 'var(--ds-gray-1000)',\n\n // Property names — unstyled, same as base foreground (Node: no style)\n OBJECT_NAME_COLOR: 'var(--ds-gray-900)',\n\n // Strings & symbols — green (Node: 'green')\n OBJECT_VALUE_STRING_COLOR: '#16a34a', // green-600\n OBJECT_VALUE_SYMBOL_COLOR: '#16a34a',\n\n // Numbers & booleans — yellow/amber (Node: 'yellow')\n OBJECT_VALUE_NUMBER_COLOR: '#b45309', // amber-700 (readable on white)\n OBJECT_VALUE_BOOLEAN_COLOR: '#b45309',\n\n // null — bold foreground (Node: 'bold')\n OBJECT_VALUE_NULL_COLOR: 'var(--ds-gray-900)',\n\n // undefined — grey (Node: 'grey')\n OBJECT_VALUE_UNDEFINED_COLOR: 'var(--ds-gray-500)',\n\n // RegExp — red (Node regexp base uses green/red/yellow palette)\n OBJECT_VALUE_REGEXP_COLOR: '#dc2626', // red-600\n\n // Functions — cyan (Node: 'special' → 'cyan')\n OBJECT_VALUE_FUNCTION_PREFIX_COLOR: '#0891b2', // cyan-600\n\n // HTML (less relevant for data inspection, but reasonable defaults)\n HTML_TAG_COLOR: 'var(--ds-gray-500)',\n HTML_TAGNAME_COLOR: '#0891b2',\n HTML_ATTRIBUTE_NAME_COLOR: '#b45309',\n HTML_ATTRIBUTE_VALUE_COLOR: '#16a34a',\n HTML_COMMENT_COLOR: 'var(--ds-gray-400)',\n HTML_DOCTYPE_COLOR: 'var(--ds-gray-400)',\n\n // Structural\n ARROW_COLOR: 'var(--ds-gray-500)',\n TABLE_BORDER_COLOR: 'var(--ds-gray-300)',\n TABLE_TH_BACKGROUND_COLOR: 'var(--ds-gray-100)',\n TABLE_TH_HOVER_COLOR: 'var(--ds-gray-200)',\n TABLE_SORT_ICON_COLOR: 'var(--ds-gray-500)',\n};\n\n// ---------------------------------------------------------------------------\n// Dark theme\n// ---------------------------------------------------------------------------\n\nexport const inspectorThemeDark = {\n ...shared,\n\n // Base text\n BASE_COLOR: 'var(--ds-gray-1000)',\n\n // Property names — white/light foreground (Node: unstyled = white in dark terminal)\n OBJECT_NAME_COLOR: 'var(--ds-gray-900)',\n\n // Strings & symbols — green (Node: 'green')\n OBJECT_VALUE_STRING_COLOR: '#4ade80', // green-400\n OBJECT_VALUE_SYMBOL_COLOR: '#4ade80',\n\n // Numbers & booleans — yellow (Node: 'yellow')\n OBJECT_VALUE_NUMBER_COLOR: '#facc15', // yellow-400\n OBJECT_VALUE_BOOLEAN_COLOR: '#facc15',\n\n // null — bold foreground / white (Node: 'bold')\n OBJECT_VALUE_NULL_COLOR: 'var(--ds-gray-1000)',\n\n // undefined — grey (Node: 'grey')\n OBJECT_VALUE_UNDEFINED_COLOR: 'var(--ds-gray-500)',\n\n // RegExp — red (Node regexp palette)\n OBJECT_VALUE_REGEXP_COLOR: '#f87171', // red-400\n\n // Functions — cyan (Node: 'special' → 'cyan')\n OBJECT_VALUE_FUNCTION_PREFIX_COLOR: '#22d3ee', // cyan-400\n\n // HTML\n HTML_TAG_COLOR: 'var(--ds-gray-500)',\n HTML_TAGNAME_COLOR: '#22d3ee',\n HTML_ATTRIBUTE_NAME_COLOR: '#facc15',\n HTML_ATTRIBUTE_VALUE_COLOR: '#4ade80',\n HTML_COMMENT_COLOR: 'var(--ds-gray-500)',\n HTML_DOCTYPE_COLOR: 'var(--ds-gray-500)',\n\n // Structural\n ARROW_COLOR: 'var(--ds-gray-500)',\n TABLE_BORDER_COLOR: 'var(--ds-gray-300)',\n TABLE_TH_BACKGROUND_COLOR: 'var(--ds-gray-100)',\n TABLE_TH_HOVER_COLOR: 'var(--ds-gray-200)',\n TABLE_SORT_ICON_COLOR: 'var(--ds-gray-500)',\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-more-button.js","sourceRoot":"","sources":["../../../src/components/ui/load-more-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,qjBAAqjB,CAAC;AASrkB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,GAAG,KAAK,EACf,OAAO,EACP,KAAK,GAAG,WAAW,EACnB,YAAY,GAAG,YAAY,GACP;IACpB,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,cAAc,aAEvB,OAAO,IAAI,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,EAChC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IACxB,IACR,CACJ,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"load-more-button.js","sourceRoot":"","sources":["../../../src/components/ui/load-more-button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,qjBAAqjB,CAAC;AASrkB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,GAAG,KAAK,EACf,OAAO,EACP,KAAK,GAAG,WAAW,EACnB,YAAY,GAAG,YAAY,GACP;IACpB,OAAO,CACL,8BACE,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,EACtD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,cAAc,aAEvB,OAAO,IAAI,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,GAAI,EAChC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IACxB,IACR,CACJ,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { Spinner } from './spinner';\n\nconst STYLES = `.wf-load-more{appearance:none;-webkit-appearance:none;border:none;display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;border-radius:6px;font-size:13px;font-weight:500;line-height:20px;color:var(--ds-gray-1000);background:var(--ds-background-100);box-shadow:0 0 0 1px var(--ds-gray-400);cursor:pointer;white-space:nowrap;gap:6px;transition:background 150ms}.wf-load-more:hover{background:var(--ds-gray-alpha-200)}.wf-load-more:disabled{opacity:.6;cursor:default}.wf-load-more:disabled:hover{background:var(--ds-background-100)}`;\n\ninterface LoadMoreButtonProps {\n loading?: boolean;\n onClick?: () => void;\n label?: string;\n loadingLabel?: string;\n}\n\n/**\n * A \"Load more\" button matching Geist's Button type=\"secondary\" size=\"small\"\n * with a spinner prefix when loading.\n */\nexport function LoadMoreButton({\n loading = false,\n onClick,\n label = 'Load more',\n loadingLabel = 'Loading...',\n}: LoadMoreButtonProps) {\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n <button\n type=\"button\"\n onClick={onClick}\n disabled={loading}\n className=\"wf-load-more\"\n >\n {loading && <Spinner size={14} />}\n {loading ? loadingLabel : label}\n </button>\n </>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-dropdown.js","sourceRoot":"","sources":["../../../src/components/ui/menu-dropdown.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"menu-dropdown.js","sourceRoot":"","sources":["../../../src/components/ui/menu-dropdown.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\nconst STYLES = `.wf-menu-btn{appearance:none;-webkit-appearance:none;border:none;display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 12px;border-radius:6px;font-size:14px;font-weight:500;line-height:20px;color:var(--ds-gray-1000);background:var(--ds-background-100);box-shadow:0 0 0 1px var(--ds-gray-400);cursor:pointer;white-space:nowrap;transition:background 150ms}.wf-menu-btn:hover{background:var(--ds-gray-alpha-200)}.wf-menu-item{appearance:none;-webkit-appearance:none;border:none;display:flex;align-items:center;width:100%;height:40px;padding:0 8px;border-radius:6px;font-size:14px;color:var(--ds-gray-1000);background:transparent;cursor:pointer;transition:background 150ms}.wf-menu-item:hover{background:var(--ds-gray-alpha-100)}`;\n\nexport interface MenuDropdownOption<T extends string = string> {\n value: T;\n label: string;\n}\n\ninterface MenuDropdownProps<T extends string = string> {\n options: MenuDropdownOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\n/**\n * A dropdown menu that matches Geist's MenuButton (secondary) + Menu styling.\n * Uses CSS classes with proper :hover specificity (no inline background).\n */\nexport function MenuDropdown<T extends string = string>({\n options,\n value,\n onChange,\n}: MenuDropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const label =\n options.find((o) => o.value === value)?.label ?? options[0]?.label ?? '';\n\n useEffect(() => {\n if (!open) return;\n function handleClickOutside(e: MouseEvent) {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [open]);\n\n return (\n <div ref={ref} style={{ position: 'relative', flexShrink: 0 }}>\n <style dangerouslySetInnerHTML={{ __html: STYLES }} />\n\n <button\n type=\"button\"\n className=\"wf-menu-btn\"\n onClick={() => setOpen(!open)}\n >\n <span>{label}</span>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n style={{\n marginLeft: 16,\n marginRight: -4,\n color: 'var(--ds-gray-900)',\n }}\n >\n <path\n d=\"M4.5 6L8 9.5L11.5 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {open && (\n <div\n style={{\n position: 'absolute',\n right: 0,\n top: '100%',\n marginTop: 4,\n minWidth: 140,\n padding: 4,\n borderRadius: 12,\n background: 'var(--ds-background-100)',\n boxShadow: 'var(--ds-shadow-menu, var(--ds-shadow-medium))',\n zIndex: 2001,\n }}\n role=\"menu\"\n >\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n className=\"wf-menu-item\"\n style={{\n fontWeight: option.value === value ? 500 : 400,\n }}\n onClick={() => {\n onChange(option.value);\n setOpen(false);\n }}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../src/components/ui/skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,SAAS,QAAQ,CAAC,EAChB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EAC6B;IACrC,OAAO,CACL,iBACM,KAAK,EACT,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,EACtC,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,KAAK,EAAE,GAC1D,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../src/components/ui/skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,SAAS,QAAQ,CAAC,EAChB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EAC6B;IACrC,OAAO,CACL,iBACM,KAAK,EACT,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,EACtC,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,KAAK,EAAE,GAC1D,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import { cn } from '../../lib/utils';\n\nfunction Skeleton({\n className,\n style,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn('rounded-md', className)}\n style={{ backgroundColor: 'var(--ds-gray-200)', ...style }}\n />\n );\n}\n\nexport { Skeleton };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/components/ui/spinner.tsx"],"names":[],"mappings":";AAAA,MAAM,SAAS,GAAG,4DAA4D,CAAC;AAE/E;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,IAAI,GAAG,EAAE,EACT,KAAK,GAIN;IACC,MAAM,MAAM,GACV,IAAI,IAAI,EAAE;QACR,CAAC,CAAC;YACE,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACrD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,GAAG;SACX;QACH,CAAC,CAAC,IAAI,IAAI,EAAE;YACV,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBACjE,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,GAAG;aACX;YACH,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE;oBACN,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG;oBAC5D,CAAC,GAAG,EAAE,CAAC;iBACR;gBACD,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI,GAAG,IAAI;gBAClB,KAAK,EAAE,IAAI,GAAG,IAAI;aACnB,CAAC;IAEV,OAAO,CACL,gBACE,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;SACb,aAED,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAI,EACxD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,eAEE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,KAAK;oBACX,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAC7B,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAC5B,YAAY,EAAE,CAAC;oBACf,eAAe,EAAE,KAAK,IAAI,oBAAoB;oBAC9C,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,kBAAkB,IAAI,GAAG,IAAI,KAAK;oBACvE,SAAS,EAAE,mBAAmB,MAAM,CAAC,QAAQ,oBAAoB;oBACjE,cAAc,EAAE,GAAG,KAAK,IAAI;iBAC7B,IAdI,KAAK,CAeV,CACH,CAAC,IACG,CACR,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/components/ui/spinner.tsx"],"names":[],"mappings":";AAAA,MAAM,SAAS,GAAG,4DAA4D,CAAC;AAE/E;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,IAAI,GAAG,EAAE,EACT,KAAK,GAIN;IACC,MAAM,MAAM,GACV,IAAI,IAAI,EAAE;QACR,CAAC,CAAC;YACE,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACrD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,GAAG;SACX;QACH,CAAC,CAAC,IAAI,IAAI,EAAE;YACV,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBACjE,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,GAAG;aACX;YACH,CAAC,CAAC;gBACE,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE;oBACN,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG;oBAC5D,CAAC,GAAG,EAAE,CAAC;iBACR;gBACD,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI,GAAG,IAAI;gBAClB,KAAK,EAAE,IAAI,GAAG,IAAI;aACnB,CAAC;IAEV,OAAO,CACL,gBACE,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;SACb,aAED,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAI,EACxD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,eAEE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,KAAK;oBACX,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAC7B,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oBAC5B,YAAY,EAAE,CAAC;oBACf,eAAe,EAAE,KAAK,IAAI,oBAAoB;oBAC9C,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,kBAAkB,IAAI,GAAG,IAAI,KAAK;oBACvE,SAAS,EAAE,mBAAmB,MAAM,CAAC,QAAQ,oBAAoB;oBACjE,cAAc,EAAE,GAAG,KAAK,IAAI;iBAC7B,IAdI,KAAK,CAeV,CACH,CAAC,IACG,CACR,CAAC;AACJ,CAAC","sourcesContent":["const KEYFRAMES = `@keyframes wf-spinner-fade{0%{opacity:1}100%{opacity:.15}}`;\n\n/**\n * Spinner matching Geist's multi-line fade spinner.\n * At size ≤12: 8 lines, ≤16: 10 lines, else: 12 lines.\n */\nexport function Spinner({\n size = 14,\n color,\n}: {\n size?: number;\n color?: string;\n}) {\n const config =\n size <= 12\n ? {\n count: 8,\n angle: 45,\n delays: [-875, -750, -625, -500, -375, -250, -125, 0],\n duration: 1000,\n lineW: 3,\n lineH: 1.5,\n }\n : size <= 16\n ? {\n count: 10,\n angle: 36,\n delays: [-900, -800, -700, -600, -500, -400, -300, -200, -100, 0],\n duration: 1000,\n lineW: 4,\n lineH: 1.5,\n }\n : {\n count: 12,\n angle: 30,\n delays: [\n -1100, -1000, -900, -800, -700, -600, -500, -400, -300, -200,\n -100, 0,\n ],\n duration: 1200,\n lineW: size * 0.24,\n lineH: size * 0.08,\n };\n\n return (\n <span\n style={{\n display: 'inline-flex',\n position: 'relative',\n width: size,\n height: size,\n }}\n >\n <style dangerouslySetInnerHTML={{ __html: KEYFRAMES }} />\n {config.delays.map((delay, i) => (\n <span\n key={delay}\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n width: config.lineW,\n height: config.lineH,\n marginLeft: -config.lineW / 2,\n marginTop: -config.lineH / 2,\n borderRadius: 1,\n backgroundColor: color ?? 'var(--ds-gray-700)',\n transform: `rotate(${i * config.angle}deg) translate(${size * 0.36}px)`,\n animation: `wf-spinner-fade ${config.duration}ms linear infinite`,\n animationDelay: `${delay}ms`,\n }}\n />\n ))}\n </span>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timestamp-tooltip.js","sourceRoot":"","sources":["../../../src/components/ui/timestamp-tooltip.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timestamp-tooltip.js","sourceRoot":"","sources":["../../../src/components/ui/timestamp-tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAWzC,MAAM,UAAU,GAAe;IAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE;IACjC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE;IACjC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE;IAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE;IAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE;IAC7B,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE;CAC7B,CAAC;AAEF,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzD,SAAS,IAAI,EAAE,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;IACjC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC/B,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC7C,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC,CAAC;QACF,MAAM,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,eAAe,CAAC,EACvB,IAAI,EACJ,IAAI,GAIL;IACC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,aAAa,GACjB,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/B,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,OAAO;KACtB,CAAC;SACC,aAAa,CAAC,OAAO,CAAC;SACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAEjE,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE;QACpD,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACxD,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IAEH,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,eAAe;YAC/B,GAAG,EAAE,EAAE;SACR,aAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC3D,cACE,KAAK,EAAE;4BACL,OAAO,EAAE,aAAa;4BACtB,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,QAAQ;4BACxB,MAAM,EAAE,EAAE;4BACV,OAAO,EAAE,OAAO;4BAChB,eAAe,EAAE,oBAAoB;4BACrC,YAAY,EAAE,CAAC;4BACf,QAAQ,EAAE,EAAE;4BACZ,UAAU,EAAE,6BAA6B;4BACzC,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,oBAAoB;4BAC3B,UAAU,EAAE,QAAQ;yBACrB,YAEA,aAAa,GACV,EACN,eACE,KAAK,EAAE;4BACL,QAAQ,EAAE,EAAE;4BACZ,KAAK,EAAE,qBAAqB;4BAC5B,UAAU,EAAE,QAAQ;yBACrB,YAEA,aAAa,GACT,IACH,EACN,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,6BAA6B;oBACzC,kBAAkB,EAAE,cAAc;oBAClC,KAAK,EAAE,oBAAoB;oBAC3B,UAAU,EAAE,QAAQ;iBACrB,YAEA,aAAa,GACT,IACH,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,uBAAuB,CAAC,EAAE,IAAI,EAAoB;IACzD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,GAAG,EAAE,EAAE;YACP,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,WAAW;SACrB,aAED,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,kBAAkB,EAAE,cAAc;oBAClC,KAAK,EAAE,oBAAoB;iBAC5B,YAEA,OAAO,GACH,EACP,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC9D,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,KAAK,GAAG,EAC1C,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,GAAI,IAChD,IACF,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,SAAS,aAAa,CAAC,EACrB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,IAAI,GAML;IACC,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAsB;QACtD,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QAEzD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;QAErC,IAAI,IAAI,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CACb,YAAY,EACZ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,CACrD,CAAC;QAEF,IAAI,GAAW,CAAC;QAChB,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,GAAG,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;gBACvB,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC;gBAChD,GAAG,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,QAAQ,CAAC;YACP,QAAQ,EAAE,OAAO;YACjB,IAAI;YACJ,GAAG;YACH,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,oCAAoC;YAC5C,eAAe,EAAE,0BAA0B;YAC3C,SAAS,EAAE,yDAAyD;YACpE,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,OAAO,YAAY;IACjB,yEAAyE;IACzE,cACE,GAAG,EAAE,UAAU,EACf,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,YAEZ,KAAC,uBAAuB,IAAC,IAAI,EAAE,IAAI,GAAI,GACnC,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,IAAI,EACJ,QAAQ,GAIT;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,UAAU,CAAC,OAAO;gBAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,EAAE,GACN,IAAI,IAAI,IAAI;QACV,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAEjC,IAAI,EAAE,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAC;IAE3D,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,WAAW,EAAE,CAAC;QACd,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,WAAW,EAAE,CAAC;QACd,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO;IACL,sEAAsE;IACtE,gBACE,GAAG,EAAE,UAAU,EACf,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,aAAa,EAC3B,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,aAEhC,QAAQ,EACR,IAAI,IAAI,WAAW,IAAI,CACtB,KAAC,aAAa,IACZ,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,aAAa,EAC3B,IAAI,EAAE,EAAE,GACR,CACH,IACI,CACR,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\n// ---------------------------------------------------------------------------\n// Time formatting helpers\n// ---------------------------------------------------------------------------\n\ninterface TimeUnit {\n unit: string;\n ms: number;\n}\n\nconst TIME_UNITS: TimeUnit[] = [\n { unit: 'year', ms: 31536000000 },\n { unit: 'month', ms: 2628000000 },\n { unit: 'day', ms: 86400000 },\n { unit: 'hour', ms: 3600000 },\n { unit: 'minute', ms: 60000 },\n { unit: 'second', ms: 1000 },\n];\n\nfunction formatTimeDifference(diff: number): string {\n let remaining = Math.abs(diff);\n const result: string[] = [];\n\n for (const { unit, ms } of TIME_UNITS) {\n const value = Math.floor(remaining / ms);\n if (value > 0 || result.length > 0) {\n result.push(`${value} ${unit}${value !== 1 ? 's' : ''}`);\n remaining %= ms;\n }\n if (result.length === 3) break;\n }\n\n return result.join(', ');\n}\n\nfunction useTimeAgo(date: number): string {\n const [timeAgo, setTimeAgo] = useState<string>('');\n\n useEffect(() => {\n const update = (): void => {\n const diff = Date.now() - date;\n const formatted = formatTimeDifference(diff);\n setTimeAgo(formatted ? `${formatted} ago` : 'Just now');\n };\n update();\n const timer = setInterval(update, 1000);\n return () => clearInterval(timer);\n }, [date]);\n\n return timeAgo;\n}\n\n// ---------------------------------------------------------------------------\n// Timezone row\n// ---------------------------------------------------------------------------\n\nfunction ZoneDateTimeRow({\n date,\n zone,\n}: {\n zone: string;\n date: number;\n}): ReactNode {\n const dateObj = new Date(date);\n\n const formattedZone =\n new Intl.DateTimeFormat('en-US', {\n timeZone: zone,\n timeZoneName: 'short',\n })\n .formatToParts(dateObj)\n .find((part) => part.type === 'timeZoneName')?.value || zone;\n\n const formattedDate = dateObj.toLocaleString('en-US', {\n timeZone: zone,\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n\n const formattedTime = dateObj.toLocaleTimeString('en-US', {\n timeZone: zone,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 16,\n padding: '0 6px',\n backgroundColor: 'var(--ds-gray-200)',\n borderRadius: 3,\n fontSize: 11,\n fontFamily: 'var(--font-mono, monospace)',\n fontWeight: 500,\n color: 'var(--ds-gray-900)',\n whiteSpace: 'nowrap',\n }}\n >\n {formattedZone}\n </div>\n <span\n style={{\n fontSize: 13,\n color: 'var(--ds-gray-1000)',\n whiteSpace: 'nowrap',\n }}\n >\n {formattedDate}\n </span>\n </div>\n <span\n style={{\n fontSize: 11,\n fontFamily: 'var(--font-mono, monospace)',\n fontVariantNumeric: 'tabular-nums',\n color: 'var(--ds-gray-900)',\n whiteSpace: 'nowrap',\n }}\n >\n {formattedTime}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip card content\n// ---------------------------------------------------------------------------\n\nfunction TimestampTooltipContent({ date }: { date: number }): ReactNode {\n const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const timeAgo = useTimeAgo(date);\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n minWidth: 300,\n padding: '12px 14px',\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontVariantNumeric: 'tabular-nums',\n color: 'var(--ds-gray-900)',\n }}\n >\n {timeAgo}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <ZoneDateTimeRow date={date} zone=\"UTC\" />\n <ZoneDateTimeRow date={date} zone={localTimezone} />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hover tooltip wrapper\n// ---------------------------------------------------------------------------\n\nconst TOOLTIP_WIDTH = 330;\nconst VIEWPORT_PAD = 8;\n\nfunction TooltipPortal({\n triggerRect,\n onMouseEnter,\n onMouseLeave,\n date,\n}: {\n triggerRect: DOMRect;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n date: number;\n}): ReactNode {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({\n position: 'fixed',\n zIndex: 9999,\n visibility: 'hidden',\n });\n\n useEffect(() => {\n const placement = triggerRect.top > 240 ? 'above' : 'below';\n const centerX = triggerRect.left + triggerRect.width / 2;\n\n const el = tooltipRef.current;\n const w = el ? el.offsetWidth : TOOLTIP_WIDTH;\n const h = el ? el.offsetHeight : 100;\n\n let left = centerX - w / 2;\n left = Math.max(\n VIEWPORT_PAD,\n Math.min(left, window.innerWidth - w - VIEWPORT_PAD)\n );\n\n let top: number;\n if (placement === 'above') {\n top = triggerRect.top - h - 6;\n if (top < VIEWPORT_PAD) {\n top = triggerRect.bottom + 6;\n }\n } else {\n top = triggerRect.bottom + 6;\n if (top + h > window.innerHeight - VIEWPORT_PAD) {\n top = triggerRect.top - h - 6;\n }\n }\n\n setStyle({\n position: 'fixed',\n left,\n top,\n zIndex: 9999,\n borderRadius: 10,\n border: '1px solid var(--ds-gray-alpha-200)',\n backgroundColor: 'var(--ds-background-100)',\n boxShadow: '0 4px 12px rgba(0,0,0,0.08), 0 1px 3px rgba(0,0,0,0.06)',\n visibility: 'visible',\n });\n }, [triggerRect]);\n\n return createPortal(\n // biome-ignore lint/a11y/noStaticElementInteractions: tooltip hover zone\n <div\n ref={tooltipRef}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n >\n <TimestampTooltipContent date={date} />\n </div>,\n document.body\n );\n}\n\nexport function TimestampTooltip({\n date,\n children,\n}: {\n date: number | Date | string | null | undefined;\n children: ReactNode;\n}): ReactNode {\n const [open, setOpen] = useState(false);\n const [triggerRect, setTriggerRect] = useState<DOMRect | null>(null);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (closeTimer.current) clearTimeout(closeTimer.current);\n };\n }, []);\n\n const ts =\n date == null\n ? null\n : typeof date === 'number'\n ? date\n : new Date(date).getTime();\n\n if (ts == null || Number.isNaN(ts)) return <>{children}</>;\n\n const cancelClose = () => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n\n const scheduleClose = () => {\n cancelClose();\n closeTimer.current = setTimeout(() => setOpen(false), 120);\n };\n\n const handleOpen = () => {\n cancelClose();\n if (triggerRef.current) {\n setTriggerRect(triggerRef.current.getBoundingClientRect());\n }\n setOpen(true);\n };\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: tooltip trigger\n <span\n ref={triggerRef}\n onMouseEnter={handleOpen}\n onMouseLeave={scheduleClose}\n style={{ display: 'inline-flex' }}\n >\n {children}\n {open && triggerRect && (\n <TooltipPortal\n triggerRect={triggerRect}\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n date={ts}\n />\n )}\n </span>\n );\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
|
|
|
2
2
|
import { type SpanSelectionInfo } from './sidebar/entity-detail-panel';
|
|
3
3
|
/** Re-export SpanSelectionInfo for consumers */
|
|
4
4
|
export type { SpanSelectionInfo };
|
|
5
|
-
export declare const WorkflowTraceViewer: ({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onSpanSelect, onLoadEventData, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, encryptionKey, onDecrypt, isDecrypting, }: {
|
|
5
|
+
export declare const WorkflowTraceViewer: ({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onSpanSelect, onLoadEventData, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, encryptionKey, onDecrypt, isDecrypting, hasEncryptedData, }: {
|
|
6
6
|
run: WorkflowRun;
|
|
7
7
|
events: Event[];
|
|
8
8
|
isLoading?: boolean;
|
|
@@ -18,6 +18,8 @@ export declare const WorkflowTraceViewer: ({ run, events, isLoading, error, span
|
|
|
18
18
|
onCancelRun?: (runId: string) => Promise<void>;
|
|
19
19
|
/** Callback when a stream reference is clicked in the detail panel */
|
|
20
20
|
onStreamClick?: (streamId: string) => void;
|
|
21
|
+
/** Callback when a run reference is clicked in the detail panel */
|
|
22
|
+
onRunClick?: (runId: string) => void;
|
|
21
23
|
/** Callback when a span is selected. */
|
|
22
24
|
onSpanSelect?: (info: SpanSelectionInfo) => void;
|
|
23
25
|
/** Callback to load event data for a specific event (lazy loading in sidebar) */
|
|
@@ -34,5 +36,7 @@ export declare const WorkflowTraceViewer: ({ run, events, isLoading, error, span
|
|
|
34
36
|
onDecrypt?: () => void;
|
|
35
37
|
/** Whether the encryption key is currently being fetched */
|
|
36
38
|
isDecrypting?: boolean;
|
|
39
|
+
/** Run-level hint: the run contains encrypted data (from probe). */
|
|
40
|
+
hasEncryptedData?: boolean;
|
|
37
41
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
38
42
|
//# sourceMappingURL=workflow-trace-view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-trace-view.d.ts","sourceRoot":"","sources":["../../src/components/workflow-trace-view.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAiBtE,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AA4jBvC,gDAAgD;AAChD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAgKlC,eAAO,MAAM,mBAAmB,GAAI,
|
|
1
|
+
{"version":3,"file":"workflow-trace-view.d.ts","sourceRoot":"","sources":["../../src/components/workflow-trace-view.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAiBtE,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AA4jBvC,gDAAgD;AAChD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAgKlC,eAAO,MAAM,mBAAmB,GAAI,0SAsBjC;IACD,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,yCAAyC;IACzC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,sEAAsE;IACtE,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,mEAAmE;IACnE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,wCAAwC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,iFAAiF;IACjF,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sFAAsF;IACtF,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,4CA+VA,CAAC"}
|
|
@@ -502,7 +502,7 @@ function TraceViewerFooter({ hasMore, isLive, isInitialLoading, }) {
|
|
|
502
502
|
// ---------------------------------------------------------------------------
|
|
503
503
|
// Main component
|
|
504
504
|
// ---------------------------------------------------------------------------
|
|
505
|
-
export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onSpanSelect, onLoadEventData, onLoadMoreSpans, hasMoreSpans = false, isLoadingMoreSpans = false, encryptionKey, onDecrypt, isDecrypting = false, }) => {
|
|
505
|
+
export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onSpanSelect, onLoadEventData, onLoadMoreSpans, hasMoreSpans = false, isLoadingMoreSpans = false, encryptionKey, onDecrypt, isDecrypting = false, hasEncryptedData = false, }) => {
|
|
506
506
|
const toast = useToast();
|
|
507
507
|
const [selectedSpan, setSelectedSpan] = useState(null);
|
|
508
508
|
const [panelWidth, setPanelWidth] = useState(DEFAULT_PANEL_WIDTH);
|
|
@@ -566,6 +566,11 @@ export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailD
|
|
|
566
566
|
};
|
|
567
567
|
});
|
|
568
568
|
}, [events, selectedSpan?.spanId]);
|
|
569
|
+
// Reset selected span when navigating to a different run
|
|
570
|
+
useEffect(() => {
|
|
571
|
+
setSelectedSpan(null);
|
|
572
|
+
setDeselectTrigger((n) => n + 1);
|
|
573
|
+
}, [run?.runId]);
|
|
569
574
|
const handleClose = useCallback(() => {
|
|
570
575
|
setSelectedSpan(null);
|
|
571
576
|
setDeselectTrigger((n) => n + 1);
|
|
@@ -685,6 +690,6 @@ export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailD
|
|
|
685
690
|
e.currentTarget.style.background = 'var(--ds-gray-alpha-100)';
|
|
686
691
|
}, onMouseLeave: (e) => {
|
|
687
692
|
e.currentTarget.style.background = 'transparent';
|
|
688
|
-
}, children: _jsx(X, { size: 16 }) }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ErrorBoundary, { title: "Failed to load entity details", children: _jsx(EntityDetailPanel, { run: run, onStreamClick: onStreamClick, spanDetailData: spanDetailData ?? null, spanDetailError: spanDetailError, spanDetailLoading: spanDetailLoading, onSpanSelect: handleSpanSelect, onWakeUpSleep: onWakeUpSleep, onLoadEventData: onLoadEventData, onResolveHook: onResolveHook, encryptionKey: encryptionKey, onDecrypt: onDecrypt, isDecrypting: isDecrypting, selectedSpan: selectedSpan }) }) })] }))] }));
|
|
693
|
+
}, children: _jsx(X, { size: 16 }) }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ErrorBoundary, { title: "Failed to load entity details", children: _jsx(EntityDetailPanel, { run: run, onStreamClick: onStreamClick, onRunClick: onRunClick, spanDetailData: spanDetailData ?? null, spanDetailError: spanDetailError, spanDetailLoading: spanDetailLoading, onSpanSelect: handleSpanSelect, onWakeUpSleep: onWakeUpSleep, onLoadEventData: onLoadEventData, onResolveHook: onResolveHook, encryptionKey: encryptionKey, onDecrypt: onDecrypt, isDecrypting: isDecrypting, selectedSpan: selectedSpan, hasEncryptedData: hasEncryptedData }) }) })] }))] }));
|
|
689
694
|
};
|
|
690
695
|
//# sourceMappingURL=workflow-trace-view.js.map
|