@workflow/web-shared 5.0.0-beta.1 → 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.
Files changed (194) hide show
  1. package/README.md +1 -1
  2. package/dist/components/error-boundary.js.map +1 -1
  3. package/dist/components/event-list-view.d.ts +3 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +53 -53
  6. package/dist/components/event-list-view.js.map +1 -1
  7. package/dist/components/hook-actions.js.map +1 -1
  8. package/dist/components/index.d.ts +3 -1
  9. package/dist/components/index.d.ts.map +1 -1
  10. package/dist/components/index.js +3 -1
  11. package/dist/components/index.js.map +1 -1
  12. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  13. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  14. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  15. package/dist/components/new-trace-viewer/components/copy-button.js.map +1 -0
  16. package/dist/components/new-trace-viewer/components/event-list.d.ts +8 -0
  17. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  18. package/dist/components/new-trace-viewer/components/event-list.js +35 -0
  19. package/dist/components/new-trace-viewer/components/event-list.js.map +1 -0
  20. package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
  21. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  22. package/dist/components/new-trace-viewer/components/split-pane.js +100 -0
  23. package/dist/components/new-trace-viewer/components/split-pane.js.map +1 -0
  24. package/dist/components/new-trace-viewer/components/timeline.d.ts +32 -0
  25. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  26. package/dist/components/new-trace-viewer/components/timeline.js +134 -0
  27. package/dist/components/new-trace-viewer/components/timeline.js.map +1 -0
  28. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  29. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  30. package/dist/components/new-trace-viewer/context.js +49 -0
  31. package/dist/components/new-trace-viewer/context.js.map +1 -0
  32. package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
  33. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
  34. package/dist/components/new-trace-viewer/detail-panel.js +11 -0
  35. package/dist/components/new-trace-viewer/detail-panel.js.map +1 -0
  36. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  37. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  38. package/dist/components/new-trace-viewer/icons.js +15 -0
  39. package/dist/components/new-trace-viewer/icons.js.map +1 -0
  40. package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
  41. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  42. package/dist/components/new-trace-viewer/trace-viewer.js +329 -0
  43. package/dist/components/new-trace-viewer/trace-viewer.js.map +1 -0
  44. package/dist/components/new-trace-viewer/types.d.ts +1 -0
  45. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  46. package/dist/components/new-trace-viewer/types.js +2 -0
  47. package/dist/components/new-trace-viewer/types.js.map +1 -0
  48. package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
  49. package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
  50. package/dist/components/new-trace-viewer/util/constants.js +2 -0
  51. package/dist/components/new-trace-viewer/util/constants.js.map +1 -0
  52. package/dist/components/new-trace-viewer/utils.d.ts +47 -0
  53. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  54. package/dist/components/new-trace-viewer/utils.js +358 -0
  55. package/dist/components/new-trace-viewer/utils.js.map +1 -0
  56. package/dist/components/run-trace-view.d.ts +2 -1
  57. package/dist/components/run-trace-view.d.ts.map +1 -1
  58. package/dist/components/run-trace-view.js +2 -2
  59. package/dist/components/run-trace-view.js.map +1 -1
  60. package/dist/components/sidebar/attribute-panel.d.ts +7 -1
  61. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  62. package/dist/components/sidebar/attribute-panel.js +76 -47
  63. package/dist/components/sidebar/attribute-panel.js.map +1 -1
  64. package/dist/components/sidebar/conversation-view.js.map +1 -1
  65. package/dist/components/sidebar/copyable-data-block.js +1 -1
  66. package/dist/components/sidebar/copyable-data-block.js.map +1 -1
  67. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  68. package/dist/components/sidebar/detail-card.js +1 -1
  69. package/dist/components/sidebar/detail-card.js.map +1 -1
  70. package/dist/components/sidebar/entity-detail-panel.d.ts +3 -1
  71. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  72. package/dist/components/sidebar/entity-detail-panel.js +16 -36
  73. package/dist/components/sidebar/entity-detail-panel.js.map +1 -1
  74. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  75. package/dist/components/sidebar/events-list.js +2 -2
  76. package/dist/components/sidebar/events-list.js.map +1 -1
  77. package/dist/components/sidebar/resolve-hook-modal.js.map +1 -1
  78. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  79. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  80. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  81. package/dist/components/sidebar/sidebar-data-context.js.map +1 -0
  82. package/dist/components/stream-viewer.d.ts +1 -1
  83. package/dist/components/stream-viewer.d.ts.map +1 -1
  84. package/dist/components/stream-viewer.js +2 -26
  85. package/dist/components/stream-viewer.js.map +1 -1
  86. package/dist/components/trace-viewer/components/map.js.map +1 -1
  87. package/dist/components/trace-viewer/components/markers.js.map +1 -1
  88. package/dist/components/trace-viewer/components/node.js.map +1 -1
  89. package/dist/components/trace-viewer/components/search-input.js.map +1 -1
  90. package/dist/components/trace-viewer/components/search.js.map +1 -1
  91. package/dist/components/trace-viewer/components/span-content.js.map +1 -1
  92. package/dist/components/trace-viewer/components/span-detail-panel.js.map +1 -1
  93. package/dist/components/trace-viewer/components/span-segments.js.map +1 -1
  94. package/dist/components/trace-viewer/components/span-strategies.js.map +1 -1
  95. package/dist/components/trace-viewer/components/ui.js.map +1 -1
  96. package/dist/components/trace-viewer/components/zoom-button.js.map +1 -1
  97. package/dist/components/trace-viewer/components/zoom-icons.js.map +1 -1
  98. package/dist/components/trace-viewer/context.js.map +1 -1
  99. package/dist/components/trace-viewer/index.js.map +1 -1
  100. package/dist/components/trace-viewer/trace-viewer.js.map +1 -1
  101. package/dist/components/trace-viewer/types.js.map +1 -1
  102. package/dist/components/trace-viewer/util/constants.js.map +1 -1
  103. package/dist/components/trace-viewer/util/scrollbar-width.js.map +1 -1
  104. package/dist/components/trace-viewer/util/timing.js.map +1 -1
  105. package/dist/components/trace-viewer/util/tree.js.map +1 -1
  106. package/dist/components/trace-viewer/util/use-immediate-style.js.map +1 -1
  107. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +1 -1
  108. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +1 -1
  109. package/dist/components/trace-viewer/worker.js.map +1 -1
  110. package/dist/components/trace-viewer-new.d.ts +10 -0
  111. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  112. package/dist/components/trace-viewer-new.js +23 -0
  113. package/dist/components/trace-viewer-new.js.map +1 -0
  114. package/dist/components/ui/alert.js.map +1 -1
  115. package/dist/components/ui/card.js.map +1 -1
  116. package/dist/components/ui/data-inspector.d.ts +38 -1
  117. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  118. package/dist/components/ui/data-inspector.js +211 -21
  119. package/dist/components/ui/data-inspector.js.map +1 -1
  120. package/dist/components/ui/decrypt-button.js.map +1 -1
  121. package/dist/components/ui/error-card.js.map +1 -1
  122. package/dist/components/ui/error-stack-block.js.map +1 -1
  123. package/dist/components/ui/inspector-theme.d.ts +9 -10
  124. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  125. package/dist/components/ui/inspector-theme.js +38 -71
  126. package/dist/components/ui/inspector-theme.js.map +1 -1
  127. package/dist/components/ui/load-more-button.js.map +1 -1
  128. package/dist/components/ui/menu-dropdown.js.map +1 -1
  129. package/dist/components/ui/skeleton.js.map +1 -1
  130. package/dist/components/ui/spinner.js.map +1 -1
  131. package/dist/components/ui/timestamp-tooltip.js.map +1 -1
  132. package/dist/components/workflow-trace-view.d.ts +3 -1
  133. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  134. package/dist/components/workflow-trace-view.js +9 -4
  135. package/dist/components/workflow-trace-view.js.map +1 -1
  136. package/dist/components/workflow-traces/event-colors.js.map +1 -1
  137. package/dist/components/workflow-traces/trace-colors.js.map +1 -1
  138. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  139. package/dist/components/workflow-traces/trace-span-construction.js.map +1 -1
  140. package/dist/components/workflow-traces/trace-time-utils.js.map +1 -1
  141. package/dist/hooks/use-dark-mode.js.map +1 -1
  142. package/dist/index.d.ts +2 -1
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +1 -1
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/event-analysis.js.map +1 -1
  147. package/dist/lib/event-materialization.js.map +1 -1
  148. package/dist/lib/hydration.d.ts +8 -1
  149. package/dist/lib/hydration.d.ts.map +1 -1
  150. package/dist/lib/hydration.js +32 -2
  151. package/dist/lib/hydration.js.map +1 -1
  152. package/dist/lib/stream-display.d.ts +18 -0
  153. package/dist/lib/stream-display.d.ts.map +1 -0
  154. package/dist/lib/stream-display.js +30 -0
  155. package/dist/lib/stream-display.js.map +1 -0
  156. package/dist/lib/toast.js.map +1 -1
  157. package/dist/lib/trace-builder.js.map +1 -1
  158. package/dist/lib/utils.d.ts +7 -9
  159. package/dist/lib/utils.d.ts.map +1 -1
  160. package/dist/lib/utils.js +17 -22
  161. package/dist/lib/utils.js.map +1 -1
  162. package/dist/styles.css +470 -1
  163. package/package.json +4 -3
  164. package/src/components/event-list-view.tsx +181 -173
  165. package/src/components/index.ts +11 -1
  166. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  167. package/src/components/new-trace-viewer/components/event-list.tsx +109 -0
  168. package/src/components/new-trace-viewer/components/split-pane.tsx +186 -0
  169. package/src/components/new-trace-viewer/components/timeline.tsx +378 -0
  170. package/src/components/new-trace-viewer/context.tsx +94 -0
  171. package/src/components/new-trace-viewer/detail-panel.tsx +57 -0
  172. package/src/components/new-trace-viewer/icons.tsx +79 -0
  173. package/src/components/new-trace-viewer/trace-viewer.tsx +585 -0
  174. package/src/components/new-trace-viewer/types.ts +0 -0
  175. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  176. package/src/components/new-trace-viewer/utils.ts +524 -0
  177. package/src/components/run-trace-view.tsx +3 -0
  178. package/src/components/sidebar/attribute-panel.tsx +200 -138
  179. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  180. package/src/components/sidebar/detail-card.tsx +1 -19
  181. package/src/components/sidebar/entity-detail-panel.tsx +91 -147
  182. package/src/components/sidebar/events-list.tsx +9 -6
  183. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  184. package/src/components/stream-viewer.tsx +18 -40
  185. package/src/components/trace-viewer-new.tsx +49 -0
  186. package/src/components/ui/data-inspector.tsx +436 -31
  187. package/src/components/ui/inspector-theme.ts +39 -81
  188. package/src/components/workflow-trace-view.tsx +12 -2
  189. package/src/components/workflow-traces/trace-span-construction.ts +1 -1
  190. package/src/index.ts +2 -0
  191. package/src/lib/hydration.ts +37 -0
  192. package/src/lib/stream-display.ts +48 -0
  193. package/src/lib/utils.ts +18 -23
  194. 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"]}
