@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,234 +1,2 @@
1
- import type { MutableRefObject, ReactNode } from 'react';
2
-
3
- export type MemoCacheKey = Record<string, never>;
4
- export type MemoCache = Map<string, MemoCacheKey>;
5
-
6
- export interface Span {
7
- name: string;
8
- kind: number;
9
- resource: string;
10
- library: {
11
- name: string;
12
- version?: string;
13
- };
14
- spanId: string;
15
- parentSpanId?: string;
16
- status: {
17
- code: number;
18
- };
19
- traceFlags: number;
20
- attributes: Record<string, unknown>;
21
- links: Record<string, unknown>[];
22
- events: SpanEvent[];
23
- startTime: [number, number];
24
- endTime: [number, number];
25
- duration: [number, number];
26
- /**
27
- * The time when the span became active/started executing (optional).
28
- * If provided and different from startTime, the portion between startTime
29
- * and activeStartTime will be rendered as a "queued" period with different styling.
30
- */
31
- activeStartTime?: [number, number];
32
- }
33
-
34
- export interface SpanEvent {
35
- name: string;
36
- timestamp: [number, number];
37
- attributes: Record<string, unknown>;
38
- /**
39
- * Optional custom color for this event marker (workflow-specific feature).
40
- * If provided, this color will be used for the event marker line/diamond.
41
- */
42
- color?: string;
43
- /**
44
- * Whether to show a vertical line for this event in the timeline (workflow-specific feature).
45
- * If false, only the diamond marker on the span will be shown.
46
- * Defaults to true if not specified.
47
- */
48
- showVerticalLine?: boolean;
49
- }
50
-
51
- export interface Resource {
52
- name: string;
53
- attributes: Record<string, string>;
54
- }
55
-
56
- export interface Trace {
57
- traceId: string;
58
- resources?: Resource[];
59
- spans: Span[];
60
- rootSpanId?: string;
61
- }
62
-
63
- interface EveryNode {
64
- startTime: number;
65
- endTime: number;
66
- duration: number;
67
- /**
68
- * How deep is this node within the tree
69
- */
70
- depth: number;
71
- /**
72
- * All direct child nodes of this node
73
- */
74
- children: SpanNode[];
75
- }
76
-
77
- export interface RootNode extends EveryNode {
78
- /**
79
- * The depth is always 0 for the root node
80
- */
81
- depth: 0;
82
- }
83
-
84
- export interface SpanNode extends EveryNode {
85
- /**
86
- * This original Span that this node is based on
87
- */
88
- span: Span;
89
- /**
90
- * The immediate parent of this node
91
- */
92
- parent: RootNode | SpanNode;
93
- /**
94
- * A generated label to use (overrides the span.name) if present
95
- */
96
- label?: string;
97
- /**
98
- * OTEL events that are present on this span (e.g. TTFB)
99
- */
100
- events?: SpanNodeEvent[];
101
- /**
102
- * Whether this span originated in Vercel's infrastructure.
103
- */
104
- isVercel: boolean;
105
- /**
106
- * Whether this span matches the current search filter
107
- */
108
- isHighlighted?: boolean;
109
- /**
110
- * Whether this span is a placeholder to hint at where user spans
111
- * would appear if proper instrumentation were available
112
- */
113
- isInstrumentationHint?: boolean;
114
- /**
115
- * The index of the resource that this node belongs to (used for color)
116
- */
117
- resourceIndex: number;
118
- /**
119
- * The time when execution actually started (in milliseconds).
120
- * If present and greater than startTime, represents a "queued" period.
121
- */
122
- activeStartTime?: number;
123
- }
124
-
125
- export interface SpanNodeEvent {
126
- /** A unique key for this event to help with rendering in React */
127
- key: string;
128
- /** The timestamp of this event in milliseconds */
129
- timestamp: number;
130
- /** The original event model */
131
- event: SpanEvent;
132
- }
133
-
134
- export type TraceNode = RootNode | SpanNode;
135
-
136
- export interface VisibleSpan extends SpanNode {
137
- /**
138
- * The ref for this span's element in the DOM
139
- */
140
- ref?: MutableRefObject<HTMLButtonElement | null>;
141
- /**
142
- * The y position of this span (in # of rows)
143
- */
144
- row: number;
145
- /**
146
- * Whether the CursorMarker is intersecting this span
147
- */
148
- isHovered: boolean;
149
- /**
150
- * Whether this is the selected span
151
- */
152
- isSelected: boolean;
153
- /**
154
- * Whether this node is visible (based on its size on screen)
155
- */
156
- isVisible: boolean;
157
- /**
158
- * Events also need to be able to hold a ref to their element in the DOM
159
- */
160
- events?: VisibleSpanEvent[];
161
- }
162
-
163
- export interface VisibleSpanEvent extends SpanNodeEvent {
164
- /**
165
- * The ref for this span's element in the DOM
166
- */
167
- ref?: MutableRefObject<HTMLDivElement | null>;
168
- /**
169
- * Whether the CursorMarker is intersecting this span
170
- */
171
- isHovered: boolean;
172
- }
173
-
174
- export interface ScrollSnapshot {
175
- anchorT: number;
176
- anchorX: number;
177
- scrollLeft: number;
178
- scrollTop: number;
179
- startTime: number;
180
- endTime: number;
181
- startRow: number;
182
- endRow: number;
183
- scale: number;
184
- }
185
-
186
- export type WorkerRequest = {
187
- requestId: number;
188
- } & (
189
- | {
190
- type: 'calculateSpanPositions';
191
- root: RootNode;
192
- }
193
- | {
194
- type: 'filterSpans';
195
- root: RootNode;
196
- filter: string;
197
- }
198
- );
199
-
200
- export type WorkerResponse = {
201
- requestId: number;
202
- } & (
203
- | {
204
- type: 'setRowsResult';
205
- rows: VisibleSpan[][];
206
- isEnd: boolean;
207
- }
208
- | {
209
- type: 'updateHighlight';
210
- matches: Set<string>;
211
- }
212
- );
213
-
214
- /**
215
- * Represents one link to a page related to the selected
216
- * span in the detail panel.
217
- */
218
- export interface QuickLink {
219
- /** Used as a React key and the user-facing name for the link */
220
- key: string;
221
- /** Until this Promise is fulfilled, the row will render with a skeleton for the value. */
222
- value: Promise<QuickLinkValue>;
223
- }
224
-
225
- export interface QuickLinkValue {
226
- /** The visible components for the right side of this link */
227
- label: ReactNode;
228
- /** A special suffix to show for this link, defaults to the ExternalLink icon */
229
- icon?: ReactNode;
230
- /** The href that this link will open when clicked */
231
- href: string;
232
- }
233
-
234
- export type GetQuickLinks = (node: Span) => QuickLink[];
1
+ export type { TraceWithMeta } from '../../lib/trace-builder';
2
+ export type { Span, SpanEvent, Trace } from '../../lib/trace-types';
@@ -1,6 +1,6 @@
1
- import { formatDuration } from '../../../lib/utils';
1
+ import { formatDuration, formatDurationPrecise } from '../../../lib/utils';
2
2
 
