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

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 (517) hide show
  1. package/README.md +5 -13
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +46 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +235 -97
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +8 -5
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +6 -4
  10. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  11. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  12. package/dist/components/sidebar/attribute-panel.js +173 -119
  13. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  14. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  15. package/dist/components/sidebar/attributes-block.js +140 -0
  16. package/dist/components/sidebar/conversation-view.js +1 -1
  17. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  18. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  19. package/dist/components/sidebar/copyable-data-block.js +17 -16
  20. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  21. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  22. package/dist/components/sidebar/entity-detail-panel.js +37 -71
  23. package/dist/components/sidebar/events-list.d.ts +6 -2
  24. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  25. package/dist/components/sidebar/events-list.js +77 -63
  26. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  27. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  28. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  29. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  30. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  31. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  32. package/dist/components/sidebar/span-detail-merge.js +92 -0
  33. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  34. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  35. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  36. package/dist/components/stream-viewer-skeleton.d.ts +2 -0
  37. package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
  38. package/dist/components/stream-viewer-skeleton.js +12 -0
  39. package/dist/components/stream-viewer.d.ts +1 -1
  40. package/dist/components/stream-viewer.d.ts.map +1 -1
  41. package/dist/components/stream-viewer.js +9 -26
  42. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  44. package/dist/components/trace-viewer/components/detail-panel-width.d.ts +34 -0
  45. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  46. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  47. package/dist/components/trace-viewer/components/detail-panel.d.ts +14 -0
  48. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  50. package/dist/components/trace-viewer/components/draggable-border.d.ts +31 -0
  51. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  52. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  53. package/dist/components/trace-viewer/components/event-list.d.ts +10 -0
  54. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  55. package/dist/components/trace-viewer/components/event-list.js +47 -0
  56. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  57. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  58. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  59. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  60. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
  61. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  62. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  63. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  65. package/dist/components/trace-viewer/components/minimap.d.ts +14 -0
  66. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  67. package/dist/components/trace-viewer/components/minimap.js +337 -0
  68. package/dist/components/trace-viewer/components/pane-constants.d.ts +14 -0
  69. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  70. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  71. package/dist/components/trace-viewer/components/span-markers.d.ts +46 -0
  72. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  73. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  74. package/dist/components/trace-viewer/components/split-pane.d.ts +10 -0
  75. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  76. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  77. package/dist/components/trace-viewer/components/timeline.d.ts +42 -0
  78. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  79. package/dist/components/trace-viewer/components/timeline.js +321 -0
  80. package/dist/components/trace-viewer/components/timeline.module.css +46 -0
  81. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  82. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  83. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  84. package/dist/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  85. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  86. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  87. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  88. package/dist/components/trace-viewer/components/use-element-width.d.ts +8 -0
  89. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  90. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  91. package/dist/components/trace-viewer/components/use-row-window.d.ts +34 -0
  92. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  93. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  94. package/dist/components/trace-viewer/context.d.ts +14 -182
  95. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  96. package/dist/components/trace-viewer/context.js +44 -351
  97. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  98. package/dist/components/trace-viewer/icons.js +15 -0
  99. package/dist/components/trace-viewer/search.d.ts +19 -0
  100. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  101. package/dist/components/trace-viewer/search.js +134 -0
  102. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  103. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  104. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  105. package/dist/components/trace-viewer/types.d.ts +2 -211
  106. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/timing.d.ts +2 -2
  109. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  110. package/dist/components/trace-viewer/util/timing.js +3 -3
  111. package/dist/components/trace-viewer/utils.d.ts +111 -0
  112. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  113. package/dist/components/trace-viewer/utils.js +430 -0
  114. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +7 -3
  115. package/dist/components/trace-viewer.d.ts.map +1 -0
  116. package/dist/components/trace-viewer.js +21 -0
  117. package/dist/components/ui/alert.js +3 -3
  118. package/dist/components/ui/button.d.ts +10 -0
  119. package/dist/components/ui/button.d.ts.map +1 -0
  120. package/dist/components/ui/button.js +46 -0
  121. package/dist/components/ui/card.d.ts.map +1 -1
  122. package/dist/components/ui/card.js +4 -4
  123. package/dist/components/ui/collapsible.d.ts +46 -0
  124. package/dist/components/ui/collapsible.d.ts.map +1 -0
  125. package/dist/components/ui/collapsible.js +66 -0
  126. package/dist/components/ui/context-card.d.ts +47 -0
  127. package/dist/components/ui/context-card.d.ts.map +1 -0
  128. package/dist/components/ui/context-card.js +471 -0
  129. package/dist/components/ui/data-inspector.d.ts +7 -6
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +232 -99
  132. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  133. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  134. package/dist/components/ui/data-inspector.styles.js +95 -0
  135. package/dist/components/ui/decrypt-button.js +1 -1
  136. package/dist/components/ui/error-card.js +3 -3
  137. package/dist/components/ui/error-stack-block.d.ts +17 -10
  138. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  139. package/dist/components/ui/error-stack-block.js +49 -30
  140. package/dist/components/ui/icon-button.d.ts +19 -0
  141. package/dist/components/ui/icon-button.d.ts.map +1 -0
  142. package/dist/components/ui/icon-button.js +29 -0
  143. package/dist/components/ui/kbd.d.ts +10 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +25 -0
  146. package/dist/components/ui/load-more-button.js +1 -1
  147. package/dist/components/ui/menu-dropdown.js +1 -1
  148. package/dist/components/ui/skeleton.js +2 -2
  149. package/dist/components/ui/spinner.js +1 -1
  150. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  151. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  152. package/dist/components/ui/timestamp-tooltip.js +80 -132
  153. package/dist/components/ui/tooltip.d.ts +10 -0
  154. package/dist/components/ui/tooltip.d.ts.map +1 -0
  155. package/dist/components/ui/tooltip.js +12 -0
  156. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  157. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  158. package/dist/components/workflow-traces/event-colors.js +15 -7
  159. package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
  160. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/trace-span-construction.js +71 -30
  162. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  163. package/dist/hooks/use-dark-mode.js +1 -1
  164. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  165. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  166. package/dist/hooks/use-intersection-observer.js +29 -0
  167. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  168. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  169. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  170. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  171. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  172. package/dist/hooks/use-reduced-motion.js +29 -0
  173. package/dist/index.d.ts +4 -3
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +4 -3
  176. package/dist/lib/cn.d.ts +10 -0
  177. package/dist/lib/cn.d.ts.map +1 -0
  178. package/dist/lib/cn.js +83 -0
  179. package/dist/lib/event-analysis.d.ts +1 -1
  180. package/dist/lib/event-analysis.d.ts.map +1 -1
  181. package/dist/lib/event-analysis.js +3 -2
  182. package/dist/lib/event-materialization.d.ts +1 -1
  183. package/dist/lib/event-materialization.d.ts.map +1 -1
  184. package/dist/lib/event-materialization.js +29 -21
  185. package/dist/lib/exact-event-search-id.d.ts +25 -0
  186. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  187. package/dist/lib/exact-event-search-id.js +39 -0
  188. package/dist/lib/hydration.d.ts +17 -2
  189. package/dist/lib/hydration.d.ts.map +1 -1
  190. package/dist/lib/hydration.js +194 -23
  191. package/dist/lib/stream-display.js +1 -1
  192. package/dist/lib/toast.js +1 -1
  193. package/dist/lib/trace-builder.d.ts +17 -5
  194. package/dist/lib/trace-builder.d.ts.map +1 -1
  195. package/dist/lib/trace-builder.js +32 -14
  196. package/dist/lib/trace-types.d.ts +54 -0
  197. package/dist/lib/trace-types.d.ts.map +1 -0
  198. package/dist/lib/trace-types.js +2 -0
  199. package/dist/lib/utils.d.ts +14 -2
  200. package/dist/lib/utils.d.ts.map +1 -1
  201. package/dist/lib/utils.js +46 -6
  202. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  203. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  204. package/dist/lib/zstd-browser-decoder.js +41 -0
  205. package/dist/styles.css +210 -139
  206. package/package.json +11 -8
  207. package/src/components/event-list-view.tsx +385 -123
  208. package/src/components/index.ts +14 -8
  209. package/src/components/sidebar/attribute-panel.tsx +331 -282
  210. package/src/components/sidebar/attributes-block.tsx +326 -0
  211. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  212. package/src/components/sidebar/entity-detail-panel.tsx +92 -126
  213. package/src/components/sidebar/events-list.tsx +197 -179
  214. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  215. package/src/components/sidebar/span-detail-merge.ts +134 -0
  216. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  217. package/src/components/stream-viewer-skeleton.tsx +34 -0
  218. package/src/components/stream-viewer.tsx +34 -106
  219. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +2 -2
  220. package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
  221. package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
  222. package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
  223. package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
  224. package/src/components/trace-viewer/components/event-list.tsx +144 -0
  225. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
  226. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
  227. package/src/components/trace-viewer/components/minimap.tsx +556 -0
  228. package/src/components/trace-viewer/components/pane-constants.ts +19 -0
  229. package/src/components/trace-viewer/components/span-markers.tsx +173 -0
  230. package/src/components/trace-viewer/components/split-pane.tsx +141 -0
  231. package/src/components/trace-viewer/components/timeline.module.css +46 -0
  232. package/src/components/trace-viewer/components/timeline.tsx +850 -0
  233. package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  234. package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  235. package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  236. package/src/components/trace-viewer/components/use-element-width.ts +29 -0
  237. package/src/components/trace-viewer/components/use-row-window.ts +140 -0
  238. package/src/components/trace-viewer/context.tsx +63 -656
  239. package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
  240. package/src/components/trace-viewer/search.ts +178 -0
  241. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  242. package/src/components/trace-viewer/types.ts +2 -234
  243. package/src/components/trace-viewer/util/timing.ts +2 -2
  244. package/src/components/trace-viewer/utils.test.ts +458 -0
  245. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
  246. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
  247. package/src/components/ui/alert.tsx +2 -2
  248. package/src/components/ui/button.tsx +68 -0
  249. package/src/components/ui/card.tsx +3 -10
  250. package/src/components/ui/collapsible.tsx +219 -0
  251. package/src/components/ui/context-card.tsx +784 -0
  252. package/src/components/ui/data-inspector.styles.ts +96 -0
  253. package/src/components/ui/data-inspector.tsx +501 -204
  254. package/src/components/ui/error-card.tsx +4 -4
  255. package/src/components/ui/error-stack-block.tsx +84 -55
  256. package/src/components/ui/icon-button.tsx +53 -0
  257. package/src/components/ui/kbd.tsx +43 -0
  258. package/src/components/ui/skeleton.tsx +1 -1
  259. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  260. package/src/components/ui/tooltip.tsx +47 -0
  261. package/src/components/workflow-traces/event-colors.ts +15 -11
  262. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  263. package/src/components/workflow-traces/trace-span-construction.ts +97 -32
  264. package/src/hooks/use-intersection-observer.ts +57 -0
  265. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  266. package/src/hooks/use-reduced-motion.ts +34 -0
  267. package/src/index.ts +10 -4
  268. package/src/lib/cn.ts +93 -0
  269. package/src/lib/event-analysis.ts +6 -4
  270. package/src/lib/event-materialization.ts +35 -21
  271. package/src/lib/exact-event-search-id.ts +67 -0
  272. package/src/lib/hydration.ts +210 -30
  273. package/src/lib/trace-builder.ts +43 -19
  274. package/src/lib/trace-types.ts +56 -0
  275. package/src/lib/utils.test.ts +33 -0
  276. package/src/lib/utils.ts +53 -6
  277. package/src/lib/zstd-browser-decoder.ts +42 -0
  278. package/src/styles.css +210 -139
  279. package/dist/components/error-boundary.js.map +0 -1
  280. package/dist/components/event-list-view.js.map +0 -1
  281. package/dist/components/hook-actions.js.map +0 -1
  282. package/dist/components/index.js.map +0 -1
  283. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  284. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  285. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  286. package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
  287. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  288. package/dist/components/new-trace-viewer/components/event-list.js +0 -38
  289. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  290. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  291. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  292. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  293. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  294. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  295. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  296. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  297. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  298. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  299. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  300. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  301. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  302. package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -14
  303. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  304. package/dist/components/new-trace-viewer/components/split-pane.js +0 -99
  305. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  306. package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
  307. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  308. package/dist/components/new-trace-viewer/components/timeline.js +0 -138
  309. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  310. package/dist/components/new-trace-viewer/context.d.ts +0 -15
  311. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  312. package/dist/components/new-trace-viewer/context.js +0 -47
  313. package/dist/components/new-trace-viewer/context.js.map +0 -1
  314. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  315. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  316. package/dist/components/new-trace-viewer/detail-panel.js +0 -12
  317. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  318. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  319. package/dist/components/new-trace-viewer/icons.js +0 -15
  320. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  321. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
  322. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  323. package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
  324. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  325. package/dist/components/new-trace-viewer/types.d.ts +0 -1
  326. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  327. package/dist/components/new-trace-viewer/types.js +0 -2
  328. package/dist/components/new-trace-viewer/types.js.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  330. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  331. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  332. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  333. package/dist/components/new-trace-viewer/utils.d.ts +0 -42
  334. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  335. package/dist/components/new-trace-viewer/utils.js +0 -305
  336. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  337. package/dist/components/run-trace-view.d.ts +0 -25
  338. package/dist/components/run-trace-view.d.ts.map +0 -1
  339. package/dist/components/run-trace-view.js +0 -11
  340. package/dist/components/run-trace-view.js.map +0 -1
  341. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  342. package/dist/components/sidebar/conversation-view.js.map +0 -1
  343. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  344. package/dist/components/sidebar/detail-card.d.ts +0 -14
  345. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  346. package/dist/components/sidebar/detail-card.js +0 -20
  347. package/dist/components/sidebar/detail-card.js.map +0 -1
  348. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  349. package/dist/components/sidebar/events-list.js.map +0 -1
  350. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  351. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  352. package/dist/components/stream-viewer.js.map +0 -1
  353. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  354. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  355. package/dist/components/trace-viewer/components/map.js +0 -162
  356. package/dist/components/trace-viewer/components/map.js.map +0 -1
  357. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  358. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  359. package/dist/components/trace-viewer/components/markers.js +0 -416
  360. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  361. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  362. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  363. package/dist/components/trace-viewer/components/node.js +0 -285
  364. package/dist/components/trace-viewer/components/node.js.map +0 -1
  365. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  366. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  367. package/dist/components/trace-viewer/components/search-input.js +0 -9
  368. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  369. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  370. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  371. package/dist/components/trace-viewer/components/search.js +0 -25
  372. package/dist/components/trace-viewer/components/search.js.map +0 -1
  373. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  374. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  375. package/dist/components/trace-viewer/components/span-content.js +0 -137
  376. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  377. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  378. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  379. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  380. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  381. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  382. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  383. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  384. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  385. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  386. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  387. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  388. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  389. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  390. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  391. package/dist/components/trace-viewer/components/ui.js +0 -39
  392. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  393. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  394. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  395. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  396. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  397. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  398. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  399. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  400. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  401. package/dist/components/trace-viewer/context.js.map +0 -1
  402. package/dist/components/trace-viewer/index.d.ts +0 -5
  403. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  404. package/dist/components/trace-viewer/index.js +0 -4
  405. package/dist/components/trace-viewer/index.js.map +0 -1
  406. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  407. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  408. package/dist/components/trace-viewer/types.js.map +0 -1
  409. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  410. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  411. package/dist/components/trace-viewer/util/constants.js +0 -9
  412. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  413. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  414. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  415. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  416. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  417. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  418. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  419. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  420. package/dist/components/trace-viewer/util/tree.js +0 -227
  421. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  422. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  423. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  424. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  425. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  426. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  427. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  428. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  429. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  430. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  431. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  432. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  433. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  434. package/dist/components/trace-viewer/worker.d.ts +0 -2
  435. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  436. package/dist/components/trace-viewer/worker.js +0 -109
  437. package/dist/components/trace-viewer/worker.js.map +0 -1
  438. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  439. package/dist/components/trace-viewer-new.js +0 -23
  440. package/dist/components/trace-viewer-new.js.map +0 -1
  441. package/dist/components/ui/alert.js.map +0 -1
  442. package/dist/components/ui/card.js.map +0 -1
  443. package/dist/components/ui/data-inspector.js.map +0 -1
  444. package/dist/components/ui/decrypt-button.js.map +0 -1
  445. package/dist/components/ui/error-card.js.map +0 -1
  446. package/dist/components/ui/error-stack-block.js.map +0 -1
  447. package/dist/components/ui/inspector-theme.d.ts +0 -95
  448. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  449. package/dist/components/ui/inspector-theme.js +0 -82
  450. package/dist/components/ui/inspector-theme.js.map +0 -1
  451. package/dist/components/ui/load-more-button.js.map +0 -1
  452. package/dist/components/ui/menu-dropdown.js.map +0 -1
  453. package/dist/components/ui/skeleton.js.map +0 -1
  454. package/dist/components/ui/spinner.js.map +0 -1
  455. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  456. package/dist/components/workflow-trace-view.d.ts +0 -40
  457. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  458. package/dist/components/workflow-trace-view.js +0 -695
  459. package/dist/components/workflow-trace-view.js.map +0 -1
  460. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  461. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  462. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  463. package/dist/components/workflow-traces/trace-colors.js +0 -87
  464. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  465. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  466. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  467. package/dist/hooks/use-dark-mode.js.map +0 -1
  468. package/dist/index.js.map +0 -1
  469. package/dist/lib/event-analysis.js.map +0 -1
  470. package/dist/lib/event-materialization.js.map +0 -1
  471. package/dist/lib/hydration.js.map +0 -1
  472. package/dist/lib/stream-display.js.map +0 -1
  473. package/dist/lib/toast.js.map +0 -1
  474. package/dist/lib/trace-builder.js.map +0 -1
  475. package/dist/lib/utils.js.map +0 -1
  476. package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
  477. package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
  478. package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
  479. package/src/components/new-trace-viewer/context.tsx +0 -92
  480. package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
  481. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
  482. package/src/components/new-trace-viewer/types.ts +0 -0
  483. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  484. package/src/components/run-trace-view.tsx +0 -84
  485. package/src/components/sidebar/detail-card.tsx +0 -65
  486. package/src/components/trace-viewer/components/map.tsx +0 -226
  487. package/src/components/trace-viewer/components/markers.tsx +0 -612
  488. package/src/components/trace-viewer/components/node.tsx +0 -505
  489. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  490. package/src/components/trace-viewer/components/search.tsx +0 -47
  491. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  492. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  493. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  494. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  495. package/src/components/trace-viewer/components/ui.tsx +0 -156
  496. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  497. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  498. package/src/components/trace-viewer/index.tsx +0 -4
  499. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  500. package/src/components/trace-viewer/util/constants.ts +0 -8
  501. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  502. package/src/components/trace-viewer/util/tree.ts +0 -277
  503. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  504. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  505. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  506. package/src/components/trace-viewer/worker.ts +0 -131
  507. package/src/components/ui/inspector-theme.ts +0 -110
  508. package/src/components/workflow-trace-view.tsx +0 -1171
  509. package/src/components/workflow-traces/trace-colors.ts +0 -112
  510. /package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  511. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  512. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  513. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  514. /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  515. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  516. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  517. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -1,285 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { clsx } from 'clsx';
