@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.3
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/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
- package/dist/components/new-trace-viewer/components/copy-button.js.map +1 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts +8 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/event-list.js +35 -0
- package/dist/components/new-trace-viewer/components/event-list.js.map +1 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/split-pane.js +100 -0
- package/dist/components/new-trace-viewer/components/split-pane.js.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts +32 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.js +134 -0
- package/dist/components/new-trace-viewer/components/timeline.js.map +1 -0
- package/dist/components/new-trace-viewer/context.d.ts +15 -0
- package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/context.js +49 -0
- package/dist/components/new-trace-viewer/context.js.map +1 -0
- package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/detail-panel.js +11 -0
- package/dist/components/new-trace-viewer/detail-panel.js.map +1 -0
- package/dist/components/new-trace-viewer/icons.d.ts +6 -0
- package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/icons.js +15 -0
- package/dist/components/new-trace-viewer/icons.js.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.js +329 -0
- package/dist/components/new-trace-viewer/trace-viewer.js.map +1 -0
- package/dist/components/new-trace-viewer/types.d.ts +1 -0
- package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/types.js +2 -0
- package/dist/components/new-trace-viewer/types.js.map +1 -0
- package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
- package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/util/constants.js +2 -0
- package/dist/components/new-trace-viewer/util/constants.js.map +1 -0
- package/dist/components/new-trace-viewer/utils.d.ts +47 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/utils.js +358 -0
- package/dist/components/new-trace-viewer/utils.js.map +1 -0
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +42 -23
- package/dist/components/sidebar/attribute-panel.js.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +1 -1
- package/dist/components/sidebar/copyable-data-block.js.map +1 -1
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +1 -1
- package/dist/components/sidebar/detail-card.js.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +3 -25
- package/dist/components/sidebar/entity-detail-panel.js.map +1 -1
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +2 -2
- package/dist/components/sidebar/events-list.js.map +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar-data-context.js +19 -0
- package/dist/components/sidebar/sidebar-data-context.js.map +1 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +2 -26
- package/dist/components/stream-viewer.js.map +1 -1
- package/dist/components/trace-viewer-new.d.ts +10 -0
- package/dist/components/trace-viewer-new.d.ts.map +1 -0
- package/dist/components/trace-viewer-new.js +23 -0
- package/dist/components/trace-viewer-new.js.map +1 -0
- package/dist/components/ui/data-inspector.d.ts +21 -0
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +99 -4
- package/dist/components/ui/data-inspector.js.map +1 -1
- package/dist/components/ui/inspector-theme.d.ts +9 -10
- package/dist/components/ui/inspector-theme.d.ts.map +1 -1
- package/dist/components/ui/inspector-theme.js +38 -71
- package/dist/components/ui/inspector-theme.js.map +1 -1
- package/dist/components/workflow-trace-view.d.ts +1 -3
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +4 -4
- package/dist/components/workflow-trace-view.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/stream-display.d.ts +18 -0
- package/dist/lib/stream-display.d.ts.map +1 -0
- package/dist/lib/stream-display.js +30 -0
- package/dist/lib/stream-display.js.map +1 -0
- package/dist/lib/utils.d.ts +7 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +17 -22
- package/dist/lib/utils.js.map +1 -1
- package/dist/styles.css +470 -1
- package/package.json +3 -2
- package/src/components/index.ts +5 -0
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +109 -0
- package/src/components/new-trace-viewer/components/split-pane.tsx +186 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +378 -0
- package/src/components/new-trace-viewer/context.tsx +94 -0
- package/src/components/new-trace-viewer/detail-panel.tsx +57 -0
- package/src/components/new-trace-viewer/icons.tsx +79 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +585 -0
- package/src/components/new-trace-viewer/types.ts +0 -0
- package/src/components/new-trace-viewer/util/constants.ts +0 -0
- package/src/components/new-trace-viewer/utils.ts +524 -0
- package/src/components/sidebar/attribute-panel.tsx +43 -32
- package/src/components/sidebar/copyable-data-block.tsx +1 -1
- package/src/components/sidebar/detail-card.tsx +1 -19
- package/src/components/sidebar/entity-detail-panel.tsx +0 -71
- package/src/components/sidebar/events-list.tsx +9 -6
- package/src/components/sidebar/sidebar-data-context.tsx +62 -0
- package/src/components/stream-viewer.tsx +18 -40
- package/src/components/trace-viewer-new.tsx +49 -0
- package/src/components/ui/data-inspector.tsx +235 -4
- package/src/components/ui/inspector-theme.ts +39 -81
- package/src/components/workflow-trace-view.tsx +2 -6
- package/src/index.ts +1 -0
- package/src/lib/stream-display.ts +48 -0
- package/src/lib/utils.ts +18 -23
- package/src/styles.css +470 -1
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
|
|
2
|
+
export function computeRootBounds(spans) {
|
|
3
|
+
let minStart = Number.POSITIVE_INFINITY;
|
|
4
|
+
let maxEnd = Number.NEGATIVE_INFINITY;
|
|
5
|
+
for (const span of spans) {
|
|
6
|
+
const s = getHighResInMs(span.startTime);
|
|
7
|
+
const e = getHighResInMs(span.endTime);
|
|
8
|
+
if (s < minStart)
|
|
9
|
+
minStart = s;
|
|
10
|
+
if (e > maxEnd)
|
|
11
|
+
maxEnd = e;
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isFinite(minStart) || !Number.isFinite(maxEnd)) {
|
|
14
|
+
return { startTime: 0, endTime: 1, duration: 1 };
|
|
15
|
+
}
|
|
16
|
+
const duration = Math.max(maxEnd - minStart, 1);
|
|
17
|
+
return { startTime: minStart, endTime: maxEnd, duration };
|
|
18
|
+
}
|
|
19
|
+
export function buildTimeCompression(_spans, viewStart, viewEnd) {
|
|
20
|
+
const range = viewEnd - viewStart;
|
|
21
|
+
return {
|
|
22
|
+
isCompressed: false,
|
|
23
|
+
toVisual(time) {
|
|
24
|
+
if (range <= 0)
|
|
25
|
+
return 0;
|
|
26
|
+
return Math.min(Math.max((time - viewStart) / range, 0), 1);
|
|
27
|
+
},
|
|
28
|
+
fromVisual(fraction) {
|
|
29
|
+
return viewStart + fraction * range;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const NICE_INTERVALS = [
|
|
34
|
+
1, 2, 5, 10, 20, 50, 100, 200, 500, 1_000, 2_000, 5_000, 10_000, 20_000,
|
|
35
|
+
50_000, 100_000, 200_000, 500_000, 1_000_000, 2_000_000, 5_000_000,
|
|
36
|
+
10_000_000, 20_000_000, 50_000_000, 100_000_000, 200_000_000, 500_000_000,
|
|
37
|
+
1_000_000_000, 2_000_000_000, 5_000_000_000,
|
|
38
|
+
];
|
|
39
|
+
const MAX_MARKERS = 8;
|
|
40
|
+
function pickInterval(viewDuration, maxTicks) {
|
|
41
|
+
for (const interval of NICE_INTERVALS) {
|
|
42
|
+
if (viewDuration / interval <= maxTicks)
|
|
43
|
+
return interval;
|
|
44
|
+
}
|
|
45
|
+
return NICE_INTERVALS[NICE_INTERVALS.length - 1];
|
|
46
|
+
}
|
|
47
|
+
export function computeTimeMarkers(viewDuration, offset) {
|
|
48
|
+
if (viewDuration <= 0)
|
|
49
|
+
return [];
|
|
50
|
+
const maxTicks = 6;
|
|
51
|
+
const interval = pickInterval(viewDuration, maxTicks);
|
|
52
|
+
const firstTick = Math.ceil(offset / interval) * interval;
|
|
53
|
+
const markers = [];
|
|
54
|
+
for (let t = firstTick; t <= offset + viewDuration; t += interval) {
|
|
55
|
+
const position = (t - offset) / viewDuration;
|
|
56
|
+
if (position < -0.01 || position > 1.01)
|
|
57
|
+
continue;
|
|
58
|
+
markers.push({
|
|
59
|
+
position: Math.min(Math.max(position, 0), 1),
|
|
60
|
+
label: formatDuration(Math.abs(t), true),
|
|
61
|
+
});
|
|
62
|
+
if (markers.length >= MAX_MARKERS)
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
return markers;
|
|
66
|
+
}
|
|
67
|
+
export function computeCompressedTimeMarkers(compression, viewStart, viewEnd, rootStart) {
|
|
68
|
+
const viewDuration = viewEnd - viewStart;
|
|
69
|
+
if (viewDuration <= 0)
|
|
70
|
+
return [];
|
|
71
|
+
const maxTicks = 6;
|
|
72
|
+
const interval = pickInterval(viewDuration, maxTicks);
|
|
73
|
+
const offset = viewStart - rootStart;
|
|
74
|
+
const firstTick = Math.ceil(offset / interval) * interval;
|
|
75
|
+
const markers = [];
|
|
76
|
+
for (let t = firstTick; t <= offset + viewDuration; t += interval) {
|
|
77
|
+
const absTime = rootStart + t;
|
|
78
|
+
const position = compression.toVisual(absTime);
|
|
79
|
+
if (position < -0.01 || position > 1.01)
|
|
80
|
+
continue;
|
|
81
|
+
markers.push({
|
|
82
|
+
position: Math.min(Math.max(position, 0), 1),
|
|
83
|
+
label: formatDuration(Math.abs(t), true),
|
|
84
|
+
});
|
|
85
|
+
if (markers.length >= MAX_MARKERS)
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
return markers;
|
|
89
|
+
}
|
|
90
|
+
export function computeSpanGaps(spans, compression) {
|
|
91
|
+
const gaps = [];
|
|
92
|
+
for (let i = 0; i < spans.length - 1; i++) {
|
|
93
|
+
const endTime = getHighResInMs(spans[i].endTime);
|
|
94
|
+
const startTime = getHighResInMs(spans[i + 1].startTime);
|
|
95
|
+
const gapMs = startTime - endTime;
|
|
96
|
+
if (gapMs <= 0)
|
|
97
|
+
continue;
|
|
98
|
+
const leftFrac = compression.toVisual(endTime);
|
|
99
|
+
const rightFrac = compression.toVisual(startTime);
|
|
100
|
+
if (rightFrac - leftFrac < 0.001)
|
|
101
|
+
continue;
|
|
102
|
+
gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
|
|
103
|
+
}
|
|
104
|
+
return gaps;
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Resource colors
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
export const RESOURCE_COLORS = {
|
|
110
|
+
run: { bar: 'var(--ds-blue-700)', errorBar: 'var(--ds-red-700)' },
|
|
111
|
+
step: { bar: 'var(--ds-green-700)', errorBar: 'var(--ds-red-700)' },
|
|
112
|
+
hook: { bar: 'var(--ds-amber-700)', errorBar: 'var(--ds-red-700)' },
|
|
113
|
+
sleep: { bar: 'var(--ds-purple-700)', errorBar: 'var(--ds-red-700)' },
|
|
114
|
+
default: { bar: 'var(--ds-gray-500)', errorBar: 'var(--ds-red-700)' },
|
|
115
|
+
};
|
|
116
|
+
export function getResourceColor(resource) {
|
|
117
|
+
return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
|
|
118
|
+
}
|
|
119
|
+
function clampFraction(value) {
|
|
120
|
+
return Math.max(0, Math.min(1, value));
|
|
121
|
+
}
|
|
122
|
+
function timeToFraction(time, spanStart, spanDuration) {
|
|
123
|
+
if (spanDuration <= 0)
|
|
124
|
+
return 0;
|
|
125
|
+
return clampFraction((time - spanStart) / spanDuration);
|
|
126
|
+
}
|
|
127
|
+
function sortedEventMarks(events, relevantNames) {
|
|
128
|
+
return events
|
|
129
|
+
.filter((e) => relevantNames.includes(e.name))
|
|
130
|
+
.map((e) => ({ time: getHighResInMs(e.timestamp), type: e.name }))
|
|
131
|
+
.sort((a, b) => a.time - b.time);
|
|
132
|
+
}
|
|
133
|
+
function computeStepSegmentsFromSpan(startMs, duration, events) {
|
|
134
|
+
const segments = [];
|
|
135
|
+
if (duration <= 0)
|
|
136
|
+
return segments;
|
|
137
|
+
const marks = sortedEventMarks(events, [
|
|
138
|
+
'step_started',
|
|
139
|
+
'step_retrying',
|
|
140
|
+
'step_failed',
|
|
141
|
+
'step_completed',
|
|
142
|
+
]);
|
|
143
|
+
if (marks.length === 0) {
|
|
144
|
+
segments.push({ startFraction: 0, endFraction: 1, status: 'running' });
|
|
145
|
+
return segments;
|
|
146
|
+
}
|
|
147
|
+
const firstFraction = timeToFraction(marks[0].time, startMs, duration);
|
|
148
|
+
if (firstFraction > 0.001) {
|
|
149
|
+
segments.push({
|
|
150
|
+
startFraction: 0,
|
|
151
|
+
endFraction: firstFraction,
|
|
152
|
+
status: 'queued',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
for (let i = 0; i < marks.length; i++) {
|
|
156
|
+
const mark = marks[i];
|
|
157
|
+
const markFrac = timeToFraction(mark.time, startMs, duration);
|
|
158
|
+
const nextMark = marks[i + 1];
|
|
159
|
+
const nextFrac = nextMark
|
|
160
|
+
? timeToFraction(nextMark.time, startMs, duration)
|
|
161
|
+
: 1;
|
|
162
|
+
if (mark.type === 'step_started') {
|
|
163
|
+
if (i === marks.length - 1) {
|
|
164
|
+
segments.push({
|
|
165
|
+
startFraction: markFrac,
|
|
166
|
+
endFraction: 1,
|
|
167
|
+
status: 'succeeded',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const nextType = nextMark.type;
|
|
172
|
+
const attemptStatus = nextType === 'step_retrying' || nextType === 'step_failed'
|
|
173
|
+
? 'failed'
|
|
174
|
+
: nextType === 'step_completed'
|
|
175
|
+
? 'succeeded'
|
|
176
|
+
: 'running';
|
|
177
|
+
segments.push({
|
|
178
|
+
startFraction: markFrac,
|
|
179
|
+
endFraction: nextFrac,
|
|
180
|
+
status: attemptStatus,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (mark.type === 'step_retrying') {
|
|
185
|
+
segments.push({
|
|
186
|
+
startFraction: markFrac,
|
|
187
|
+
endFraction: nextFrac,
|
|
188
|
+
status: 'retrying',
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else if (mark.type === 'step_failed') {
|
|
192
|
+
if (markFrac < 0.999) {
|
|
193
|
+
segments.push({
|
|
194
|
+
startFraction: markFrac,
|
|
195
|
+
endFraction: 1,
|
|
196
|
+
status: 'failed',
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return segments;
|
|
202
|
+
}
|
|
203
|
+
function computeHookSegmentsFromSpan(startMs, duration, events) {
|
|
204
|
+
const segments = [];
|
|
205
|
+
if (duration <= 0)
|
|
206
|
+
return segments;
|
|
207
|
+
const sorted = [...events]
|
|
208
|
+
.map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
|
|
209
|
+
.sort((a, b) => a.time - b.time);
|
|
210
|
+
const received = sorted.find((e) => e.name === 'hook_received');
|
|
211
|
+
const disposed = sorted.find((e) => e.name === 'hook_disposed');
|
|
212
|
+
if (!received && !disposed) {
|
|
213
|
+
segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });
|
|
214
|
+
return segments;
|
|
215
|
+
}
|
|
216
|
+
const receivedFrac = received
|
|
217
|
+
? timeToFraction(received.time, startMs, duration)
|
|
218
|
+
: null;
|
|
219
|
+
const disposedFrac = disposed
|
|
220
|
+
? timeToFraction(disposed.time, startMs, duration)
|
|
221
|
+
: null;
|
|
222
|
+
if (receivedFrac !== null && receivedFrac > 0.001) {
|
|
223
|
+
segments.push({
|
|
224
|
+
startFraction: 0,
|
|
225
|
+
endFraction: receivedFrac,
|
|
226
|
+
status: 'waiting',
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else if (receivedFrac === null && disposedFrac !== null) {
|
|
230
|
+
segments.push({
|
|
231
|
+
startFraction: 0,
|
|
232
|
+
endFraction: disposedFrac,
|
|
233
|
+
status: 'waiting',
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
if (receivedFrac !== null) {
|
|
237
|
+
segments.push({
|
|
238
|
+
startFraction: receivedFrac,
|
|
239
|
+
endFraction: disposedFrac ?? 1,
|
|
240
|
+
status: 'received',
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (disposedFrac !== null && disposedFrac < 0.999) {
|
|
244
|
+
segments.push({
|
|
245
|
+
startFraction: disposedFrac,
|
|
246
|
+
endFraction: 1,
|
|
247
|
+
status: 'succeeded',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return segments;
|
|
251
|
+
}
|
|
252
|
+
function computeSleepSegmentsFromSpan(startMs, duration, events) {
|
|
253
|
+
const segments = [];
|
|
254
|
+
if (duration <= 0)
|
|
255
|
+
return segments;
|
|
256
|
+
const completedTime = events
|
|
257
|
+
.filter((e) => e.name === 'wait_completed')
|
|
258
|
+
.map((e) => getHighResInMs(e.timestamp))
|
|
259
|
+
.sort((a, b) => a - b)[0];
|
|
260
|
+
if (completedTime === undefined) {
|
|
261
|
+
segments.push({ startFraction: 0, endFraction: 1, status: 'sleeping' });
|
|
262
|
+
return segments;
|
|
263
|
+
}
|
|
264
|
+
const completedFrac = timeToFraction(completedTime, startMs, duration);
|
|
265
|
+
if (completedFrac > 0.001) {
|
|
266
|
+
segments.push({
|
|
267
|
+
startFraction: 0,
|
|
268
|
+
endFraction: completedFrac,
|
|
269
|
+
status: 'sleeping',
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
segments.push({
|
|
273
|
+
startFraction: completedFrac,
|
|
274
|
+
endFraction: 1,
|
|
275
|
+
status: 'succeeded',
|
|
276
|
+
});
|
|
277
|
+
return segments;
|
|
278
|
+
}
|
|
279
|
+
function computeRunSegmentsFromSpan(startMs, duration, activeStartMs, events, attributes) {
|
|
280
|
+
const segments = [];
|
|
281
|
+
if (duration <= 0)
|
|
282
|
+
return segments;
|
|
283
|
+
const sorted = [...events]
|
|
284
|
+
.map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
|
|
285
|
+
.sort((a, b) => a.time - b.time);
|
|
286
|
+
const hasRunCreated = sorted.some((e) => e.name === 'run_created');
|
|
287
|
+
if (!hasRunCreated) {
|
|
288
|
+
const runData = attributes?.data;
|
|
289
|
+
const runStatus = runData?.status;
|
|
290
|
+
return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);
|
|
291
|
+
}
|
|
292
|
+
const failedEvent = sorted.find((e) => e.name === 'run_failed');
|
|
293
|
+
let cursor = 0;
|
|
294
|
+
if (activeStartMs !== undefined && activeStartMs > startMs) {
|
|
295
|
+
const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
|
|
296
|
+
if (queuedFrac > 0.001) {
|
|
297
|
+
segments.push({
|
|
298
|
+
startFraction: 0,
|
|
299
|
+
endFraction: queuedFrac,
|
|
300
|
+
status: 'queued',
|
|
301
|
+
});
|
|
302
|
+
cursor = queuedFrac;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
segments.push({
|
|
306
|
+
startFraction: cursor,
|
|
307
|
+
endFraction: 1,
|
|
308
|
+
status: failedEvent ? 'failed' : 'running',
|
|
309
|
+
});
|
|
310
|
+
return segments;
|
|
311
|
+
}
|
|
312
|
+
function computeV1RunSegments(startMs, duration, activeStartMs, runStatus) {
|
|
313
|
+
const segments = [];
|
|
314
|
+
let cursor = 0;
|
|
315
|
+
if (activeStartMs !== undefined && activeStartMs > startMs) {
|
|
316
|
+
const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
|
|
317
|
+
if (queuedFrac > 0.001) {
|
|
318
|
+
segments.push({
|
|
319
|
+
startFraction: 0,
|
|
320
|
+
endFraction: queuedFrac,
|
|
321
|
+
status: 'queued',
|
|
322
|
+
});
|
|
323
|
+
cursor = queuedFrac;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
segments.push({
|
|
327
|
+
startFraction: cursor,
|
|
328
|
+
endFraction: 1,
|
|
329
|
+
status: runStatus === 'failed' ? 'failed' : 'running',
|
|
330
|
+
});
|
|
331
|
+
return segments;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Compute event-based segments for a span. Dispatches on `span.resource`
|
|
335
|
+
* to the appropriate resource-type-specific segment builder.
|
|
336
|
+
* Returns an empty array for generic (non-workflow) spans.
|
|
337
|
+
*/
|
|
338
|
+
export function computeSpanSegments(span) {
|
|
339
|
+
const startMs = getHighResInMs(span.startTime);
|
|
340
|
+
const endMs = getHighResInMs(span.endTime);
|
|
341
|
+
const duration = endMs - startMs;
|
|
342
|
+
const activeStartMs = span.activeStartTime
|
|
343
|
+
? getHighResInMs(span.activeStartTime)
|
|
344
|
+
: undefined;
|
|
345
|
+
switch (span.resource) {
|
|
346
|
+
case 'step':
|
|
347
|
+
return computeStepSegmentsFromSpan(startMs, duration, span.events);
|
|
348
|
+
case 'hook':
|
|
349
|
+
return computeHookSegmentsFromSpan(startMs, duration, span.events);
|
|
350
|
+
case 'sleep':
|
|
351
|
+
return computeSleepSegmentsFromSpan(startMs, duration, span.events);
|
|
352
|
+
case 'run':
|
|
353
|
+
return computeRunSegmentsFromSpan(startMs, duration, activeStartMs, span.events, span.attributes);
|
|
354
|
+
default:
|
|
355
|
+
return [];
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Span, SpanEvent } from '../trace-viewer/types';\nimport { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';\n\n// ---------------------------------------------------------------------------\n// Root bounds\n// ---------------------------------------------------------------------------\n\nexport interface RootBounds {\n startTime: number;\n endTime: number;\n duration: number;\n}\n\nexport function computeRootBounds(spans: Span[]): RootBounds {\n let minStart = Number.POSITIVE_INFINITY;\n let maxEnd = Number.NEGATIVE_INFINITY;\n\n for (const span of spans) {\n const s = getHighResInMs(span.startTime);\n const e = getHighResInMs(span.endTime);\n if (s < minStart) minStart = s;\n if (e > maxEnd) maxEnd = e;\n }\n\n if (!Number.isFinite(minStart) || !Number.isFinite(maxEnd)) {\n return { startTime: 0, endTime: 1, duration: 1 };\n }\n\n const duration = Math.max(maxEnd - minStart, 1);\n return { startTime: minStart, endTime: maxEnd, duration };\n}\n\n// ---------------------------------------------------------------------------\n// Time compression\n// ---------------------------------------------------------------------------\n\nexport interface TimeCompression {\n toVisual(time: number): number;\n fromVisual(fraction: number): number;\n isCompressed: boolean;\n}\n\nexport function buildTimeCompression(\n _spans: Span[],\n viewStart: number,\n viewEnd: number\n): TimeCompression {\n const range = viewEnd - viewStart;\n\n return {\n isCompressed: false,\n toVisual(time: number): number {\n if (range <= 0) return 0;\n return Math.min(Math.max((time - viewStart) / range, 0), 1);\n },\n fromVisual(fraction: number): number {\n return viewStart + fraction * range;\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Time markers\n// ---------------------------------------------------------------------------\n\nexport interface TimeMarker {\n position: number;\n label: string;\n}\n\nconst NICE_INTERVALS = [\n 1, 2, 5, 10, 20, 50, 100, 200, 500, 1_000, 2_000, 5_000, 10_000, 20_000,\n 50_000, 100_000, 200_000, 500_000, 1_000_000, 2_000_000, 5_000_000,\n 10_000_000, 20_000_000, 50_000_000, 100_000_000, 200_000_000, 500_000_000,\n 1_000_000_000, 2_000_000_000, 5_000_000_000,\n];\n\nconst MAX_MARKERS = 8;\n\nfunction pickInterval(viewDuration: number, maxTicks: number): number {\n for (const interval of NICE_INTERVALS) {\n if (viewDuration / interval <= maxTicks) return interval;\n }\n return NICE_INTERVALS[NICE_INTERVALS.length - 1];\n}\n\nexport function computeTimeMarkers(\n viewDuration: number,\n offset: number\n): TimeMarker[] {\n if (viewDuration <= 0) return [];\n\n const maxTicks = 6;\n const interval = pickInterval(viewDuration, maxTicks);\n\n const firstTick = Math.ceil(offset / interval) * interval;\n const markers: TimeMarker[] = [];\n\n for (let t = firstTick; t <= offset + viewDuration; t += interval) {\n const position = (t - offset) / viewDuration;\n if (position < -0.01 || position > 1.01) continue;\n markers.push({\n position: Math.min(Math.max(position, 0), 1),\n label: formatDuration(Math.abs(t), true),\n });\n if (markers.length >= MAX_MARKERS) break;\n }\n\n return markers;\n}\n\nexport function computeCompressedTimeMarkers(\n compression: TimeCompression,\n viewStart: number,\n viewEnd: number,\n rootStart: number\n): TimeMarker[] {\n const viewDuration = viewEnd - viewStart;\n if (viewDuration <= 0) return [];\n\n const maxTicks = 6;\n const interval = pickInterval(viewDuration, maxTicks);\n const offset = viewStart - rootStart;\n\n const firstTick = Math.ceil(offset / interval) * interval;\n const markers: TimeMarker[] = [];\n\n for (let t = firstTick; t <= offset + viewDuration; t += interval) {\n const absTime = rootStart + t;\n const position = compression.toVisual(absTime);\n if (position < -0.01 || position > 1.01) continue;\n markers.push({\n position: Math.min(Math.max(position, 0), 1),\n label: formatDuration(Math.abs(t), true),\n });\n if (markers.length >= MAX_MARKERS) break;\n }\n\n return markers;\n}\n\n// ---------------------------------------------------------------------------\n// Span gaps — time deltas between consecutive spans (Alt-key overlay)\n// ---------------------------------------------------------------------------\n\nexport interface SpanGap {\n gapMs: number;\n leftFrac: number;\n rightFrac: number;\n rowIndex: number;\n}\n\nexport function computeSpanGaps(\n spans: Span[],\n compression: TimeCompression\n): SpanGap[] {\n const gaps: SpanGap[] = [];\n for (let i = 0; i < spans.length - 1; i++) {\n const endTime = getHighResInMs(spans[i].endTime);\n const startTime = getHighResInMs(spans[i + 1].startTime);\n const gapMs = startTime - endTime;\n if (gapMs <= 0) continue;\n\n const leftFrac = compression.toVisual(endTime);\n const rightFrac = compression.toVisual(startTime);\n if (rightFrac - leftFrac < 0.001) continue;\n\n gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });\n }\n return gaps;\n}\n\n// ---------------------------------------------------------------------------\n// Resource colors\n// ---------------------------------------------------------------------------\n\nexport const RESOURCE_COLORS: Record<\n string,\n { bar: string; errorBar?: string }\n> = {\n run: { bar: 'var(--ds-blue-700)', errorBar: 'var(--ds-red-700)' },\n step: { bar: 'var(--ds-green-700)', errorBar: 'var(--ds-red-700)' },\n hook: { bar: 'var(--ds-amber-700)', errorBar: 'var(--ds-red-700)' },\n sleep: { bar: 'var(--ds-purple-700)', errorBar: 'var(--ds-red-700)' },\n default: { bar: 'var(--ds-gray-500)', errorBar: 'var(--ds-red-700)' },\n};\n\nexport function getResourceColor(resource: string): {\n bar: string;\n errorBar?: string;\n} {\n return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;\n}\n\n// ---------------------------------------------------------------------------\n// Span segments — split a timeline bar into colored sections by event state\n// ---------------------------------------------------------------------------\n\nexport type SegmentStatus =\n | 'queued'\n | 'running'\n | 'failed'\n | 'retrying'\n | 'succeeded'\n | 'waiting'\n | 'sleeping'\n | 'received';\n\nexport interface Segment {\n startFraction: number;\n endFraction: number;\n status: SegmentStatus;\n}\n\nfunction clampFraction(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction timeToFraction(\n time: number,\n spanStart: number,\n spanDuration: number\n): number {\n if (spanDuration <= 0) return 0;\n return clampFraction((time - spanStart) / spanDuration);\n}\n\ninterface EventMark {\n time: number;\n type: string;\n}\n\nfunction sortedEventMarks(\n events: SpanEvent[],\n relevantNames: string[]\n): EventMark[] {\n return events\n .filter((e) => relevantNames.includes(e.name))\n .map((e) => ({ time: getHighResInMs(e.timestamp), type: e.name }))\n .sort((a, b) => a.time - b.time);\n}\n\nfunction computeStepSegmentsFromSpan(\n startMs: number,\n duration: number,\n events: SpanEvent[]\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const marks = sortedEventMarks(events, [\n 'step_started',\n 'step_retrying',\n 'step_failed',\n 'step_completed',\n ]);\n\n if (marks.length === 0) {\n segments.push({ startFraction: 0, endFraction: 1, status: 'running' });\n return segments;\n }\n\n const firstFraction = timeToFraction(marks[0].time, startMs, duration);\n if (firstFraction > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: firstFraction,\n status: 'queued',\n });\n }\n\n for (let i = 0; i < marks.length; i++) {\n const mark = marks[i];\n const markFrac = timeToFraction(mark.time, startMs, duration);\n const nextMark = marks[i + 1];\n const nextFrac = nextMark\n ? timeToFraction(nextMark.time, startMs, duration)\n : 1;\n\n if (mark.type === 'step_started') {\n if (i === marks.length - 1) {\n segments.push({\n startFraction: markFrac,\n endFraction: 1,\n status: 'succeeded',\n });\n } else {\n const nextType = nextMark.type;\n const attemptStatus: SegmentStatus =\n nextType === 'step_retrying' || nextType === 'step_failed'\n ? 'failed'\n : nextType === 'step_completed'\n ? 'succeeded'\n : 'running';\n segments.push({\n startFraction: markFrac,\n endFraction: nextFrac,\n status: attemptStatus,\n });\n }\n } else if (mark.type === 'step_retrying') {\n segments.push({\n startFraction: markFrac,\n endFraction: nextFrac,\n status: 'retrying',\n });\n } else if (mark.type === 'step_failed') {\n if (markFrac < 0.999) {\n segments.push({\n startFraction: markFrac,\n endFraction: 1,\n status: 'failed',\n });\n }\n }\n }\n\n return segments;\n}\n\nfunction computeHookSegmentsFromSpan(\n startMs: number,\n duration: number,\n events: SpanEvent[]\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const sorted = [...events]\n .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))\n .sort((a, b) => a.time - b.time);\n\n const received = sorted.find((e) => e.name === 'hook_received');\n const disposed = sorted.find((e) => e.name === 'hook_disposed');\n\n if (!received && !disposed) {\n segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });\n return segments;\n }\n\n const receivedFrac = received\n ? timeToFraction(received.time, startMs, duration)\n : null;\n const disposedFrac = disposed\n ? timeToFraction(disposed.time, startMs, duration)\n : null;\n\n if (receivedFrac !== null && receivedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: receivedFrac,\n status: 'waiting',\n });\n } else if (receivedFrac === null && disposedFrac !== null) {\n segments.push({\n startFraction: 0,\n endFraction: disposedFrac,\n status: 'waiting',\n });\n }\n\n if (receivedFrac !== null) {\n segments.push({\n startFraction: receivedFrac,\n endFraction: disposedFrac ?? 1,\n status: 'received',\n });\n }\n\n if (disposedFrac !== null && disposedFrac < 0.999) {\n segments.push({\n startFraction: disposedFrac,\n endFraction: 1,\n status: 'succeeded',\n });\n }\n\n return segments;\n}\n\nfunction computeSleepSegmentsFromSpan(\n startMs: number,\n duration: number,\n events: SpanEvent[]\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const completedTime = events\n .filter((e) => e.name === 'wait_completed')\n .map((e) => getHighResInMs(e.timestamp))\n .sort((a, b) => a - b)[0];\n\n if (completedTime === undefined) {\n segments.push({ startFraction: 0, endFraction: 1, status: 'sleeping' });\n return segments;\n }\n\n const completedFrac = timeToFraction(completedTime, startMs, duration);\n if (completedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: completedFrac,\n status: 'sleeping',\n });\n }\n\n segments.push({\n startFraction: completedFrac,\n endFraction: 1,\n status: 'succeeded',\n });\n\n return segments;\n}\n\nfunction computeRunSegmentsFromSpan(\n startMs: number,\n duration: number,\n activeStartMs: number | undefined,\n events: SpanEvent[],\n attributes: Record<string, unknown>\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const sorted = [...events]\n .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))\n .sort((a, b) => a.time - b.time);\n\n const hasRunCreated = sorted.some((e) => e.name === 'run_created');\n\n if (!hasRunCreated) {\n const runData = attributes?.data as Record<string, unknown> | undefined;\n const runStatus = runData?.status as string | undefined;\n return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);\n }\n\n const failedEvent = sorted.find((e) => e.name === 'run_failed');\n\n let cursor = 0;\n if (activeStartMs !== undefined && activeStartMs > startMs) {\n const queuedFrac = timeToFraction(activeStartMs, startMs, duration);\n if (queuedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: queuedFrac,\n status: 'queued',\n });\n cursor = queuedFrac;\n }\n }\n\n segments.push({\n startFraction: cursor,\n endFraction: 1,\n status: failedEvent ? 'failed' : 'running',\n });\n\n return segments;\n}\n\nfunction computeV1RunSegments(\n startMs: number,\n duration: number,\n activeStartMs: number | undefined,\n runStatus: string | undefined\n): Segment[] {\n const segments: Segment[] = [];\n\n let cursor = 0;\n if (activeStartMs !== undefined && activeStartMs > startMs) {\n const queuedFrac = timeToFraction(activeStartMs, startMs, duration);\n if (queuedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: queuedFrac,\n status: 'queued',\n });\n cursor = queuedFrac;\n }\n }\n\n segments.push({\n startFraction: cursor,\n endFraction: 1,\n status: runStatus === 'failed' ? 'failed' : 'running',\n });\n\n return segments;\n}\n\n/**\n * Compute event-based segments for a span. Dispatches on `span.resource`\n * to the appropriate resource-type-specific segment builder.\n * Returns an empty array for generic (non-workflow) spans.\n */\nexport function computeSpanSegments(span: Span): Segment[] {\n const startMs = getHighResInMs(span.startTime);\n const endMs = getHighResInMs(span.endTime);\n const duration = endMs - startMs;\n const activeStartMs = span.activeStartTime\n ? getHighResInMs(span.activeStartTime)\n : undefined;\n\n switch (span.resource) {\n case 'step':\n return computeStepSegmentsFromSpan(startMs, duration, span.events);\n case 'hook':\n return computeHookSegmentsFromSpan(startMs, duration, span.events);\n case 'sleep':\n return computeSleepSegmentsFromSpan(startMs, duration, span.events);\n case 'run':\n return computeRunSegmentsFromSpan(\n startMs,\n duration,\n activeStartMs,\n span.events,\n span.attributes\n );\n default:\n return [];\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribute-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/attribute-panel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attribute-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/attribute-panel.tsx"],"names":[],"mappings":"AAwYA,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,MAQrD,CAAC;AAoBF,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmOD,eAAO,MAAM,cAAc,GAAI,mDAM5B;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,mDAiEA,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,uHAW5B;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,4CA2NA,CAAC"}
|
|
@@ -163,8 +163,29 @@ const sortByAttributeOrder = (a, b) => {
|
|
|
163
163
|
* Display names for attributes that should render differently from their key.
|
|
164
164
|
*/
|
|
165
165
|
const attributeDisplayNames = {
|
|
166
|
+
moduleSpecifier: 'Module',
|
|
167
|
+
workflowName: 'Workflow Name',
|
|
168
|
+
stepName: 'Step Name',
|
|
169
|
+
stepId: 'Step ID',
|
|
170
|
+
hookId: 'Hook ID',
|
|
171
|
+
attempt: 'Attempts',
|
|
172
|
+
eventId: 'Event ID',
|
|
173
|
+
runId: 'Run ID',
|
|
174
|
+
eventType: 'Event Type',
|
|
175
|
+
correlationId: 'Correlation ID',
|
|
176
|
+
deploymentId: 'Deployment ID',
|
|
177
|
+
specVersion: 'Spec Version',
|
|
166
178
|
workflowCoreVersion: '@workflow/core version',
|
|
167
|
-
|
|
179
|
+
createdAt: 'Created',
|
|
180
|
+
startedAt: 'Started',
|
|
181
|
+
updatedAt: 'Updated',
|
|
182
|
+
completedAt: 'Completed',
|
|
183
|
+
expiredAt: 'Expired',
|
|
184
|
+
retryAfter: 'Retry After',
|
|
185
|
+
resumeAt: 'Resume',
|
|
186
|
+
lastReceivedAt: 'Last Received',
|
|
187
|
+
disposedAt: 'Disposed',
|
|
188
|
+
receivedCount: 'Times Resolved',
|
|
168
189
|
};
|
|
169
190
|
/**
|
|
170
191
|
* Get the display name for an attribute key.
|
|
@@ -229,16 +250,16 @@ const timestampWithTooltipOrNull = (value) => {
|
|
|
229
250
|
};
|
|
230
251
|
const attributeToDisplayFn = {
|
|
231
252
|
// Names that need pretty-printing
|
|
232
|
-
workflowName: (
|
|
253
|
+
workflowName: (_value) => null,
|
|
233
254
|
moduleSpecifier: (value) => getModuleSpecifierFromName(value),
|
|
234
|
-
stepName: (
|
|
255
|
+
stepName: (_value) => null,
|
|
235
256
|
// IDs
|
|
236
|
-
runId: (
|
|
237
|
-
stepId: (
|
|
257
|
+
runId: (_value) => null,
|
|
258
|
+
stepId: (_value) => null,
|
|
238
259
|
hookId: (value) => String(value),
|
|
239
260
|
eventId: (value) => String(value),
|
|
240
261
|
// Run/step details
|
|
241
|
-
status: (
|
|
262
|
+
status: (_value) => null,
|
|
242
263
|
attempt: (value) => String(value),
|
|
243
264
|
// Hook details
|
|
244
265
|
token: (value) => String(value),
|
|
@@ -261,9 +282,9 @@ const attributeToDisplayFn = {
|
|
|
261
282
|
// Dates — wrapped with TimestampTooltip showing UTC/local + relative time
|
|
262
283
|
createdAt: timestampWithTooltipOrNull,
|
|
263
284
|
startedAt: timestampWithTooltipOrNull,
|
|
264
|
-
updatedAt:
|
|
285
|
+
updatedAt: (_value) => null,
|
|
265
286
|
completedAt: timestampWithTooltipOrNull,
|
|
266
|
-
expiredAt:
|
|
287
|
+
expiredAt: (_value) => null,
|
|
267
288
|
retryAfter: timestampWithTooltipOrNull,
|
|
268
289
|
resumeAt: timestampWithTooltipOrNull,
|
|
269
290
|
// Resolved attributes, won't actually use this function
|
|
@@ -298,9 +319,9 @@ const attributeToDisplayFn = {
|
|
|
298
319
|
}
|
|
299
320
|
// Don't render an empty "Input (0 arguments)" card when no input exists.
|
|
300
321
|
if (!hasArgs && !hasClosureVars && !hasThisVal) {
|
|
301
|
-
return (_jsx(DetailCard, { summary: "Input (no data)", disabled: true, summaryClassName: "text-
|
|
322
|
+
return (_jsx(DetailCard, { summary: "Input (no data)", disabled: true, summaryClassName: "text-label-14 font-medium py-2" }));
|
|
302
323
|
}
|
|
303
|
-
return (_jsxs(_Fragment, { children: [_jsx(DetailCard, { summary: `Input (${argCount} ${argLabel})`, summaryClassName: "text-
|
|
324
|
+
return (_jsxs(_Fragment, { children: [_jsx(DetailCard, { summary: `Input (${argCount} ${argLabel})`, summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: Array.isArray(args)
|
|
304
325
|
? args.map((v, i) => (_jsx("div", { className: "mt-2 first:mt-0", children: JsonBlock(v) }, i)))
|
|
305
326
|
: JsonBlock(args) }), hasClosureVars && (_jsx(DetailCard, { summary: "Closure Variables", children: JsonBlock(closureVars) })), hasThisVal && (_jsx(DetailCard, { summary: "this", children: JsonBlock(thisVal) }))] }));
|
|
306
327
|
}
|
|
@@ -308,9 +329,9 @@ const attributeToDisplayFn = {
|
|
|
308
329
|
const argCount = Array.isArray(value) ? value.length : 0;
|
|
309
330
|
const argLabel = argCount === 1 ? 'argument' : 'arguments';
|
|
310
331
|
if (!hasDisplayContent(value)) {
|
|
311
|
-
return (_jsx(DetailCard, { summary: "Input (no data)", disabled: true, summaryClassName: "text-
|
|
332
|
+
return (_jsx(DetailCard, { summary: "Input (no data)", disabled: true, summaryClassName: "text-label-14 font-medium py-2" }));
|
|
312
333
|
}
|
|
313
|
-
return (_jsx(DetailCard, { summary: `Input (${argCount} ${argLabel})`, summaryClassName: "text-
|
|
334
|
+
return (_jsx(DetailCard, { summary: `Input (${argCount} ${argLabel})`, summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: Array.isArray(value)
|
|
314
335
|
? value.map((v, i) => (_jsx("div", { className: "mt-2 first:mt-0", children: JsonBlock(v) }, i)))
|
|
315
336
|
: JsonBlock(value) }));
|
|
316
337
|
},
|
|
@@ -321,7 +342,7 @@ const attributeToDisplayFn = {
|
|
|
321
342
|
return _jsx(EncryptedFieldBlock, {});
|
|
322
343
|
if (isExpiredMarker(value))
|
|
323
344
|
return _jsx(ExpiredFieldBlock, {});
|
|
324
|
-
return (_jsx(DetailCard, { summary: "Output", summaryClassName: "text-
|
|
345
|
+
return (_jsx(DetailCard, { summary: "Output", summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: JsonBlock(value) }));
|
|
325
346
|
},
|
|
326
347
|
error: (value) => {
|
|
327
348
|
if (isEncryptedMarker(value))
|
|
@@ -333,9 +354,9 @@ const attributeToDisplayFn = {
|
|
|
333
354
|
// If the error object has a `stack` field, render it as readable
|
|
334
355
|
// pre-formatted text. Otherwise fall back to the raw JSON viewer.
|
|
335
356
|
if (isStructuredErrorWithStack(value)) {
|
|
336
|
-
return (_jsx(DetailCard, { summary: "Error", summaryClassName: "text-
|
|
357
|
+
return (_jsx(DetailCard, { summary: "Error", summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: _jsx(ErrorStackBlock, { value: value }) }));
|
|
337
358
|
}
|
|
338
|
-
return (_jsx(DetailCard, { summary: "Error", summaryClassName: "text-
|
|
359
|
+
return (_jsx(DetailCard, { summary: "Error", summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: JsonBlock(value) }));
|
|
339
360
|
},
|
|
340
361
|
eventData: (value) => {
|
|
341
362
|
if (isEncryptedMarker(value))
|
|
@@ -360,11 +381,9 @@ const ExpiredDataMessage = () => (_jsx("div", { className: "text-copy-12 rounded
|
|
|
360
381
|
color: 'var(--ds-gray-700)',
|
|
361
382
|
}, children: _jsx("span", { children: "The data for this run has expired and is no longer available." }) }));
|
|
362
383
|
export const AttributeBlock = ({ attribute, value, isLoading, inline = false, context, }) => {
|
|
363
|
-
const isExpandableLoadingTarget = attribute === 'input' ||
|
|
364
|
-
attribute === 'output' ||
|
|
365
|
-
attribute === 'eventData';
|
|
384
|
+
const isExpandableLoadingTarget = attribute === 'input' || attribute === 'eventData';
|
|
366
385
|
if (isLoading && isExpandableLoadingTarget && !hasDisplayContent(value)) {
|
|
367
|
-
return (_jsxs("div", { className: `my-2 flex flex-col ${attribute === 'input'
|
|
386
|
+
return (_jsxs("div", { className: `my-2 flex flex-col ${attribute === 'input' ? 'gap-2 my-3.5' : 'gap-0'}`, children: [_jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" })] }));
|
|
368
387
|
}
|
|
369
388
|
const displayFn = attributeToDisplayFn[attribute];
|
|
370
389
|
if (!displayFn) {
|
|
@@ -377,7 +396,7 @@ export const AttributeBlock = ({ attribute, value, isLoading, inline = false, co
|
|
|
377
396
|
if (inline) {
|
|
378
397
|
return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-[11px] font-medium", style: { color: 'var(--ds-gray-700)' }, children: attribute }), _jsx("span", { className: "text-[11px]", style: { color: 'var(--ds-gray-1000)' }, children: displayValue })] }));
|
|
379
398
|
}
|
|
380
|
-
return (_jsxs("div", { className: "relative", children: [typeof isLoading === 'boolean' && isLoading && (_jsx("div", { className: "absolute top-9 right-4", children: _jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2", style: { borderColor: 'var(--ds-gray-900)' } }) })), _jsxs("div", { className: `my-2 flex flex-col ${attribute === 'input' || attribute === 'output' || attribute === 'error' ? 'gap-2 my-3.5' : 'gap-0'}`, children: [_jsx("span", { className:
|
|
399
|
+
return (_jsxs("div", { className: "relative", children: [typeof isLoading === 'boolean' && isLoading && (_jsx("div", { className: "absolute top-9 right-4", children: _jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2", style: { borderColor: 'var(--ds-gray-900)' } }) })), _jsxs("div", { className: `my-2 flex flex-col ${attribute === 'input' || attribute === 'output' || attribute === 'error' ? 'gap-2 my-3.5' : 'gap-0'}`, children: [_jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), _jsx("span", { className: "text-xs", style: { color: 'var(--ds-gray-1000)' }, children: displayValue })] }, attribute)] }));
|
|
381
400
|
};
|
|
382
401
|
export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expiredAt, onStreamClick, onRunClick, onDecrypt, isDecrypting = false, resource, }) => {
|
|
383
402
|
const toast = useToast();
|
|
@@ -409,9 +428,9 @@ export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expire
|
|
|
409
428
|
.sort(sortByAttributeOrder);
|
|
410
429
|
if (!isLoading)
|
|
411
430
|
return present;
|
|
412
|
-
// During loading, ensure input
|
|
431
|
+
// During loading, ensure input appears so its skeleton renders
|
|
413
432
|
// in the correct position (above the events section).
|
|
414
|
-
const loadingDefaults = ['input'
|
|
433
|
+
const loadingDefaults = ['input'];
|
|
415
434
|
for (const key of loadingDefaults) {
|
|
416
435
|
if (!present.includes(key)) {
|
|
417
436
|
present.push(key);
|
|
@@ -462,7 +481,7 @@ export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expire
|
|
|
462
481
|
toast.error('Failed to copy moduleSpecifier');
|
|
463
482
|
});
|
|
464
483
|
}, []);
|
|
465
|
-
return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { children: [visibleBasicAttributes.length > 0 && (_jsxs("div", { className: "mb-3 flex flex-col overflow-hidden rounded-
|
|
484
|
+
return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { children: [visibleBasicAttributes.length > 0 && (_jsxs("div", { className: "mb-3 flex flex-col overflow-hidden rounded-md border", style: {
|
|
466
485
|
borderColor: 'var(--ds-gray-300)',
|
|
467
486
|
}, children: [orderedBasicAttributes.map((attribute, index) => {
|
|
468
487
|
const displayValue = attributeToDisplayFn[attribute]?.(displayData[attribute]);
|