@@ -14,11 +14,12 @@ interface RunTraceViewProps {
14
14
  onResolveHook?: (hookToken: string, payload: unknown, hook?: Hook) => Promise<void>;
15
15
  onCancelRun?: (runId: string) => Promise<void>;
16
16
  onStreamClick?: (streamId: string) => void;
17
+ onRunClick?: (runId: string) => void;
17
18
  onSpanSelect?: (info: SpanSelectionInfo) => void;
18
19
  onLoadMoreSpans?: () => void | Promise<void>;
19
20
  hasMoreSpans?: boolean;
20
21
  isLoadingMoreSpans?: boolean;
21
22
  }
22
- export declare function RunTraceView({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onSpanSelect, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, }: RunTraceViewProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function RunTraceView({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onSpanSelect, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, }: RunTraceViewProps): import("react/jsx-runtime").JSX.Element;
23
24
  export {};
24
25
  //# sourceMappingURL=run-trace-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-trace-view.d.ts","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,UAAU,iBAAiB;IACzB,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,EAAE,iBAAiB,2CAgCnB"}
1
+ {"version":3,"file":"run-trace-view.d.ts","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,UAAU,iBAAiB;IACzB,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,EAAE,iBAAiB,2CAiCnB"}
@@ -2,10 +2,10 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { AlertCircle } from 'lucide-react';
4
4
  import { WorkflowTraceViewer } from './workflow-trace-view';
5
- export function RunTraceView({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onSpanSelect, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, }) {
5
+ export function RunTraceView({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onSpanSelect, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans, }) {
6
6
  if (error && !run) {
7
7
  return (_jsxs("div", { className: "m-4", children: [_jsx(AlertCircle, { className: "h-4 w-4" }), _jsx("p", { children: "Error loading workflow run" }), _jsx("p", { children: error.message })] }));
8
8
  }
9
- return (_jsx("div", { className: "w-full h-full relative", children: _jsx(WorkflowTraceViewer, { error: error, events: events, run: run, isLoading: isLoading, spanDetailData: spanDetailData, spanDetailLoading: spanDetailLoading, spanDetailError: spanDetailError, onWakeUpSleep: onWakeUpSleep, onResolveHook: onResolveHook, onCancelRun: onCancelRun, onStreamClick: onStreamClick, onSpanSelect: onSpanSelect, onLoadMoreSpans: onLoadMoreSpans, hasMoreSpans: hasMoreSpans, isLoadingMoreSpans: isLoadingMoreSpans }) }));
9
+ return (_jsx("div", { className: "w-full h-full relative", children: _jsx(WorkflowTraceViewer, { error: error, events: events, run: run, isLoading: isLoading, spanDetailData: spanDetailData, spanDetailLoading: spanDetailLoading, spanDetailError: spanDetailError, onWakeUpSleep: onWakeUpSleep, onResolveHook: onResolveHook, onCancelRun: onCancelRun, onStreamClick: onStreamClick, onRunClick: onRunClick, onSpanSelect: onSpanSelect, onLoadMoreSpans: onLoadMoreSpans, hasMoreSpans: hasMoreSpans, isLoadingMoreSpans: isLoadingMoreSpans }) }));
10
10
  }
11
11
  //# sourceMappingURL=run-trace-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-trace-view.js","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,MAAM,UAAU,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACA;IAClB,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,EACnC,qDAAiC,EACjC,sBAAI,KAAK,CAAC,OAAO,GAAK,IAClB,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,mBAAmB,IAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,GACtC,GACE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run-trace-view.js","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA4B5D,MAAM,UAAU,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACA;IAClB,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,EACnC,qDAAiC,EACjC,sBAAI,KAAK,CAAC,OAAO,GAAK,IAClB,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,mBAAmB,IAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,GACtC,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { AlertCircle } from 'lucide-react';\nimport type { SpanSelectionInfo } from './sidebar/entity-detail-panel';\nimport { WorkflowTraceViewer } from './workflow-trace-view';\n\ninterface RunTraceViewProps {\n run: WorkflowRun;\n events: Event[];\n isLoading?: boolean;\n error?: Error | null;\n spanDetailData?: WorkflowRun | Step | Hook | Event | null;\n spanDetailLoading?: boolean;\n spanDetailError?: Error | null;\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n onCancelRun?: (runId: string) => Promise<void>;\n onStreamClick?: (streamId: string) => void;\n onRunClick?: (runId: string) => void;\n onSpanSelect?: (info: SpanSelectionInfo) => void;\n onLoadMoreSpans?: () => void | Promise<void>;\n hasMoreSpans?: boolean;\n isLoadingMoreSpans?: boolean;\n}\n\nexport function RunTraceView({\n run,\n events,\n isLoading,\n error,\n spanDetailData,\n spanDetailLoading,\n spanDetailError,\n onWakeUpSleep,\n onResolveHook,\n onCancelRun,\n onStreamClick,\n onRunClick,\n onSpanSelect,\n onLoadMoreSpans,\n hasMoreSpans,\n isLoadingMoreSpans,\n}: RunTraceViewProps) {\n if (error && !run) {\n return (\n <div className=\"m-4\">\n <AlertCircle className=\"h-4 w-4\" />\n <p>Error loading workflow run</p>\n <p>{error.message}</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full relative\">\n <WorkflowTraceViewer\n error={error}\n events={events}\n run={run}\n isLoading={isLoading}\n spanDetailData={spanDetailData}\n spanDetailLoading={spanDetailLoading}\n spanDetailError={spanDetailError}\n onWakeUpSleep={onWakeUpSleep}\n onResolveHook={onResolveHook}\n onCancelRun={onCancelRun}\n onStreamClick={onStreamClick}\n onRunClick={onRunClick}\n onSpanSelect={onSpanSelect}\n onLoadMoreSpans={onLoadMoreSpans}\n hasMoreSpans={hasMoreSpans}\n isLoadingMoreSpans={isLoadingMoreSpans}\n />\n </div>\n );\n}\n"]}
@@ -9,7 +9,7 @@ export declare const AttributeBlock: ({ attribute, value, isLoading, inline, con
9
9
  inline?: boolean;
10
10
  context?: DisplayContext;
11
11
  }) => import("react/jsx-runtime").JSX.Element | null;
12
- export declare const AttributePanel: ({ data, moduleSpecifier, isLoading, error, expiredAt, onStreamClick, resource, }: {
12
+ export declare const AttributePanel: ({ data, moduleSpecifier, isLoading, error, expiredAt, onStreamClick, onRunClick, onDecrypt, isDecrypting, resource, }: {
13
13
  data: Record<string, unknown>;
14
14
  moduleSpecifier?: string;
15
15
  isLoading?: boolean;
@@ -17,6 +17,12 @@ export declare const AttributePanel: ({ data, moduleSpecifier, isLoading, error,
17
17
  expiredAt?: string | Date;
18
18
  /** Callback when a stream reference is clicked */
19
19
  onStreamClick?: (streamId: string) => void;
20
+ /** Callback when a run reference is clicked */
21
+ onRunClick?: (runId: string) => void;
22
+ /** Callback when an encrypted marker is clicked (triggers decryption) */
23
+ onDecrypt?: () => void;
24
+ /** Whether decryption is currently in progress */
25
+ isDecrypting?: boolean;
20
26
  /** Resource type of the selected span — used to show targeted loading skeletons. */
21
27
  resource?: string;
22
28
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"attribute-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/attribute-panel.tsx"],"names":[],"mappings":"AAmVA,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,MAQrD,CAAC;AAoBF,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoOD,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,kFAQ5B;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,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,4CAkNA,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"}