4
- import { memo, useEffect, useRef, useState } from 'react';
5
- import styles from '../trace-viewer.module.css';
6
- import { MARKER_HEIGHT, ROW_HEIGHT, ROW_PADDING } from '../util/constants';
7
- import { formatDuration, getHighResInMs } from '../util/timing';
8
- import { SpanContent } from './span-content';
9
- import { computeSegments } from './span-segments';
10
- import { getResourceType, getSpanLayout, } from './span-strategies';
11
- export const getSpanColorClassName = (node) => {
12
- if (node.isVercel)
13
- return String(styles.colorVercel);
14
- return String(styles[`color${node.resourceIndex % 5}`]);
15
- };
16
- function getTerminalTimestamp(resourceType, node) {
17
- const events = node.events;
18
- if (!events?.length)
19
- return undefined;
20
- switch (resourceType) {
21
- case 'hook':
22
- for (let i = events.length; i--;) {
23
- if (events[i].event.name === 'hook_disposed') {
24
- return events[i].timestamp;
25
- }
26
- }
27
- return undefined;
28
- case 'sleep':
29
- for (let i = events.length; i--;) {
30
- if (events[i].event.name === 'wait_completed') {
31
- return events[i].timestamp;
32
- }
33
- }
34
- return undefined;
35
- case 'run':
36
- for (let i = events.length; i--;) {
37
- const name = events[i].event.name;
38
- if (name === 'run_completed' ||
39
- name === 'run_failed' ||
40
- name === 'run_cancelled') {
41
- return events[i].timestamp;
42
- }
43
- }
44
- return undefined;
45
- case 'step':
46
- for (let i = events.length; i--;) {
47
- const name = events[i].event.name;
48
- if (name === 'step_completed' || name === 'step_failed') {
49
- return events[i].timestamp;
50
- }
51
- if (name === 'step_started' || name === 'step_retrying') {
52
- return undefined;
53
- }
54
- }
55
- return undefined;
56
- default:
57
- return undefined;
58
- }
59
- }
60
- export const SpanNodes = memo(function SpanNodes({ root, scale, spans, isLive = false, scrollSnapshotRef, cache, customSpanClassNameFunc, customSpanEventClassNameFunc, }) {
61
- return spans.map((x) => (_jsx(SpanComponent, { cacheKey: cache.get(x.span.spanId), customSpanEventClassNameFunc: customSpanEventClassNameFunc, customSpanClassNameFunc: customSpanClassNameFunc, node: x, root: root, scale: scale, traceIsLive: isLive, scrollSnapshotRef: scrollSnapshotRef }, x.span.spanId)));
62
- });
63
- // ──────────────────────────────────────────────────────────────────────────
64
- // Compute inline styles from a SpanLayout
65
- // ──────────────────────────────────────────────────────────────────────────
66
- function getSpanStyle(layout, node, root, scale) {
67
- // Use isExpanded (hovered or selected) for width expansion so that
68
- // selected small spans stay expanded and show their name.
69
- const expanded = layout.isExpanded;
70
- return {
71
- // Use actualWidth for CSS variable so hover expansion is accurate
72
- '--span-width': `${Math.max(layout.actualWidth, 1)}px`,
73
- minWidth: expanded ? layout.width : undefined,
74
- width: expanded ? undefined : layout.width,
75
- height: layout.height,
76
- maxWidth: expanded && !layout.isNearRightSide
77
- ? (root.endTime - node.startTime) * scale
78
- : undefined,
79
- containIntrinsicWidth: expanded ? undefined : layout.width,
80
- containIntrinsicHeight: layout.height,
81
- left: layout.isNearRightSide ? undefined : layout.left,
82
- right: layout.isNearRightSide
83
- ? (root.endTime - node.endTime) * scale
84
- : undefined,
85
- top: layout.top,
86
- };
87
- }
88
- // ──────────────────────────────────────────────────────────────────────────
89
- // SpanComponent
90
- // ──────────────────────────────────────────────────────────────────────────
91
- export const SpanComponent = memo(function SpanComponent({ node, root, scale, traceIsLive = false, scrollSnapshotRef, customSpanClassNameFunc, customSpanEventClassNameFunc, }) {
92
- const ref = useRef(null);
93
- useEffect(() => {
94
- node.ref = ref;
95
- return () => {
96
- node.ref = undefined;
97
- };
98
- }, [node]);
99
- const { span } = node;
100
- const resourceType = getResourceType(node);
101
- const [liveNow, setLiveNow] = useState(0);
102
- // Get custom class name from callback if provided
103
- const customClassName = customSpanClassNameFunc
104
- ? customSpanClassNameFunc(node)
105
- : '';
106
- // Workflow span types use colored segments + boundary line markers
107
- // Generic OTEL spans use diamond event markers
108
- const isWorkflowSpan = resourceType !== 'default';
109
- // Determine if this span is still active (live). We require the parent run
110
- // to be explicitly live to avoid completed/cancelled traces continuing to
111
- // grow due to timing heuristics.
112
- const data = span.attributes?.data;
113
- const terminalTimestamp = getTerminalTimestamp(resourceType, node);
114
- const hasTerminalEvent = terminalTimestamp != null;
115
- const isCompletedByData = resourceType === 'hook'
116
- ? Boolean(data?.disposedAt)
117
- : Boolean(data?.completedAt);
118
- const isCompleted = isCompletedByData || hasTerminalEvent;
119
- const isLive = traceIsLive && isWorkflowSpan && !isCompleted;
120
- useEffect(() => {
121
- if (!isLive)
122
- return;
123
- setLiveNow(Date.now());
124
- const interval = setInterval(() => {
125
- setLiveNow(Date.now());
126
- }, 250);
127
- return () => clearInterval(interval);
128
- }, [isLive]);
129
- const canonicalStartTime = getHighResInMs(span.startTime);
130
- const canonicalEndTime = getHighResInMs(span.endTime);
131
- const canonicalDuration = getHighResInMs(span.duration);
132
- const canonicalActiveStartTime = span.activeStartTime
133
- ? getHighResInMs(span.activeStartTime)
134
- : undefined;
135
- const durationMs = terminalTimestamp != null
136
- ? Math.max(0, terminalTimestamp - canonicalStartTime)
137
- : isLive
138
- ? Math.max(0, (liveNow || Date.now()) - canonicalStartTime)
139
- : canonicalDuration;
140
- const duration = node.isInstrumentationHint
141
- ? 'Get Started'
142
- : formatDuration(durationMs);
143
- const baseNode = {
144
- ...node,
145
- startTime: canonicalStartTime,
146
- endTime: canonicalEndTime,
147
- duration: canonicalDuration,
148
- activeStartTime: canonicalActiveStartTime,
149
- };
150
- const segmentNode = isLive
151
- ? {
152
- ...baseNode,
153
- duration: durationMs,
154
- endTime: canonicalStartTime + durationMs,
155
- }
156
- : baseNode;
157
- const hasSegments = isWorkflowSpan &&
158
- computeSegments(resourceType, segmentNode).segments.length > 0;
159
- const layout = getSpanLayout(resourceType, segmentNode, root, scale, scrollSnapshotRef);
160
- // For live spans the data-level `node.duration` can be stale (from the last
161
- // fetch) while the visual width is growing via rAF. Recompute from real
162
- // elapsed time so that:
163
- // - height/isSmall classification stays correct (not shrunken to 40%)
164
- // - React-rendered width matches the rAF-driven width, preventing a brief
165
- // shrink→expand flash on re-render that breaks cursor hit-testing
166
- if (isLive) {
167
- const elapsed = durationMs;
168
- const liveActualWidth = elapsed * scale;
169
- const liveWidth = Math.max(liveActualWidth, 4);
170
- layout.actualWidth = liveActualWidth;
171
- layout.width = liveWidth;
172
- layout.isSmall = liveActualWidth < 64;
173
- layout.isHuge = liveActualWidth >= 500;
174
- if (!layout.isSmall) {
175
- layout.height = ROW_HEIGHT;
176
- layout.top = MARKER_HEIGHT + (ROW_HEIGHT + ROW_PADDING) * segmentNode.row;
177
- }
178
- }
179
- // Smoothly grow active span width at 60fps using wall clock time
180
- useEffect(() => {
181
- if (!isLive || !ref.current)
182
- return;
183
- let rafId = 0;
184
- const tick = () => {
185
- const $el = ref.current;
186
- if (!$el)
187
- return;
188
- const elapsed = Date.now() - canonicalStartTime;
189
- const w = Math.max(elapsed * scale, 2);
190
- $el.style.width = `${w}px`;
191
- $el.style.setProperty('--span-width', `${w}px`);
192
- rafId = requestAnimationFrame(tick);
193
- };
194
- rafId = requestAnimationFrame(tick);
195
- return () => cancelAnimationFrame(rafId);
196
- }, [isLive, canonicalStartTime, scale]);
197
- const renderNode = segmentNode;
198
- return (_jsxs(_Fragment, { children: [_jsx("button", { "aria-label": `${span.name} - ${duration}`, className: clsx(styles.spanNode, layout.isHuge && styles.huge, layout.isSmall && styles.small, layout.isExpanded && styles.xHover, node.isHighlighted
199
- ? styles.colorHighlight
200
- : getSpanColorClassName(node), node.isHighlighted === false && styles.unlit, customClassName, hasSegments && styles.hasSegments), "data-span-id": span.spanId, "data-start-time": segmentNode.startTime - root.startTime, "data-right-side": layout.isNearRightSide, "data-selected": node.isSelected ? '' : undefined, ref: ref, style: getSpanStyle(layout, segmentNode, root, scale), type: "button", children: _jsx(SpanContent, { durationMs: durationMs, resourceType: resourceType, node: renderNode, layout: layout }) }), segmentNode.events && !layout.isSmall
201
- ? segmentNode.events.map((x) => (_jsx(SpanEventComponent, { customSpanEventClassNameFunc: customSpanEventClassNameFunc, event: x, node: segmentNode, root: root, scale: scale, asBoundary: isWorkflowSpan }, x.key)))
202
- : null] }));
203
- });
204
- // ──────────────────────────────────────────────────────────────────────────
205
- // SpanEventComponent
206
- // ──────────────────────────────────────────────────────────────────────────
207
- /** Human-readable labels for workflow event types */
208
- const BOUNDARY_LABELS = {
209
- step_started: 'Started',
210
- step_retrying: 'Retrying',
211
- step_failed: 'Failed',
212
- hook_created: 'Created',
213
- hook_received: 'Received',
214
- hook_disposed: 'Resolved',
215
- wait_created: 'Sleep started',
216
- wait_completed: 'Sleep completed',
217
- run_started: 'Started',
218
- run_completed: 'Completed',
219
- run_failed: 'Run failed',
220
- step_completed: 'Completed',
221
- };
222
- export const SpanEventComponent = memo(function SpanEventComponent({ event, node, root, scale, customSpanEventClassNameFunc, asBoundary = false, }) {
223
- const ref = useRef(null);
224
- useEffect(() => {
225
- event.ref = ref;
226
- return () => {
227
- event.ref = undefined;
228
- };
229
- }, [event]);
230
- const { event: { name }, } = event;
231
- const timestamp = formatDuration(event.timestamp - root.startTime);
232
- const displayLabel = asBoundary ? (BOUNDARY_LABELS[name] ?? name) : name;
233
- // For boundary events, compute the duration of the phase.
234
- // "Forward" events (started, retrying) measure until the next event.
235
- // "Terminal" events (completed) measure from the previous started event.
236
- const isForwardEvent = asBoundary &&
237
- (name === 'step_started' ||
238
- name === 'run_started' ||
239
- name === 'step_retrying');
240
- const isTerminalEvent = asBoundary && (name === 'step_completed' || name === 'run_completed');
241
- let phaseDuration = null;
242
- let phaseLabel = null;
243
- if ((isForwardEvent || isTerminalEvent) && node.events) {
244
- const sortedNodeEvents = [...node.events].sort((a, b) => a.timestamp - b.timestamp);
245
- const currentIdx = sortedNodeEvents.findIndex((e) => e.key === event.key);
246
- if (isTerminalEvent) {
247
- // Look backward to find the last step_started
248
- let prevStartTime = null;
249
- for (let i = currentIdx - 1; i >= 0; i--) {
250
- if (sortedNodeEvents[i].event.name === 'step_started') {
251
- prevStartTime = sortedNodeEvents[i].timestamp;
252
- break;
253
- }
254
- }
255
- if (prevStartTime !== null) {
256
- phaseDuration = formatDuration(event.timestamp - prevStartTime);
257
- phaseLabel = 'Executed';
258
- }
259
- }
260
- else {
261
- // Look forward to the next event
262
- const nextEvent = sortedNodeEvents[currentIdx + 1];
263
- const endTime = nextEvent ? nextEvent.timestamp : node.endTime;
264
- phaseDuration = formatDuration(endTime - event.timestamp);
265
- phaseLabel = name === 'step_retrying' ? 'Waited' : 'Executed';
266
- }
267
- }
268
- const left = (event.timestamp - root.startTime) * scale;
269
- const top = MARKER_HEIGHT + (ROW_HEIGHT + ROW_PADDING) * node.row;
270
- const isLeftAligned = node.duration <= 0 ||
271
- (event.timestamp - node.startTime) / node.duration < 0.5;
272
- // Get custom class name from callback if provided
273
- const customClassName = customSpanEventClassNameFunc
274
- ? customSpanEventClassNameFunc(event)
275
- : '';
276
- return (_jsxs("div", { title: phaseDuration
277
- ? `${displayLabel} ${timestamp}\n${phaseLabel} ${phaseDuration}`
278
- : `${displayLabel} ${timestamp}`, className: clsx(styles.spanNodeEvent, customClassName, asBoundary && styles.boundaryMarker, node.isHighlighted
279
- ? styles.colorHighlight
280
- : getSpanColorClassName(node), node.isHighlighted === false && styles.unlit), "data-hovered": event.isHovered, ref: ref, style: {
281
- left,
282
- top,
283
- }, children: [_jsx("div", { className: clsx(styles.hoverInfo, isLeftAligned ? styles.alignStart : styles.alignEnd), children: asBoundary ? (_jsxs(_Fragment, { children: [_jsx("span", { className: styles.eventName, children: displayLabel }), _jsx("span", { className: styles.eventTimestamp, children: timestamp }), phaseDuration ? (_jsxs(_Fragment, { children: [_jsx("span", { className: styles.eventName, children: phaseLabel }), _jsx("span", { className: styles.eventTimestamp, children: phaseDuration })] })) : null] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: styles.eventName, children: name }), _jsx("span", { className: styles.eventTimestamp, children: timestamp })] })) }), asBoundary ? (_jsx("div", { className: styles.boundaryLine })) : (_jsx("div", { className: styles.eventDiamond }))] }));
284
- });
285
- //# sourceMappingURL=node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/node.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { clsx } from 'clsx';\nimport type { CSSProperties, MutableRefObject, ReactNode } from 'react';\nimport { memo, useEffect, useRef, useState } from 'react';\nimport styles from '../trace-viewer.module.css';\nimport type {\n MemoCache,\n MemoCacheKey,\n RootNode,\n ScrollSnapshot,\n SpanNode,\n VisibleSpan,\n VisibleSpanEvent,\n} from '../types';\nimport { MARKER_HEIGHT, ROW_HEIGHT, ROW_PADDING } from '../util/constants';\nimport { formatDuration, getHighResInMs } from '../util/timing';\nimport { SpanContent } from './span-content';\nimport { computeSegments } from './span-segments';\nimport {\n type ResourceType,\n type SpanLayout,\n getResourceType,\n getSpanLayout,\n} from './span-strategies';\n\nexport const getSpanColorClassName = (node: SpanNode): string => {\n if (node.isVercel) return String(styles.colorVercel);\n return String(styles[`color${node.resourceIndex % 5}` as 'color0']);\n};\n\nfunction getTerminalTimestamp(\n resourceType: ResourceType,\n node: VisibleSpan\n): number | undefined {\n const events = node.events;\n if (!events?.length) return undefined;\n\n switch (resourceType) {\n case 'hook':\n for (let i = events.length; i--; ) {\n if (events[i].event.name === 'hook_disposed') {\n return events[i].timestamp;\n }\n }\n return undefined;\n case 'sleep':\n for (let i = events.length; i--; ) {\n if (events[i].event.name === 'wait_completed') {\n return events[i].timestamp;\n }\n }\n return undefined;\n case 'run':\n for (let i = events.length; i--; ) {\n const name = events[i].event.name;\n if (\n name === 'run_completed' ||\n name === 'run_failed' ||\n name === 'run_cancelled'\n ) {\n return events[i].timestamp;\n }\n }\n return undefined;\n case 'step':\n for (let i = events.length; i--; ) {\n const name = events[i].event.name;\n if (name === 'step_completed' || name === 'step_failed') {\n return events[i].timestamp;\n }\n if (name === 'step_started' || name === 'step_retrying') {\n return undefined;\n }\n }\n return undefined;\n default:\n return undefined;\n }\n}\n\nexport const SpanNodes = memo(function SpanNodes({\n root,\n scale,\n spans,\n isLive = false,\n scrollSnapshotRef,\n cache,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n}: {\n root: RootNode;\n scale: number;\n spans: VisibleSpan[];\n isLive?: boolean;\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n /** Not used in the body — exists solely to bust React.memo when the global memo cache changes. */\n cacheKey?: MemoCacheKey;\n cache: MemoCache;\n customSpanClassNameFunc?: (span: SpanNode) => string;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}) {\n return spans.map((x) => (\n <SpanComponent\n cacheKey={cache.get(x.span.spanId)}\n customSpanEventClassNameFunc={customSpanEventClassNameFunc}\n customSpanClassNameFunc={customSpanClassNameFunc}\n key={x.span.spanId}\n node={x}\n root={root}\n scale={scale}\n traceIsLive={isLive}\n scrollSnapshotRef={scrollSnapshotRef}\n />\n ));\n});\n\n// ──────────────────────────────────────────────────────────────────────────\n// Compute inline styles from a SpanLayout\n// ──────────────────────────────────────────────────────────────────────────\n\nfunction getSpanStyle(\n layout: SpanLayout,\n node: VisibleSpan,\n root: RootNode,\n scale: number\n): CSSProperties {\n // Use isExpanded (hovered or selected) for width expansion so that\n // selected small spans stay expanded and show their name.\n const expanded = layout.isExpanded;\n return {\n // Use actualWidth for CSS variable so hover expansion is accurate\n '--span-width': `${Math.max(layout.actualWidth, 1)}px`,\n minWidth: expanded ? layout.width : undefined,\n width: expanded ? undefined : layout.width,\n height: layout.height,\n maxWidth:\n expanded && !layout.isNearRightSide\n ? (root.endTime - node.startTime) * scale\n : undefined,\n containIntrinsicWidth: expanded ? undefined : layout.width,\n containIntrinsicHeight: layout.height,\n left: layout.isNearRightSide ? undefined : layout.left,\n right: layout.isNearRightSide\n ? (root.endTime - node.endTime) * scale\n : undefined,\n top: layout.top,\n } as CSSProperties;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// SpanComponent\n// ──────────────────────────────────────────────────────────────────────────\n\nexport const SpanComponent = memo(function SpanComponent({\n node,\n root,\n scale,\n traceIsLive = false,\n scrollSnapshotRef,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n}: {\n node: VisibleSpan;\n root: RootNode;\n scale: number;\n traceIsLive?: boolean;\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n /** Not used in the body — exists solely to bust React.memo for this span. */\n cacheKey?: MemoCacheKey;\n customSpanClassNameFunc?: (span: SpanNode) => string;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}): ReactNode {\n const ref = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n node.ref = ref;\n return () => {\n node.ref = undefined;\n };\n }, [node]);\n\n const { span } = node;\n const resourceType = getResourceType(node);\n const [liveNow, setLiveNow] = useState(0);\n\n // Get custom class name from callback if provided\n const customClassName = customSpanClassNameFunc\n ? customSpanClassNameFunc(node)\n : '';\n\n // Workflow span types use colored segments + boundary line markers\n // Generic OTEL spans use diamond event markers\n const isWorkflowSpan = resourceType !== 'default';\n\n // Determine if this span is still active (live). We require the parent run\n // to be explicitly live to avoid completed/cancelled traces continuing to\n // grow due to timing heuristics.\n const data = span.attributes?.data as Record<string, unknown> | undefined;\n const terminalTimestamp = getTerminalTimestamp(resourceType, node);\n const hasTerminalEvent = terminalTimestamp != null;\n const isCompletedByData =\n resourceType === 'hook'\n ? Boolean(data?.disposedAt)\n : Boolean(data?.completedAt);\n const isCompleted = isCompletedByData || hasTerminalEvent;\n const isLive = traceIsLive && isWorkflowSpan && !isCompleted;\n\n useEffect(() => {\n if (!isLive) return;\n setLiveNow(Date.now());\n const interval = setInterval(() => {\n setLiveNow(Date.now());\n }, 250);\n return () => clearInterval(interval);\n }, [isLive]);\n\n const canonicalStartTime = getHighResInMs(span.startTime);\n const canonicalEndTime = getHighResInMs(span.endTime);\n const canonicalDuration = getHighResInMs(span.duration);\n const canonicalActiveStartTime = span.activeStartTime\n ? getHighResInMs(span.activeStartTime)\n : undefined;\n\n const durationMs =\n terminalTimestamp != null\n ? Math.max(0, terminalTimestamp - canonicalStartTime)\n : isLive\n ? Math.max(0, (liveNow || Date.now()) - canonicalStartTime)\n : canonicalDuration;\n const duration = node.isInstrumentationHint\n ? 'Get Started'\n : formatDuration(durationMs);\n const baseNode = {\n ...node,\n startTime: canonicalStartTime,\n endTime: canonicalEndTime,\n duration: canonicalDuration,\n activeStartTime: canonicalActiveStartTime,\n } as VisibleSpan;\n const segmentNode = isLive\n ? ({\n ...baseNode,\n duration: durationMs,\n endTime: canonicalStartTime + durationMs,\n } as VisibleSpan)\n : baseNode;\n const hasSegments =\n isWorkflowSpan &&\n computeSegments(resourceType, segmentNode).segments.length > 0;\n const layout = getSpanLayout(\n resourceType,\n segmentNode,\n root,\n scale,\n scrollSnapshotRef\n );\n\n // For live spans the data-level `node.duration` can be stale (from the last\n // fetch) while the visual width is growing via rAF. Recompute from real\n // elapsed time so that:\n // - height/isSmall classification stays correct (not shrunken to 40%)\n // - React-rendered width matches the rAF-driven width, preventing a brief\n // shrink→expand flash on re-render that breaks cursor hit-testing\n if (isLive) {\n const elapsed = durationMs;\n const liveActualWidth = elapsed * scale;\n const liveWidth = Math.max(liveActualWidth, 4);\n layout.actualWidth = liveActualWidth;\n layout.width = liveWidth;\n layout.isSmall = liveActualWidth < 64;\n layout.isHuge = liveActualWidth >= 500;\n if (!layout.isSmall) {\n layout.height = ROW_HEIGHT;\n layout.top = MARKER_HEIGHT + (ROW_HEIGHT + ROW_PADDING) * segmentNode.row;\n }\n }\n\n // Smoothly grow active span width at 60fps using wall clock time\n useEffect(() => {\n if (!isLive || !ref.current) return;\n\n let rafId = 0;\n const tick = (): void => {\n const $el = ref.current;\n if (!$el) return;\n const elapsed = Date.now() - canonicalStartTime;\n const w = Math.max(elapsed * scale, 2);\n $el.style.width = `${w}px`;\n $el.style.setProperty('--span-width', `${w}px`);\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafId);\n }, [isLive, canonicalStartTime, scale]);\n\n const renderNode = segmentNode;\n\n return (\n <>\n <button\n aria-label={`${span.name} - ${duration}`}\n className={clsx(\n styles.spanNode,\n layout.isHuge && styles.huge,\n layout.isSmall && styles.small,\n layout.isExpanded && styles.xHover,\n node.isHighlighted\n ? styles.colorHighlight\n : getSpanColorClassName(node),\n node.isHighlighted === false && styles.unlit,\n customClassName,\n hasSegments && styles.hasSegments\n )}\n data-span-id={span.spanId}\n data-start-time={segmentNode.startTime - root.startTime}\n data-right-side={layout.isNearRightSide}\n data-selected={node.isSelected ? '' : undefined}\n ref={ref}\n style={getSpanStyle(layout, segmentNode, root, scale)}\n type=\"button\"\n >\n <SpanContent\n durationMs={durationMs}\n resourceType={resourceType}\n node={renderNode}\n layout={layout}\n />\n </button>\n {segmentNode.events && !layout.isSmall\n ? segmentNode.events.map((x) => (\n <SpanEventComponent\n customSpanEventClassNameFunc={customSpanEventClassNameFunc}\n event={x}\n key={x.key}\n node={segmentNode}\n root={root}\n scale={scale}\n asBoundary={isWorkflowSpan}\n />\n ))\n : null}\n </>\n );\n});\n\n// ──────────────────────────────────────────────────────────────────────────\n// SpanEventComponent\n// ──────────────────────────────────────────────────────────────────────────\n\n/** Human-readable labels for workflow event types */\nconst BOUNDARY_LABELS: Record<string, string> = {\n step_started: 'Started',\n step_retrying: 'Retrying',\n step_failed: 'Failed',\n hook_created: 'Created',\n hook_received: 'Received',\n hook_disposed: 'Resolved',\n wait_created: 'Sleep started',\n wait_completed: 'Sleep completed',\n run_started: 'Started',\n run_completed: 'Completed',\n run_failed: 'Run failed',\n step_completed: 'Completed',\n};\n\nexport const SpanEventComponent = memo(function SpanEventComponent({\n event,\n node,\n root,\n scale,\n customSpanEventClassNameFunc,\n asBoundary = false,\n}: {\n event: VisibleSpanEvent;\n node: VisibleSpan;\n root: RootNode;\n scale: number;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n asBoundary?: boolean;\n}): ReactNode {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n event.ref = ref;\n return () => {\n event.ref = undefined;\n };\n }, [event]);\n\n const {\n event: { name },\n } = event;\n const timestamp = formatDuration(event.timestamp - root.startTime);\n const displayLabel = asBoundary ? (BOUNDARY_LABELS[name] ?? name) : name;\n\n // For boundary events, compute the duration of the phase.\n // \"Forward\" events (started, retrying) measure until the next event.\n // \"Terminal\" events (completed) measure from the previous started event.\n const isForwardEvent =\n asBoundary &&\n (name === 'step_started' ||\n name === 'run_started' ||\n name === 'step_retrying');\n const isTerminalEvent =\n asBoundary && (name === 'step_completed' || name === 'run_completed');\n\n let phaseDuration: string | null = null;\n let phaseLabel: string | null = null;\n if ((isForwardEvent || isTerminalEvent) && node.events) {\n const sortedNodeEvents = [...node.events].sort(\n (a, b) => a.timestamp - b.timestamp\n );\n const currentIdx = sortedNodeEvents.findIndex((e) => e.key === event.key);\n\n if (isTerminalEvent) {\n // Look backward to find the last step_started\n let prevStartTime: number | null = null;\n for (let i = currentIdx - 1; i >= 0; i--) {\n if (sortedNodeEvents[i].event.name === 'step_started') {\n prevStartTime = sortedNodeEvents[i].timestamp;\n break;\n }\n }\n if (prevStartTime !== null) {\n phaseDuration = formatDuration(event.timestamp - prevStartTime);\n phaseLabel = 'Executed';\n }\n } else {\n // Look forward to the next event\n const nextEvent = sortedNodeEvents[currentIdx + 1];\n const endTime = nextEvent ? nextEvent.timestamp : node.endTime;\n phaseDuration = formatDuration(endTime - event.timestamp);\n phaseLabel = name === 'step_retrying' ? 'Waited' : 'Executed';\n }\n }\n\n const left = (event.timestamp - root.startTime) * scale;\n const top = MARKER_HEIGHT + (ROW_HEIGHT + ROW_PADDING) * node.row;\n const isLeftAligned =\n node.duration <= 0 ||\n (event.timestamp - node.startTime) / node.duration < 0.5;\n\n // Get custom class name from callback if provided\n const customClassName = customSpanEventClassNameFunc\n ? customSpanEventClassNameFunc(event)\n : '';\n\n return (\n <div\n title={\n phaseDuration\n ? `${displayLabel} ${timestamp}\\n${phaseLabel} ${phaseDuration}`\n : `${displayLabel} ${timestamp}`\n }\n className={clsx(\n styles.spanNodeEvent,\n customClassName,\n asBoundary && styles.boundaryMarker,\n node.isHighlighted\n ? styles.colorHighlight\n : getSpanColorClassName(node),\n node.isHighlighted === false && styles.unlit\n )}\n data-hovered={event.isHovered}\n ref={ref}\n style={\n {\n left,\n top,\n } as CSSProperties\n }\n >\n <div\n className={clsx(\n styles.hoverInfo,\n isLeftAligned ? styles.alignStart : styles.alignEnd\n )}\n >\n {asBoundary ? (\n <>\n <span className={styles.eventName}>{displayLabel}</span>\n <span className={styles.eventTimestamp}>{timestamp}</span>\n {phaseDuration ? (\n <>\n <span className={styles.eventName}>{phaseLabel}</span>\n <span className={styles.eventTimestamp}>{phaseDuration}</span>\n </>\n ) : null}\n </>\n ) : (\n <>\n <span className={styles.eventName}>{name}</span>\n <span className={styles.eventTimestamp}>{timestamp}</span>\n </>\n )}\n </div>\n {asBoundary ? (\n <div className={styles.boundaryLine} />\n ) : (\n <div className={styles.eventDiamond} />\n )}\n </div>\n );\n});\n"]}
@@ -1,9 +0,0 @@
1
- import type { ChangeEventHandler, ReactNode } from 'react';
2
- export declare function SearchInput({ height, width, value, placeholder, onChange, }: {
3
- height: number | string;
4
- width?: number | string;
5
- value: string;
6
- placeholder?: string;
7
- onChange: ChangeEventHandler<HTMLInputElement>;
8
- }): ReactNode;
9
- //# sourceMappingURL=search-input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-input.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/search-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3D,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;CAChD,GAAG,SAAS,CAeZ"}
@@ -1,9 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import styles from '../trace-viewer.module.css';
3
- export function SearchInput({ height, width, value, placeholder, onChange, }) {
4
- return (_jsxs("label", { className: styles.searchInputLabel, children: [_jsx("div", { className: styles.searchInputPrefix, children: _jsx(MagnifyingGlassIcon, {}) }), _jsx("input", { type: "search", value: value, placeholder: placeholder, onChange: onChange, style: { height, width } })] }));
5
- }
6
- function MagnifyingGlassIcon() {
7
- return (_jsxs("svg", { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", focusable: "false", children: [_jsx("circle", { cx: "7", cy: "7", r: "4.5", stroke: "currentColor", strokeWidth: "1.5" }), _jsx("path", { d: "M11.5 11.5L14 14", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" })] }));
8
- }
9
- //# sourceMappingURL=search-input.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-input.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/search-input.tsx"],"names":[],"mappings":";AACA,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,GAOT;IACC,OAAO,CACL,iBAAO,SAAS,EAAE,MAAM,CAAC,gBAAgB,aACvC,cAAK,SAAS,EAAE,MAAM,CAAC,iBAAiB,YACtC,KAAC,mBAAmB,KAAG,GACnB,EACN,gBACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GACxB,IACI,CACT,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,CACL,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,iBACC,MAAM,EAClB,SAAS,EAAC,OAAO,aAEjB,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EACxE,eACE,CAAC,EAAC,kBAAkB,EACpB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,GACrB,IACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["import type { ChangeEventHandler, ReactNode } from 'react';\nimport styles from '../trace-viewer.module.css';\n\nexport function SearchInput({\n height,\n width,\n value,\n placeholder,\n onChange,\n}: {\n height: number | string;\n width?: number | string;\n value: string;\n placeholder?: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n}): ReactNode {\n return (\n <label className={styles.searchInputLabel}>\n <div className={styles.searchInputPrefix}>\n <MagnifyingGlassIcon />\n </div>\n <input\n type=\"search\"\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n style={{ height, width }}\n />\n </label>\n );\n}\n\nfunction MagnifyingGlassIcon(): ReactNode {\n return (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M11.5 11.5L14 14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n"]}
@@ -1,3 +0,0 @@
1
- import { type ReactNode } from 'react';
2
- export declare function SearchBar(): ReactNode;
3
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/search.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAM5D,wBAAgB,SAAS,IAAI,SAAS,CAMrC"}
@@ -1,25 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useEffect, useState } from 'react';
4
- import { useTraceViewer } from '../context';
5
- import styles from '../trace-viewer.module.css';
6
- import { SEARCH_HEIGHT } from '../util/constants';
7
- import { SearchInput } from './search-input';
8
- export function SearchBar() {
9
- return (_jsx("nav", { className: styles.searchBar, children: _jsx(SearchInputWrapper, {}) }));
10
- }
11
- function SearchInputWrapper() {
12
- const { dispatch } = useTraceViewer();
13
- const [value, setValue] = useState('');
14
- useEffect(() => {
15
- const timeout = setTimeout(() => dispatch({
16
- type: 'setFilter',
17
- filter: value,
18
- }), 100);
19
- return () => {
20
- clearTimeout(timeout);
21
- };
22
- }, [dispatch, value]);
23
- return (_jsx("div", { className: styles.searchInput, children: _jsx(SearchInput, { height: SEARCH_HEIGHT, onChange: (e) => setValue(e.target.value), placeholder: "Search spans\u2026", value: value, width: "100%" }) }));
24
- }
25
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/search.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAkB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,cAAK,SAAS,EAAE,MAAM,CAAC,SAAS,YAC9B,KAAC,kBAAkB,KAAG,GAClB,CACP,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IACtC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CACH,QAAQ,CAAC;YACP,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK;SACd,CAAC,EACJ,GAAG,CACJ,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,cAAK,SAAS,EAAE,MAAM,CAAC,WAAW,YAChC,KAAC,WAAW,IACV,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAC,oBAAe,EAC3B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAC,MAAM,GACZ,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { useTraceViewer } from '../context';\nimport styles from '../trace-viewer.module.css';\nimport { SEARCH_HEIGHT } from '../util/constants';\nimport { SearchInput } from './search-input';\n\nexport function SearchBar(): ReactNode {\n return (\n <nav className={styles.searchBar}>\n <SearchInputWrapper />\n </nav>\n );\n}\n\nfunction SearchInputWrapper(): ReactNode {\n const { dispatch } = useTraceViewer();\n const [value, setValue] = useState('');\n\n useEffect(() => {\n const timeout = setTimeout(\n () =>\n dispatch({\n type: 'setFilter',\n filter: value,\n }),\n 100\n );\n\n return () => {\n clearTimeout(timeout);\n };\n }, [dispatch, value]);\n\n return (\n <div className={styles.searchInput}>\n <SearchInput\n height={SEARCH_HEIGHT}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Search spans…\"\n value={value}\n width=\"100%\"\n />\n </div>\n );\n}\n"]}
@@ -1,19 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import type { SpanNode } from '../types';
3
- import type { ResourceType, SpanLayout } from './span-strategies';
4
- export interface SpanContentProps {
5
- node: SpanNode;
6
- layout: SpanLayout;
7
- durationMs?: number;
8
- }
9
- export declare function RunContent(props: SpanContentProps): ReactNode;
10
- export declare function StepContent(props: SpanContentProps): ReactNode;
11
- export declare function HookContent(props: SpanContentProps): ReactNode;
12
- export declare function SleepContent(props: SpanContentProps): ReactNode;
13
- /**
14
- * Returns the inner content for a span based on its resource type.
15
- */
16
- export declare function SpanContent({ resourceType, ...props }: SpanContentProps & {
17
- resourceType: ResourceType;
18
- }): ReactNode;
19
- //# sourceMappingURL=span-content.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-content.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-content.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAQzC,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsJlE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAE7D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAE9D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAE9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAE/D;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,GAAG,SAAS,CAa/D"}
@@ -1,137 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import styles from '../trace-viewer.module.css';
4
- import { formatDuration } from '../util/timing';
5
- import { SEGMENT_CLASS_MAP, computeSegments, } from './span-segments';
6
- // ──────────────────────────────────────────────────────────────────────────
7
- // Shared helpers
8
- // ──────────────────────────────────────────────────────────────────────────
9
- function getDuration(node) {
10
- if (node.isInstrumentationHint) {
11
- return 'Get Started';
12
- }
13
- return formatDuration(node.duration);
14
- }
15
- // ──────────────────────────────────────────────────────────────────────────
16
- // Segment rendering (shared across all workflow span types)
17
- // ──────────────────────────────────────────────────────────────────────────
18
- const SEGMENT_LABELS = {
19
- queued: 'Queued',
20
- running: '',
21
- failed: 'Failed',
22
- retrying: 'Retry wait',
23
- succeeded: 'Executed',
24
- waiting: 'Waiting',
25
- sleeping: 'Sleeping',
26
- received: 'Received',
27
- };
28
- function SegmentLayer({ segments, spanDuration, }) {
29
- if (segments.length === 0)
30
- return null;
31
- return (_jsx("div", { className: styles.segmentLayer, children: segments.map((seg, i) => {
32
- const className = styles[SEGMENT_CLASS_MAP[seg.status]];
33
- const segDuration = (seg.endFraction - seg.startFraction) * spanDuration;
34
- const label = SEGMENT_LABELS[seg.status];
35
- const style = {
36
- left: `${seg.startFraction * 100}%`,
37
- width: `${(seg.endFraction - seg.startFraction) * 100}%`,
38
- };
39
- return (_jsx("div", { className: `${styles.segment} ${String(className)}`, style: style, title: label
40
- ? `${label} ${formatDuration(segDuration)}`
41
- : formatDuration(segDuration) }, `seg-${seg.status}-${String(i)}`));
42
- }) }));
43
- }
44
- /** Build inline segment tags to render next to the span name. */
45
- function getSegmentTags(segments, spanDuration) {
46
- const tags = [];
47
- for (let i = 0; i < segments.length; i++) {
48
- const seg = segments[i];
49
- const label = SEGMENT_LABELS[seg.status];
50
- if (!label)
51
- continue; // skip "running" which has no label
52
- let segDuration = (seg.endFraction - seg.startFraction) * spanDuration;
53
- // For terminal segments (succeeded/failed) with ~0 duration,
54
- // use the preceding running segment's duration instead.
55
- if (segDuration < 1 &&
56
- (seg.status === 'succeeded' || seg.status === 'failed') &&
57
- i > 0) {
58
- const prev = segments[i - 1];
59
- if (prev.status === 'running') {
60
- segDuration = (prev.endFraction - prev.startFraction) * spanDuration;
61
- }
62
- }
63
- // Skip tags that still have no meaningful duration
64
- if (segDuration < 1)
65
- continue;
66
- tags.push({ label, duration: formatDuration(segDuration) });
67
- }
68
- return tags;
69
- }
70
- // ──────────────────────────────────────────────────────────────────────────
71
- // Text content (shared label + duration rendering)
72
- // ──────────────────────────────────────────────────────────────────────────
73
- function TextContent({ node, layout, durationMs, segmentTags, }) {
74
- const duration = node.isInstrumentationHint
75
- ? getDuration(node)
76
- : formatDuration(durationMs ?? node.duration);
77
- if (layout.isSmall && !layout.isHovered) {
78
- return null;
79
- }
80
- const showTags = segmentTags &&
81
- segmentTags.length > 0 &&
82
- (layout.isHovered || layout.width > 200);
83
- return (_jsxs(_Fragment, { children: [_jsxs("span", { className: styles.spanName, children: [node.label || node.span.name, showTags
84
- ? segmentTags.map((tag, i) => (_jsxs("span", { className: styles.segmentTag, children: [' · ', tag.label, " ", tag.duration] }, i)))
85
- : null] }), layout.isHuge ? _jsx("span", { className: styles.spanSpacer }) : null, layout.isHovered || layout.width > 128 ? (_jsx("span", { className: styles.spanDuration, children: duration })) : null] }));
86
- }
87
- // ──────────────────────────────────────────────────────────────────────────
88
- // Default content (generic OTEL spans — no segments)
89
- // ──────────────────────────────────────────────────────────────────────────
90
- function DefaultContent({ node, layout }) {
91
- return _jsx(TextContent, { node: node, layout: layout });
92
- }
93
- // ──────────────────────────────────────────────────────────────────────────
94
- // Workflow content (segments + text for workflow span types)
95
- // ──────────────────────────────────────────────────────────────────────────
96
- function WorkflowContent({ resourceType, node, layout, durationMs, }) {
97
- const spanDuration = durationMs ?? node.duration;
98
- const { segments } = computeSegments(resourceType, node);
99
- const segmentTags = getSegmentTags(segments, spanDuration);
100
- return (_jsxs(_Fragment, { children: [_jsx(SegmentLayer, { segments: segments, spanDuration: spanDuration }), _jsx(TextContent, { durationMs: spanDuration, node: node, layout: layout, segmentTags: segmentTags })] }));
101
- }
102
- // ──────────────────────────────────────────────────────────────────────────
103
- // Per-type content components
104
- // ──────────────────────────────────────────────────────────────────────────
105
- export function RunContent(props) {
106
- return _jsx(WorkflowContent, { resourceType: "run", ...props });
107
- }
108
- export function StepContent(props) {
109
- return _jsx(WorkflowContent, { resourceType: "step", ...props });
110
- }
111
- export function HookContent(props) {
112
- return _jsx(WorkflowContent, { resourceType: "hook", ...props });
113
- }
114
- export function SleepContent(props) {
115
- return _jsx(WorkflowContent, { resourceType: "sleep", ...props });
116
- }
117
- // ──────────────────────────────────────────────────────────────────────────
118
- // Dispatcher
119
- // ──────────────────────────────────────────────────────────────────────────
120
- /**
121
- * Returns the inner content for a span based on its resource type.
122
- */
123
- export function SpanContent({ resourceType, ...props }) {
124
- switch (resourceType) {
125
- case 'run':
126
- return _jsx(RunContent, { ...props });
127
- case 'step':
128
- return _jsx(StepContent, { ...props });
129
- case 'hook':
130
- return _jsx(HookContent, { ...props });
131
- case 'sleep':
132
- return _jsx(SleepContent, { ...props });
133
- default:
134
- return _jsx(DefaultContent, { ...props });
135
- }
136
- }
137
- //# sourceMappingURL=span-content.js.map