@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/components/index.d.ts +2 -0
  2. package/dist/components/index.d.ts.map +1 -1
  3. package/dist/components/index.js +2 -0
  4. package/dist/components/index.js.map +1 -1
  5. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  6. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  7. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  8. package/dist/components/new-trace-viewer/components/copy-button.js.map +1 -0
  9. package/dist/components/new-trace-viewer/components/event-list.d.ts +8 -0
  10. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  11. package/dist/components/new-trace-viewer/components/event-list.js +38 -0
  12. package/dist/components/new-trace-viewer/components/event-list.js.map +1 -0
  13. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  14. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  15. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +1 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +1 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +1 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  28. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +1 -0
  29. package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  31. package/dist/components/new-trace-viewer/components/split-pane.js +99 -0
  32. package/dist/components/new-trace-viewer/components/split-pane.js.map +1 -0
  33. package/dist/components/new-trace-viewer/components/timeline.d.ts +31 -0
  34. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  35. package/dist/components/new-trace-viewer/components/timeline.js +138 -0
  36. package/dist/components/new-trace-viewer/components/timeline.js.map +1 -0
  37. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  38. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/context.js +47 -0
  40. package/dist/components/new-trace-viewer/context.js.map +1 -0
  41. package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
  42. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
  43. package/dist/components/new-trace-viewer/detail-panel.js +12 -0
  44. package/dist/components/new-trace-viewer/detail-panel.js.map +1 -0
  45. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  46. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  47. package/dist/components/new-trace-viewer/icons.js +15 -0
  48. package/dist/components/new-trace-viewer/icons.js.map +1 -0
  49. package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
  50. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  51. package/dist/components/new-trace-viewer/trace-viewer.js +349 -0
  52. package/dist/components/new-trace-viewer/trace-viewer.js.map +1 -0
  53. package/dist/components/new-trace-viewer/types.d.ts +1 -0
  54. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  55. package/dist/components/new-trace-viewer/types.js +2 -0
  56. package/dist/components/new-trace-viewer/types.js.map +1 -0
  57. package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
  58. package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
  59. package/dist/components/new-trace-viewer/util/constants.js +2 -0
  60. package/dist/components/new-trace-viewer/util/constants.js.map +1 -0
  61. package/dist/components/new-trace-viewer/utils.d.ts +42 -0
  62. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  63. package/dist/components/new-trace-viewer/utils.js +305 -0
  64. package/dist/components/new-trace-viewer/utils.js.map +1 -0
  65. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  66. package/dist/components/sidebar/attribute-panel.js +42 -23
  67. package/dist/components/sidebar/attribute-panel.js.map +1 -1
  68. package/dist/components/sidebar/copyable-data-block.js +1 -1
  69. package/dist/components/sidebar/copyable-data-block.js.map +1 -1
  70. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  71. package/dist/components/sidebar/detail-card.js +1 -1
  72. package/dist/components/sidebar/detail-card.js.map +1 -1
  73. package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
  74. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  75. package/dist/components/sidebar/entity-detail-panel.js +3 -25
  76. package/dist/components/sidebar/entity-detail-panel.js.map +1 -1
  77. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  78. package/dist/components/sidebar/events-list.js +2 -2
  79. package/dist/components/sidebar/events-list.js.map +1 -1
  80. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  81. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  82. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  83. package/dist/components/sidebar/sidebar-data-context.js.map +1 -0
  84. package/dist/components/stream-viewer.d.ts +1 -1
  85. package/dist/components/stream-viewer.d.ts.map +1 -1
  86. package/dist/components/stream-viewer.js +2 -26
  87. package/dist/components/stream-viewer.js.map +1 -1
  88. package/dist/components/trace-viewer/util/timing.d.ts +1 -1
  89. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  90. package/dist/components/trace-viewer/util/timing.js +5 -8
  91. package/dist/components/trace-viewer/util/timing.js.map +1 -1
  92. package/dist/components/trace-viewer-new.d.ts +10 -0
  93. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  94. package/dist/components/trace-viewer-new.js +23 -0
  95. package/dist/components/trace-viewer-new.js.map +1 -0
  96. package/dist/components/ui/data-inspector.d.ts +21 -0
  97. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  98. package/dist/components/ui/data-inspector.js +99 -4
  99. package/dist/components/ui/data-inspector.js.map +1 -1
  100. package/dist/components/ui/inspector-theme.d.ts +9 -10
  101. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  102. package/dist/components/ui/inspector-theme.js +38 -71
  103. package/dist/components/ui/inspector-theme.js.map +1 -1
  104. package/dist/components/workflow-trace-view.d.ts +1 -3
  105. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  106. package/dist/components/workflow-trace-view.js +4 -4
  107. package/dist/components/workflow-trace-view.js.map +1 -1
  108. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  109. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  110. package/dist/components/workflow-traces/trace-span-construction.js +16 -3
  111. package/dist/components/workflow-traces/trace-span-construction.js.map +1 -1
  112. package/dist/index.d.ts +1 -0
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/lib/stream-display.d.ts +18 -0
  116. package/dist/lib/stream-display.d.ts.map +1 -0
  117. package/dist/lib/stream-display.js +30 -0
  118. package/dist/lib/stream-display.js.map +1 -0
  119. package/dist/lib/trace-builder.d.ts.map +1 -1
  120. package/dist/lib/trace-builder.js +2 -1
  121. package/dist/lib/trace-builder.js.map +1 -1
  122. package/dist/lib/utils.d.ts +9 -9
  123. package/dist/lib/utils.d.ts.map +1 -1
  124. package/dist/lib/utils.js +26 -31
  125. package/dist/lib/utils.js.map +1 -1
  126. package/dist/styles.css +470 -1
  127. package/package.json +3 -2
  128. package/src/components/index.ts +5 -0
  129. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  130. package/src/components/new-trace-viewer/components/event-list.tsx +116 -0
  131. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  132. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  133. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  134. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  135. package/src/components/new-trace-viewer/components/split-pane.tsx +185 -0
  136. package/src/components/new-trace-viewer/components/timeline.tsx +382 -0
  137. package/src/components/new-trace-viewer/context.tsx +92 -0
  138. package/src/components/new-trace-viewer/detail-panel.tsx +58 -0
  139. package/src/components/new-trace-viewer/icons.tsx +79 -0
  140. package/src/components/new-trace-viewer/trace-viewer.tsx +645 -0
  141. package/src/components/new-trace-viewer/types.ts +0 -0
  142. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  143. package/src/components/new-trace-viewer/utils.ts +450 -0
  144. package/src/components/sidebar/attribute-panel.tsx +43 -32
  145. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  146. package/src/components/sidebar/detail-card.tsx +1 -19
  147. package/src/components/sidebar/entity-detail-panel.tsx +0 -71
  148. package/src/components/sidebar/events-list.tsx +9 -6
  149. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  150. package/src/components/stream-viewer.tsx +18 -40
  151. package/src/components/trace-viewer/util/timing.ts +5 -9
  152. package/src/components/trace-viewer-new.tsx +49 -0
  153. package/src/components/ui/data-inspector.tsx +235 -4
  154. package/src/components/ui/inspector-theme.ts +39 -81
  155. package/src/components/workflow-trace-view.tsx +2 -6
  156. package/src/components/workflow-traces/trace-span-construction.ts +22 -4
  157. package/src/index.ts +1 -0
  158. package/src/lib/stream-display.ts +48 -0
  159. package/src/lib/trace-builder.ts +2 -1
  160. package/src/lib/utils.ts +27 -32
  161. package/src/styles.css +470 -1