3
- export { formatDuration };
3
+ export { formatDuration, formatDurationPrecise };
4
4
 
5
5
  export function getHighResInMs([seconds, nanoseconds]: [
6
6
  number,
@@ -0,0 +1,458 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import type { Span, SpanEvent } from './types';
3
+ import {
4
+ clampViewportToRoot,
5
+ computeOffscreenMarkers,
6
+ computeSpanDelta,
7
+ computeSpanMarkers,
8
+ computeSpanSegments,
9
+ computeTimeMarkers,
10
+ getResourceColor,
11
+ } from './utils';
12
+
13
+ /** Build a high-res timestamp tuple ([seconds, nanoseconds]) for a given ms. */
14
+ function ts(ms: number): [number, number] {
15
+ return [Math.floor(ms / 1000), (ms % 1000) * 1e6];
16
+ }
17
+
18
+ function hookSpan(opts: {
19
+ startMs: number;
20
+ endMs: number;
21
+ receivesMs: number[];
22
+ disposedMs?: number;
23
+ attrSetMs?: number[];
24
+ }): Span {
25
+ const events: SpanEvent[] = [
26
+ { name: 'hook_created', timestamp: ts(opts.startMs), attributes: {} },
27
+ ...opts.receivesMs.map((m) => ({
28
+ name: 'hook_received',
29
+ timestamp: ts(m),
30
+ attributes: {},
31
+ })),
32
+ ...(opts.attrSetMs ?? []).map((m) => ({
33
+ name: 'attr_set',
34
+ timestamp: ts(m),
35
+ attributes: {},
36
+ })),
37
+ ...(opts.disposedMs !== undefined
38
+ ? [
39
+ {
40
+ name: 'hook_disposed',
41
+ timestamp: ts(opts.disposedMs),
42
+ attributes: {},
43
+ } satisfies SpanEvent,
44
+ ]
45
+ : []),
46
+ ];
47
+
48
+ return {
49
+ name: 'hook',
50
+ kind: 0,
51
+ resource: 'hook',
52
+ library: { name: 'workflow' },
53
+ spanId: 'hook-1',
54
+ status: { code: 1 },
55
+ traceFlags: 0,
56
+ attributes: {},
57
+ links: [],
58
+ events,
59
+ startTime: ts(opts.startMs),
60
+ endTime: ts(opts.endMs),
61
+ duration: ts(opts.endMs - opts.startMs),
62
+ };
63
+ }
64
+
65
+ describe('computeSpanSegments (run)', () => {
66
+ function runSpan(status: string): Span {
67
+ return {
68
+ name: 'run',
69
+ kind: 0,
70
+ resource: 'run',
71
+ library: { name: 'workflow' },
72
+ spanId: 'run-1',
73
+ status: { code: 1 },
74
+ traceFlags: 0,
75
+ attributes: { data: { status } },
76
+ links: [],
77
+ events: [{ name: 'run_created', timestamp: ts(0), attributes: {} }],
78
+ startTime: ts(0),
79
+ endTime: ts(100_000),
80
+ duration: ts(100_000),
81
+ };
82
+ }
83
+
84
+ it('maps pending runs to a pending segment (not running)', () => {
85
+ expect(computeSpanSegments(runSpan('pending'))).toEqual([
86
+ { startFraction: 0, endFraction: 1, status: 'pending' },
87
+ ]);
88
+ });
89
+
90
+ it('maps running runs to a running segment', () => {
91
+ expect(computeSpanSegments(runSpan('running'))).toEqual([
92
+ { startFraction: 0, endFraction: 1, status: 'running' },
93
+ ]);
94
+ });
95
+ });
96
+
97
+ describe('computeSpanSegments (hook)', () => {
98
+ it('renders a single waiting segment for a hook resumed many times but not disposed', () => {
99
+ const span = hookSpan({
100
+ startMs: 0,
101
+ endMs: 100_000,
102
+ receivesMs: [1_000, 50_000, 99_000],
103
+ });
104
+
105
+ // A hook resumed N times still re-suspends after every resumption, so the
106
+ // bar must stay "waiting" for its whole life — not flip to a filled
107
+ // "received" segment after the first receive (which hid resumptions 2..N).
108
+ expect(computeSpanSegments(span)).toEqual([
109
+ { startFraction: 0, endFraction: 1, status: 'waiting' },
110
+ ]);
111
+ });
112
+
113
+ it('ends the waiting segment at disposal and appends a succeeded tail', () => {
114
+ const span = hookSpan({
115
+ startMs: 0,
116
+ endMs: 100_000,
117
+ receivesMs: [1_000, 50_000],
118
+ disposedMs: 80_000,
119
+ });
120
+
121
+ expect(computeSpanSegments(span)).toEqual([
122
+ { startFraction: 0, endFraction: 0.8, status: 'waiting' },
123
+ { startFraction: 0.8, endFraction: 1, status: 'succeeded' },
124
+ ]);
125
+ });
126
+
127
+ it('treats a never-resolved hook as fully waiting', () => {
128
+ const span = hookSpan({ startMs: 0, endMs: 100_000, receivesMs: [] });
129
+
130
+ expect(computeSpanSegments(span)).toEqual([
131
+ { startFraction: 0, endFraction: 1, status: 'waiting' },
132
+ ]);
133
+ });
134
+ });
135
+
136
+ describe('computeSpanMarkers', () => {
137
+ it('emits one marker per resumption, including those at the temporal edges', () => {
138
+ const span = hookSpan({
139
+ startMs: 0,
140
+ endMs: 100_000,
141
+ receivesMs: [1_000, 50_000, 99_000],
142
+ });
143
+
144
+ const markers = computeSpanMarkers(span);
145
+ expect(markers.map((m) => m.timeMs)).toEqual([1_000, 50_000, 99_000]);
146
+ });
147
+
148
+ it('merges hook_received and attr_set events, sorted by time', () => {
149
+ const span = hookSpan({
150
+ startMs: 0,
151
+ endMs: 100_000,
152
+ receivesMs: [50_000],
153
+ attrSetMs: [10_000, 70_000],
154
+ });
155
+
156
+ expect(computeSpanMarkers(span).map((m) => m.timeMs)).toEqual([
157
+ 10_000, 50_000, 70_000,
158
+ ]);
159
+ });
160
+
161
+ it('returns no markers when the span has no marker events', () => {
162
+ const span = hookSpan({ startMs: 0, endMs: 100_000, receivesMs: [] });
163
+ expect(computeSpanMarkers(span)).toEqual([]);
164
+ });
165
+ });
166
+
167
+ describe('computeOffscreenMarkers', () => {
168
+ const mk = (timeMs: number) => ({ timeMs });
169
+
170
+ it('partitions markers by side with the nearest one per side', () => {
171
+ const markers = [mk(5), mk(8), mk(50), mk(92), mk(99)];
172
+ // Visible window [10, 90]: 5 & 8 off left (nearest 8), 92 & 99 off right
173
+ // (nearest 92), 50 in view.
174
+ expect(computeOffscreenMarkers(markers, 10, 90)).toEqual({
175
+ left: { count: 2, nearestMs: 8 },
176
+ right: { count: 2, nearestMs: 92 },
177
+ });
178
+ });
179
+
180
+ it('returns null for a side with nothing off-screen', () => {
181
+ expect(computeOffscreenMarkers([mk(20), mk(50)], 10, 90)).toEqual({
182
+ left: null,
183
+ right: null,
184
+ });
185
+ });
186
+ });
187
+
188
+ describe('clampViewportToRoot', () => {
189
+ const clamp = (next: { start: number; end: number }) =>
190
+ clampViewportToRoot(next, 100, 1100, 10);
191
+
192
+ it('passes through a window already inside the root', () => {
193
+ expect(clamp({ start: 200, end: 400 })).toEqual({ start: 200, end: 400 });
194
+ });
195
+
196
+ it('shifts a window past the left edge without changing its duration', () => {
197
+ expect(clamp({ start: 50, end: 250 })).toEqual({ start: 100, end: 300 });
198
+ });
199
+
200
+ it('shifts a window past the right edge without changing its duration', () => {
201
+ expect(clamp({ start: 1000, end: 1200 })).toEqual({
202
+ start: 900,
203
+ end: 1100,
204
+ });
205
+ });
206
+
207
+ it('clamps a window wider than the root to the full extent', () => {
208
+ expect(clamp({ start: 0, end: 5000 })).toEqual({ start: 100, end: 1100 });
209
+ });
210
+
211
+ it('enforces the minimum duration', () => {
212
+ expect(clamp({ start: 500, end: 502 })).toEqual({ start: 500, end: 510 });
213
+ });
214
+
215
+ it('keeps a minimum-duration window inside the root near the right edge', () => {
216
+ expect(clamp({ start: 1098, end: 1099 })).toEqual({
217
+ start: 1090,
218
+ end: 1100,
219
+ });
220
+ });
221
+ });
222
+
223
+ describe('computeTimeMarkers', () => {
224
+ it('emits distinct, precise labels across a sub-second-step window', () => {
225
+ // A ~3s window drops the tick step to 500ms. Before the fix this rendered
226
+ // duplicate "2s, 2s, 3s, 3s" labels; now each tick is distinct.
227
+ const labels = computeTimeMarkers(3000, 0).map((m) => m.label);
228
+ expect(labels).toEqual(['0s', '500ms', '1s', '1.5s', '2s', '2.5s', '3s']);
229
+ expect(new Set(labels).size).toBe(labels.length);
230
+ });
231
+
232
+ it('keeps clean whole-second labels when the step is >=1s', () => {
233
+ const labels = computeTimeMarkers(10_000, 0).map((m) => m.label);
234
+ expect(labels).toEqual(['0s', '2s', '4s', '6s', '8s', '10s']);
235
+ });
236
+
237
+ it('still reads in ms when super zoomed in', () => {
238
+ const labels = computeTimeMarkers(120, 0).map((m) => m.label);
239
+ expect(labels).toEqual([
240
+ '0s',
241
+ '20ms',
242
+ '40ms',
243
+ '60ms',
244
+ '80ms',
245
+ '100ms',
246
+ '120ms',
247
+ ]);
248
+ });
249
+ });
250
+
251
+ describe('getResourceColor', () => {
252
+ it('uses gray for hooks (passive spans), not amber', () => {
253
+ expect(getResourceColor('hook')).toEqual({
254
+ bg: 'var(--ds-gray-200)',
255
+ border: 'var(--ds-gray-500)',
256
+ errorBg: 'var(--ds-red-200)',
257
+ errorBorder: 'var(--ds-red-500)',
258
+ });
259
+ });
260
+ });
261
+
262
+ describe('computeSpanDelta', () => {
263
+ function span(id: string, startMs: number, endMs: number): Span {
264
+ return {
265
+ name: id,
266
+ kind: 0,
267
+ resource: 'step',
268
+ library: { name: 'workflow' },
269
+ spanId: id,
270
+ status: { code: 1 },
271
+ traceFlags: 0,
272
+ attributes: {},
273
+ links: [],
274
+ events: [],
275
+ startTime: ts(startMs),
276
+ endTime: ts(endMs),
277
+ duration: ts(endMs - startMs),
278
+ };
279
+ }
280
+
281
+ it('measures the gap between disjoint spans (anchor earlier)', () => {
282
+ const delta = computeSpanDelta(
283
+ span('a', 0, 100),
284
+ span('b', 300, 400),
285
+ 0,
286
+ 1000
287
+ );
288
+ expect(delta).toEqual({
289
+ deltaMs: 200,
290
+ anchorFrac: 0.1,
291
+ hoveredFrac: 0.3,
292
+ anchorEdge: 'end',
293
+ hoveredOffscreen: null,
294
+ });
295
+ });
296
+
297
+ it('is direction-agnostic: anchor later gives the same delta with edges swapped', () => {
298
+ const delta = computeSpanDelta(
299
+ span('b', 300, 400),
300
+ span('a', 0, 100),
301
+ 0,
302
+ 1000
303
+ );
304
+ expect(delta).toEqual({
305
+ deltaMs: 200,
306
+ anchorFrac: 0.3,
307
+ hoveredFrac: 0.1,
308
+ anchorEdge: 'start',
309
+ hoveredOffscreen: null,
310
+ });
311
+ });
312
+
313
+ it('measures start-to-start offset for overlapping spans', () => {
314
+ const delta = computeSpanDelta(
315
+ span('a', 0, 500),
316
+ span('b', 200, 800),
317
+ 0,
318
+ 1000
319
+ );
320
+ expect(delta).toEqual({
321
+ deltaMs: 200,
322
+ anchorFrac: 0,
323
+ hoveredFrac: 0.2,
324
+ anchorEdge: 'start',
325
+ hoveredOffscreen: null,
326
+ });
327
+ });
328
+
329
+ it('measures start-to-start offset for contained spans (step inside run)', () => {
330
+ const delta = computeSpanDelta(
331
+ span('run', 0, 1000),
332
+ span('step', 400, 600),
333
+ 0,
334
+ 1000
335
+ );
336
+ expect(delta).toEqual({
337
+ deltaMs: 400,
338
+ anchorFrac: 0,
339
+ hoveredFrac: 0.4,
340
+ anchorEdge: 'start',
341
+ hoveredOffscreen: null,
342
+ });
343
+ });
344
+
345
+ it('returns a zero delta for identical starts', () => {
346
+ const delta = computeSpanDelta(
347
+ span('a', 200, 500),
348
+ span('b', 200, 300),
349
+ 0,
350
+ 1000
351
+ );
352
+ expect(delta).toEqual({
353
+ deltaMs: 0,
354
+ anchorFrac: 0.2,
355
+ hoveredFrac: 0.2,
356
+ anchorEdge: 'start',
357
+ hoveredOffscreen: null,
358
+ });
359
+ });
360
+
361
+ it('keeps a zero delta sitting exactly on the viewport edge (root span anchor at default zoom)', () => {
362
+ const delta = computeSpanDelta(
363
+ span('run', 0, 1000),
364
+ span('step', 0, 400),
365
+ 0,
366
+ 1000
367
+ );
368
+ expect(delta).toEqual({
369
+ deltaMs: 0,
370
+ anchorFrac: 0,
371
+ hoveredFrac: 0,
372
+ anchorEdge: 'start',
373
+ hoveredOffscreen: null,
374
+ });
375
+ });
376
+
377
+ it('treats touching spans as a zero gap, not an overlap', () => {
378
+ const delta = computeSpanDelta(
379
+ span('a', 0, 300),
380
+ span('b', 300, 400),
381
+ 0,
382
+ 1000
383
+ );
384
+ expect(delta).toEqual({
385
+ deltaMs: 0,
386
+ anchorFrac: 0.3,
387
+ hoveredFrac: 0.3,
388
+ anchorEdge: 'end',
389
+ hoveredOffscreen: null,
390
+ });
391
+ });
392
+
393
+ it('handles zero-duration spans as points', () => {
394
+ const delta = computeSpanDelta(
395
+ span('a', 100, 100),
396
+ span('b', 400, 400),
397
+ 0,
398
+ 1000
399
+ );
400
+ expect(delta).toEqual({
401
+ deltaMs: 300,
402
+ anchorFrac: 0.1,
403
+ hoveredFrac: 0.4,
404
+ anchorEdge: 'end',
405
+ hoveredOffscreen: null,
406
+ });
407
+ });
408
+
409
+ it('clamps edges to the viewport but keeps the true delta', () => {
410
+ const delta = computeSpanDelta(
411
+ span('a', 0, 100),
412
+ span('b', 900, 950),
413
+ 500,
414
+ 800
415
+ );
416
+ expect(delta).toEqual({
417
+ deltaMs: 800,
418
+ anchorFrac: 0,
419
+ hoveredFrac: 1,
420
+ anchorEdge: 'end',
421
+ hoveredOffscreen: 'right',
422
+ });
423
+ });
424
+
425
+ it('flags a hovered span lying fully left of the viewport', () => {
426
+ const delta = computeSpanDelta(
427
+ span('anchor', 600, 700),
428
+ span('hovered', 0, 100),
429
+ 200,
430
+ 1200
431
+ );
432
+ expect(delta).toEqual({
433
+ deltaMs: 500,
434
+ anchorFrac: 0.4,
435
+ hoveredFrac: 0,
436
+ anchorEdge: 'start',
437
+ hoveredOffscreen: 'left',
438
+ });
439
+ });
440
+
441
+ it('returns null when the measurement is entirely left of the viewport', () => {
442
+ expect(
443
+ computeSpanDelta(span('a', 0, 100), span('b', 200, 300), 500, 1000)
444
+ ).toBeNull();
445
+ });
446
+
447
+ it('returns null when the measurement is entirely right of the viewport', () => {
448
+ expect(
449
+ computeSpanDelta(span('a', 600, 700), span('b', 900, 950), 0, 500)
450
+ ).toBeNull();
451
+ });
452
+
453
+ it('returns null for an empty viewport range', () => {
454
+ expect(
455
+ computeSpanDelta(span('a', 0, 100), span('b', 200, 300), 500, 500)
456
+ ).toBeNull();
457
+ });
458
+ });