@@ -0,0 +1,305 @@
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 getSpanDurationMs(span) {
20
+ return Math.max(0, getHighResInMs(span.endTime) - getHighResInMs(span.startTime));
21
+ }
22
+ const NICE_INTERVALS = [
23
+ 1, 2, 5, 10, 20, 50, 100, 200, 500, 1_000, 2_000, 5_000, 10_000, 20_000,
24
+ 50_000, 100_000, 200_000, 500_000, 1_000_000, 2_000_000, 5_000_000,
25
+ 10_000_000, 20_000_000, 50_000_000, 100_000_000, 200_000_000, 500_000_000,
26
+ 1_000_000_000, 2_000_000_000, 5_000_000_000,
27
+ ];
28
+ const MAX_MARKERS = 8;
29
+ function pickInterval(viewDuration, maxTicks) {
30
+ for (const interval of NICE_INTERVALS) {
31
+ if (viewDuration / interval <= maxTicks)
32
+ return interval;
33
+ }
34
+ return NICE_INTERVALS[NICE_INTERVALS.length - 1];
35
+ }
36
+ export function computeTimeMarkers(viewDuration, offset) {
37
+ if (viewDuration <= 0)
38
+ return [];
39
+ const maxTicks = 6;
40
+ const interval = pickInterval(viewDuration, maxTicks);
41
+ const firstTick = Math.ceil(offset / interval) * interval;
42
+ const markers = [];
43
+ for (let t = firstTick; t <= offset + viewDuration; t += interval) {
44
+ const position = (t - offset) / viewDuration;
45
+ if (position < -0.01 || position > 1.01)
46
+ continue;
47
+ markers.push({
48
+ position: Math.min(Math.max(position, 0), 1),
49
+ label: formatDuration(Math.abs(t), true),
50
+ value: t,
51
+ });
52
+ if (markers.length >= MAX_MARKERS)
53
+ break;
54
+ }
55
+ return markers;
56
+ }
57
+ export function computeSpanGaps(spans, viewStart, viewEnd) {
58
+ const range = viewEnd - viewStart;
59
+ if (range <= 0)
60
+ return [];
61
+ const gaps = [];
62
+ for (let i = 0; i < spans.length - 1; i++) {
63
+ const endTime = getHighResInMs(spans[i].endTime);
64
+ const startTime = getHighResInMs(spans[i + 1].startTime);
65
+ const gapMs = startTime - endTime;
66
+ if (gapMs <= 0)
67
+ continue;
68
+ const leftFrac = Math.min(Math.max((endTime - viewStart) / range, 0), 1);
69
+ const rightFrac = Math.min(Math.max((startTime - viewStart) / range, 0), 1);
70
+ if (rightFrac - leftFrac < 0.001)
71
+ continue;
72
+ gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
73
+ }
74
+ return gaps;
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Resource colors
78
+ // ---------------------------------------------------------------------------
79
+ export const RESOURCE_COLORS = {
80
+ run: { bar: 'var(--ds-blue-700)', errorBar: 'var(--ds-red-700)' },
81
+ step: { bar: 'var(--ds-green-700)', errorBar: 'var(--ds-red-700)' },
82
+ hook: { bar: 'var(--ds-amber-700)', errorBar: 'var(--ds-red-700)' },
83
+ sleep: { bar: 'var(--ds-purple-700)', errorBar: 'var(--ds-red-700)' },
84
+ default: { bar: 'var(--ds-gray-500)', errorBar: 'var(--ds-red-700)' },
85
+ };
86
+ export function getResourceColor(resource) {
87
+ return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
88
+ }
89
+ function clampFraction(value) {
90
+ return Math.max(0, Math.min(1, value));
91
+ }
92
+ function timeToFraction(time, spanStart, spanDuration) {
93
+ if (spanDuration <= 0)
94
+ return 0;
95
+ return clampFraction((time - spanStart) / spanDuration);
96
+ }
97
+ function sortedEventMarks(events, relevantNames) {
98
+ return events
99
+ .filter((e) => relevantNames.includes(e.name))
100
+ .map((e) => ({ time: getHighResInMs(e.timestamp), type: e.name }))
101
+ .sort((a, b) => a.time - b.time);
102
+ }
103
+ function computeStepSegmentsFromSpan(startMs, duration, events) {
104
+ const segments = [];
105
+ if (duration <= 0)
106
+ return segments;
107
+ const marks = sortedEventMarks(events, [
108
+ 'step_started',
109
+ 'step_retrying',
110
+ 'step_failed',
111
+ 'step_completed',
112
+ ]);
113
+ if (marks.length === 0) {
114
+ segments.push({ startFraction: 0, endFraction: 1, status: 'running' });
115
+ return segments;
116
+ }
117
+ const firstFraction = timeToFraction(marks[0].time, startMs, duration);
118
+ if (firstFraction > 0.001) {
119
+ segments.push({
120
+ startFraction: 0,
121
+ endFraction: firstFraction,
122
+ status: 'queued',
123
+ });
124
+ }
125
+ for (let i = 0; i < marks.length; i++) {
126
+ const mark = marks[i];
127
+ const markFrac = timeToFraction(mark.time, startMs, duration);
128
+ const nextMark = marks[i + 1];
129
+ const nextFrac = nextMark
130
+ ? timeToFraction(nextMark.time, startMs, duration)
131
+ : 1;
132
+ if (mark.type === 'step_started') {
133
+ if (i === marks.length - 1) {
134
+ segments.push({
135
+ startFraction: markFrac,
136
+ endFraction: 1,
137
+ status: 'succeeded',
138
+ });
139
+ }
140
+ else {
141
+ const nextType = nextMark.type;
142
+ const attemptStatus = nextType === 'step_retrying' || nextType === 'step_failed'
143
+ ? 'failed'
144
+ : nextType === 'step_completed'
145
+ ? 'succeeded'
146
+ : 'running';
147
+ segments.push({
148
+ startFraction: markFrac,
149
+ endFraction: nextFrac,
150
+ status: attemptStatus,
151
+ });
152
+ }
153
+ }
154
+ else if (mark.type === 'step_retrying') {
155
+ segments.push({
156
+ startFraction: markFrac,
157
+ endFraction: nextFrac,
158
+ status: 'retrying',
159
+ });
160
+ }
161
+ else if (mark.type === 'step_failed') {
162
+ if (markFrac < 0.999) {
163
+ segments.push({
164
+ startFraction: markFrac,
165
+ endFraction: 1,
166
+ status: 'failed',
167
+ });
168
+ }
169
+ }
170
+ }
171
+ return segments;
172
+ }
173
+ function computeHookSegmentsFromSpan(startMs, duration, events) {
174
+ const segments = [];
175
+ if (duration <= 0)
176
+ return segments;
177
+ const sorted = [...events]
178
+ .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
179
+ .sort((a, b) => a.time - b.time);
180
+ const received = sorted.find((e) => e.name === 'hook_received');
181
+ const disposed = sorted.find((e) => e.name === 'hook_disposed');
182
+ if (!received && !disposed) {
183
+ segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });
184
+ return segments;
185
+ }
186
+ const receivedFrac = received
187
+ ? timeToFraction(received.time, startMs, duration)
188
+ : null;
189
+ const disposedFrac = disposed
190
+ ? timeToFraction(disposed.time, startMs, duration)
191
+ : null;
192
+ if (receivedFrac !== null && receivedFrac > 0.001) {
193
+ segments.push({
194
+ startFraction: 0,
195
+ endFraction: receivedFrac,
196
+ status: 'waiting',
197
+ });
198
+ }
199
+ else if (receivedFrac === null && disposedFrac !== null) {
200
+ segments.push({
201
+ startFraction: 0,
202
+ endFraction: disposedFrac,
203
+ status: 'waiting',
204
+ });
205
+ }
206
+ if (receivedFrac !== null) {
207
+ segments.push({
208
+ startFraction: receivedFrac,
209
+ endFraction: disposedFrac ?? 1,
210
+ status: 'received',
211
+ });
212
+ }
213
+ if (disposedFrac !== null && disposedFrac < 0.999) {
214
+ segments.push({
215
+ startFraction: disposedFrac,
216
+ endFraction: 1,
217
+ status: 'succeeded',
218
+ });
219
+ }
220
+ return segments;
221
+ }
222
+ function computeSleepSegmentsFromSpan(_startMs, duration, _events) {
223
+ if (duration <= 0)
224
+ return [];
225
+ return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];
226
+ }
227
+ function computeRunSegmentsFromSpan(startMs, duration, activeStartMs, events, attributes) {
228
+ const segments = [];
229
+ if (duration <= 0)
230
+ return segments;
231
+ const sorted = [...events]
232
+ .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
233
+ .sort((a, b) => a.time - b.time);
234
+ const hasRunCreated = sorted.some((e) => e.name === 'run_created');
235
+ if (!hasRunCreated) {
236
+ const runData = attributes?.data;
237
+ const runStatus = runData?.status;
238
+ return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);
239
+ }
240
+ const failedEvent = sorted.find((e) => e.name === 'run_failed');
241
+ let cursor = 0;
242
+ if (activeStartMs !== undefined && activeStartMs > startMs) {
243
+ const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
244
+ if (queuedFrac > 0.001) {
245
+ segments.push({
246
+ startFraction: 0,
247
+ endFraction: queuedFrac,
248
+ status: 'queued',
249
+ });
250
+ cursor = queuedFrac;
251
+ }
252
+ }
253
+ segments.push({
254
+ startFraction: cursor,
255
+ endFraction: 1,
256
+ status: failedEvent ? 'failed' : 'running',
257
+ });
258
+ return segments;
259
+ }
260
+ function computeV1RunSegments(startMs, duration, activeStartMs, runStatus) {
261
+ const segments = [];
262
+ let cursor = 0;
263
+ if (activeStartMs !== undefined && activeStartMs > startMs) {
264
+ const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
265
+ if (queuedFrac > 0.001) {
266
+ segments.push({
267
+ startFraction: 0,
268
+ endFraction: queuedFrac,
269
+ status: 'queued',
270
+ });
271
+ cursor = queuedFrac;
272
+ }
273
+ }
274
+ segments.push({
275
+ startFraction: cursor,
276
+ endFraction: 1,
277
+ status: runStatus === 'failed' ? 'failed' : 'running',
278
+ });
279
+ return segments;
280
+ }
281
+ /**
282
+ * Compute event-based segments for a span. Dispatches on `span.resource`
283
+ * to the appropriate resource-type-specific segment builder.
284
+ * Returns an empty array for generic (non-workflow) spans.
285
+ */
286
+ export function computeSpanSegments(span) {
287
+ const startMs = getHighResInMs(span.startTime);
288
+ const duration = getSpanDurationMs(span);
289
+ const activeStartMs = span.activeStartTime
290
+ ? getHighResInMs(span.activeStartTime)
291
+ : undefined;
292
+ switch (span.resource) {
293
+ case 'step':
294
+ return computeStepSegmentsFromSpan(startMs, duration, span.events);
295
+ case 'hook':
296
+ return computeHookSegmentsFromSpan(startMs, duration, span.events);
297
+ case 'sleep':
298
+ return computeSleepSegmentsFromSpan(startMs, duration, span.events);
299
+ case 'run':
300
+ return computeRunSegmentsFromSpan(startMs, duration, activeStartMs, span.events, span.attributes);
301
+ default:
302
+ return [];
303
+ }
304
+ }
305
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAY7E,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACxC,IAAI,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,QAAQ;YAAE,QAAQ,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,MAAM;YAAE,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,OAAO,IAAI,CAAC,GAAG,CACb,CAAC,EACD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAC9D,CAAC;AACJ,CAAC;AAYD,MAAM,cAAc,GAAG;IACrB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IACvE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAClE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW;IACzE,aAAa,EAAE,aAAa,EAAE,aAAa;CAC5C,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,SAAS,YAAY,CAAC,YAAoB,EAAE,QAAgB;IAC1D,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,YAAY,GAAG,QAAQ,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAC3D,CAAC;IACD,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,MAAc;IAEd,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,QAAQ,GAAG,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;IAC1D,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,MAAM,GAAG,YAAY,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,YAAY,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,IAAI;YAAE,SAAS;QAClD,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACxC,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW;YAAE,MAAM;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAaD,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,SAAiB,EACjB,OAAe;IAEf,MAAM,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;IAClC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;QAClC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAS;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAI,SAAS,GAAG,QAAQ,GAAG,KAAK;YAAE,SAAS;QAE3C,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAGxB;IACF,GAAG,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACjE,IAAI,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACnE,IAAI,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACnE,KAAK,EAAE,EAAE,GAAG,EAAE,sBAAsB,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACrE,OAAO,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,EAAE;CACtE,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAI/C,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC;AAC9D,CAAC;AAsBD,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CACrB,IAAY,EACZ,SAAiB,EACjB,YAAoB;IAEpB,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,aAAa,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC;AAC1D,CAAC;AAOD,SAAS,gBAAgB,CACvB,MAAmB,EACnB,aAAuB;IAEvB,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SACjE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,2BAA2B,CAClC,OAAe,EACf,QAAgB,EAChB,MAAmB;IAEnB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEnC,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE;QACrC,cAAc;QACd,eAAe;QACf,aAAa;QACb,gBAAgB;KACjB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvE,IAAI,aAAa,GAAG,KAAK,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,aAAa;YAC1B,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;YAClD,CAAC,CAAC,CAAC,CAAC;QAEN,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC;oBACZ,aAAa,EAAE,QAAQ;oBACvB,WAAW,EAAE,CAAC;oBACd,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAC/B,MAAM,aAAa,GACjB,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK,aAAa;oBACxD,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,QAAQ,KAAK,gBAAgB;wBAC7B,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,SAAS,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC;oBACZ,aAAa,EAAE,QAAQ;oBACvB,WAAW,EAAE,QAAQ;oBACrB,MAAM,EAAE,aAAa;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACZ,aAAa,EAAE,QAAQ;gBACvB,WAAW,EAAE,QAAQ;gBACrB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACvC,IAAI,QAAQ,GAAG,KAAK,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC;oBACZ,aAAa,EAAE,QAAQ;oBACvB,WAAW,EAAE,CAAC;oBACd,MAAM,EAAE,QAAQ;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,2BAA2B,CAClC,OAAe,EACf,QAAgB,EAChB,MAAmB;IAEnB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;SACjE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAEhE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC;YACZ,aAAa,EAAE,YAAY;YAC3B,WAAW,EAAE,YAAY,IAAI,CAAC;YAC9B,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC;YACZ,aAAa,EAAE,YAAY;YAC3B,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAgB,EAChB,QAAgB,EAChB,OAAoB;IAEpB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,0BAA0B,CACjC,OAAe,EACf,QAAgB,EAChB,aAAiC,EACjC,MAAmB,EACnB,UAAmC;IAEnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;SACjE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAEnE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,UAAU,EAAE,IAA2C,CAAC;QACxE,MAAM,SAAS,GAAG,OAAO,EAAE,MAA4B,CAAC;QACxD,OAAO,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAEhE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,GAAG,OAAO,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YACH,MAAM,GAAG,UAAU,CAAC;QACtB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;QACZ,aAAa,EAAE,MAAM;QACrB,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KAC3C,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAe,EACf,QAAgB,EAChB,aAAiC,EACjC,SAA6B;IAE7B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,GAAG,OAAO,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,UAAU,GAAG,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YACH,MAAM,GAAG,UAAU,CAAC;QACtB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;QACZ,aAAa,EAAE,MAAM;QACrB,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACtD,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe;QACxC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;QACtC,CAAC,CAAC,SAAS,CAAC;IAEd,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,2BAA2B,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,KAAK,MAAM;YACT,OAAO,2BAA2B,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,KAAK,OAAO;YACV,OAAO,4BAA4B,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,KAAK,KAAK;YACR,OAAO,0BAA0B,CAC/B,OAAO,EACP,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAU,CAChB,CAAC;QACJ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC","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\nexport function getSpanDurationMs(span: Span): number {\n return Math.max(\n 0,\n getHighResInMs(span.endTime) - getHighResInMs(span.startTime)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Time markers\n// ---------------------------------------------------------------------------\n\nexport interface TimeMarker {\n position: number;\n label: string;\n value: number;\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 value: t,\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 viewStart: number,\n viewEnd: number\n): SpanGap[] {\n const range = viewEnd - viewStart;\n if (range <= 0) return [];\n\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 = Math.min(Math.max((endTime - viewStart) / range, 0), 1);\n const rightFrac = Math.min(Math.max((startTime - viewStart) / range, 0), 1);\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 if (duration <= 0) return [];\n return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];\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 duration = getSpanDurationMs(span);\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":"AAmXA,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,MAQrD,CAAC;AAoBF,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqOD,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,mDAyEA,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"}
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
- receivedCount: 'times resolved',
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: (value) => parseWorkflowName(String(value))?.shortName ?? '?',
253
+ workflowName: (_value) => null,
233
254
  moduleSpecifier: (value) => getModuleSpecifierFromName(value),
234
- stepName: (value) => parseStepName(String(value))?.shortName ?? String(value),
255
+ stepName: (_value) => null,
235
256
  // IDs
236
- runId: (value) => String(value),
237
- stepId: (value) => String(value),
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: (value) => String(value),
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: timestampWithTooltipOrNull,
285
+ updatedAt: (_value) => null,
265
286
  completedAt: timestampWithTooltipOrNull,
266
- expiredAt: timestampWithTooltipOrNull,
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-base py-2" }));
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-base py-2", contentClassName: "mt-0", children: Array.isArray(args)
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-base py-2" }));
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-base py-2", contentClassName: "mt-0", children: Array.isArray(value)
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-base py-2", contentClassName: "mt-0", children: JsonBlock(value) }));
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-base py-2", contentClassName: "mt-0", children: _jsx(ErrorStackBlock, { value: value }) }));
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-base py-2", contentClassName: "mt-0", children: JsonBlock(value) }));
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' || attribute === 'output' ? 'gap-2 my-3.5' : 'gap-0'}`, children: [_jsx("span", { className: `${attribute === 'input' || attribute === 'output' ? 'text-base' : 'text-xs'} font-medium first-letter:uppercase`, style: { color: 'var(--ds-gray-700)' }, children: attribute }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" })] }));
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: `${attribute === 'input' || attribute === 'output' || attribute === 'error' ? 'text-base' : 'text-xs'} font-medium first-letter:uppercase`, style: { color: 'var(--ds-gray-700)' }, children: attribute }), _jsx("span", { className: "text-xs", style: { color: 'var(--ds-gray-1000)' }, children: displayValue })] }, attribute)] }));
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/output appear so their skeletons render
431
+ // During loading, ensure input appears so its skeleton renders
413
432
  // in the correct position (above the events section).
414
- const loadingDefaults = ['input', 'output'];
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-lg border", style: {
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]);