@workflow/web-shared 5.0.0-beta.3 → 5.0.0-beta.31

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 (402) hide show
  1. package/README.md +2 -10
  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 +228 -90
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +6 -2
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +5 -2
  10. package/dist/components/new-trace-viewer/components/copy-button.js +3 -3
  11. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts +34 -0
  12. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  13. package/dist/components/new-trace-viewer/components/detail-panel-width.js +67 -0
  14. package/dist/components/new-trace-viewer/components/detail-panel.d.ts +14 -0
  15. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +1 -0
  16. package/dist/components/new-trace-viewer/components/detail-panel.js +122 -0
  17. package/dist/components/new-trace-viewer/components/draggable-border.d.ts +31 -0
  18. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +1 -0
  19. package/dist/components/new-trace-viewer/components/draggable-border.js +140 -0
  20. package/dist/components/new-trace-viewer/components/event-list.d.ts +4 -2
  21. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
  22. package/dist/components/new-trace-viewer/components/event-list.js +22 -13
  23. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  28. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  29. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  30. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  31. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  32. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  33. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  34. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  35. package/dist/components/new-trace-viewer/components/minimap.d.ts +14 -0
  36. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +1 -0
  37. package/dist/components/new-trace-viewer/components/minimap.js +337 -0
  38. package/dist/components/new-trace-viewer/components/pane-constants.d.ts +14 -0
  39. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +1 -0
  40. package/dist/components/new-trace-viewer/components/pane-constants.js +16 -0
  41. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  42. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  43. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  44. package/dist/components/new-trace-viewer/components/split-pane.d.ts +3 -7
  45. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  46. package/dist/components/new-trace-viewer/components/split-pane.js +25 -84
  47. package/dist/components/new-trace-viewer/components/timeline.d.ts +19 -15
  48. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  49. package/dist/components/new-trace-viewer/components/timeline.js +229 -111
  50. package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
  51. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  52. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  53. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +55 -0
  54. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  55. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  56. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +26 -0
  58. package/dist/components/new-trace-viewer/components/use-element-width.d.ts +8 -0
  59. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/components/use-element-width.js +25 -0
  61. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
  62. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  63. package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
  64. package/dist/components/new-trace-viewer/context.d.ts +3 -1
  65. package/dist/components/new-trace-viewer/context.d.ts.map +1 -1
  66. package/dist/components/new-trace-viewer/context.js +9 -10
  67. package/dist/components/new-trace-viewer/icons.js +3 -3
  68. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  69. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  70. package/dist/components/new-trace-viewer/search.js +134 -0
  71. package/dist/components/new-trace-viewer/trace-viewer.d.ts +6 -3
  72. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  73. package/dist/components/new-trace-viewer/trace-viewer.js +167 -162
  74. package/dist/components/new-trace-viewer/types.d.ts +2 -0
  75. package/dist/components/new-trace-viewer/types.d.ts.map +1 -1
  76. package/dist/components/new-trace-viewer/types.js +2 -2
  77. package/dist/components/new-trace-viewer/utils.d.ts +48 -13
  78. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
  79. package/dist/components/new-trace-viewer/utils.js +135 -107
  80. package/dist/components/run-trace-view.d.ts +5 -7
  81. package/dist/components/run-trace-view.d.ts.map +1 -1
  82. package/dist/components/run-trace-view.js +3 -3
  83. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  84. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  85. package/dist/components/sidebar/attribute-panel.js +133 -113
  86. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  87. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  88. package/dist/components/sidebar/attributes-block.js +140 -0
  89. package/dist/components/sidebar/conversation-view.js +1 -1
  90. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  91. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  92. package/dist/components/sidebar/copyable-data-block.js +17 -16
  93. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  94. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  95. package/dist/components/sidebar/entity-detail-panel.js +35 -69
  96. package/dist/components/sidebar/events-list.d.ts +6 -2
  97. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  98. package/dist/components/sidebar/events-list.js +76 -62
  99. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  100. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  101. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  102. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  103. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  104. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  105. package/dist/components/sidebar/span-detail-merge.js +92 -0
  106. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  107. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  108. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  109. package/dist/components/stream-viewer.js +1 -1
  110. package/dist/components/trace-viewer/components/map.d.ts +2 -2
  111. package/dist/components/trace-viewer/components/map.d.ts.map +1 -1
  112. package/dist/components/trace-viewer/components/map.js +1 -1
  113. package/dist/components/trace-viewer/components/markers.js +1 -1
  114. package/dist/components/trace-viewer/components/node.d.ts +7 -7
  115. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  116. package/dist/components/trace-viewer/components/node.js +2 -1
  117. package/dist/components/trace-viewer/components/search-input.js +1 -1
  118. package/dist/components/trace-viewer/components/search.js +1 -1
  119. package/dist/components/trace-viewer/components/span-content.js +1 -1
  120. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  121. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  122. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  123. package/dist/components/trace-viewer/components/ui.js +1 -1
  124. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  125. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  126. package/dist/components/trace-viewer/context.js +1 -1
  127. package/dist/components/trace-viewer/index.js +1 -1
  128. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  129. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  130. package/dist/components/trace-viewer/types.js +1 -1
  131. package/dist/components/trace-viewer/util/constants.js +1 -1
  132. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  133. package/dist/components/trace-viewer/util/timing.d.ts +3 -3
  134. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  135. package/dist/components/trace-viewer/util/timing.js +8 -11
  136. package/dist/components/trace-viewer/util/tree.js +1 -1
  137. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  138. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  139. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  140. package/dist/components/trace-viewer/worker.js +1 -1
  141. package/dist/components/trace-viewer-new.d.ts +5 -1
  142. package/dist/components/trace-viewer-new.d.ts.map +1 -1
  143. package/dist/components/trace-viewer-new.js +8 -10
  144. package/dist/components/ui/alert.js +2 -2
  145. package/dist/components/ui/button.d.ts +10 -0
  146. package/dist/components/ui/button.d.ts.map +1 -0
  147. package/dist/components/ui/button.js +46 -0
  148. package/dist/components/ui/card.js +2 -2
  149. package/dist/components/ui/collapsible.d.ts +46 -0
  150. package/dist/components/ui/collapsible.d.ts.map +1 -0
  151. package/dist/components/ui/collapsible.js +66 -0
  152. package/dist/components/ui/context-card.d.ts +47 -0
  153. package/dist/components/ui/context-card.d.ts.map +1 -0
  154. package/dist/components/ui/context-card.js +471 -0
  155. package/dist/components/ui/data-inspector.d.ts +7 -6
  156. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  157. package/dist/components/ui/data-inspector.js +232 -99
  158. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  159. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  160. package/dist/components/ui/data-inspector.styles.js +95 -0
  161. package/dist/components/ui/decrypt-button.js +1 -1
  162. package/dist/components/ui/error-card.js +2 -2
  163. package/dist/components/ui/error-stack-block.d.ts +17 -10
  164. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  165. package/dist/components/ui/error-stack-block.js +49 -30
  166. package/dist/components/ui/icon-button.d.ts +19 -0
  167. package/dist/components/ui/icon-button.d.ts.map +1 -0
  168. package/dist/components/ui/icon-button.js +29 -0
  169. package/dist/components/ui/kbd.d.ts +10 -0
  170. package/dist/components/ui/kbd.d.ts.map +1 -0
  171. package/dist/components/ui/kbd.js +25 -0
  172. package/dist/components/ui/load-more-button.js +1 -1
  173. package/dist/components/ui/menu-dropdown.js +1 -1
  174. package/dist/components/ui/skeleton.js +2 -2
  175. package/dist/components/ui/spinner.js +1 -1
  176. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  177. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  178. package/dist/components/ui/timestamp-tooltip.js +80 -132
  179. package/dist/components/ui/tooltip.d.ts +10 -0
  180. package/dist/components/ui/tooltip.d.ts.map +1 -0
  181. package/dist/components/ui/tooltip.js +12 -0
  182. package/dist/components/workflow-trace-view.d.ts +7 -8
  183. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  184. package/dist/components/workflow-trace-view.js +11 -16
  185. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  186. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  187. package/dist/components/workflow-traces/event-colors.js +15 -7
  188. package/dist/components/workflow-traces/trace-colors.d.ts.map +1 -1
  189. package/dist/components/workflow-traces/trace-colors.js +3 -4
  190. package/dist/components/workflow-traces/trace-span-construction.d.ts +7 -4
  191. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  192. package/dist/components/workflow-traces/trace-span-construction.js +87 -33
  193. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  194. package/dist/hooks/use-dark-mode.js +1 -1
  195. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  196. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  197. package/dist/hooks/use-intersection-observer.js +29 -0
  198. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  199. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  200. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  201. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  202. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  203. package/dist/hooks/use-reduced-motion.js +29 -0
  204. package/dist/index.d.ts +3 -2
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +4 -3
  207. package/dist/lib/cn.d.ts +10 -0
  208. package/dist/lib/cn.d.ts.map +1 -0
  209. package/dist/lib/cn.js +83 -0
  210. package/dist/lib/event-analysis.d.ts +1 -1
  211. package/dist/lib/event-analysis.d.ts.map +1 -1
  212. package/dist/lib/event-analysis.js +3 -2
  213. package/dist/lib/event-materialization.d.ts +1 -1
  214. package/dist/lib/event-materialization.d.ts.map +1 -1
  215. package/dist/lib/event-materialization.js +29 -21
  216. package/dist/lib/exact-event-search-id.d.ts +25 -0
  217. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  218. package/dist/lib/exact-event-search-id.js +39 -0
  219. package/dist/lib/hydration.d.ts +17 -2
  220. package/dist/lib/hydration.d.ts.map +1 -1
  221. package/dist/lib/hydration.js +185 -22
  222. package/dist/lib/stream-display.js +1 -1
  223. package/dist/lib/toast.js +1 -1
  224. package/dist/lib/trace-builder.d.ts +16 -4
  225. package/dist/lib/trace-builder.d.ts.map +1 -1
  226. package/dist/lib/trace-builder.js +34 -15
  227. package/dist/lib/utils.d.ts +23 -9
  228. package/dist/lib/utils.d.ts.map +1 -1
  229. package/dist/lib/utils.js +73 -33
  230. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  231. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  232. package/dist/lib/zstd-browser-decoder.js +41 -0
  233. package/dist/styles.css +14 -0
  234. package/package.json +10 -7
  235. package/src/components/event-list-view.tsx +375 -116
  236. package/src/components/index.ts +12 -5
  237. package/src/components/new-trace-viewer/components/copy-button.tsx +2 -2
  238. package/src/components/new-trace-viewer/components/detail-panel-width.test.ts +123 -0
  239. package/src/components/new-trace-viewer/components/detail-panel-width.ts +76 -0
  240. package/src/components/new-trace-viewer/components/detail-panel.tsx +273 -0
  241. package/src/components/new-trace-viewer/components/draggable-border.tsx +216 -0
  242. package/src/components/new-trace-viewer/components/event-list.tsx +57 -32
  243. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  244. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  245. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  246. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  247. package/src/components/new-trace-viewer/components/minimap.tsx +559 -0
  248. package/src/components/new-trace-viewer/components/pane-constants.ts +19 -0
  249. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  250. package/src/components/new-trace-viewer/components/split-pane.tsx +80 -135
  251. package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
  252. package/src/components/new-trace-viewer/components/timeline.tsx +603 -239
  253. package/src/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  254. package/src/components/new-trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  255. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  256. package/src/components/new-trace-viewer/components/use-element-width.ts +29 -0
  257. package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
  258. package/src/components/new-trace-viewer/context.tsx +13 -14
  259. package/src/components/new-trace-viewer/icons.tsx +2 -2
  260. package/src/components/new-trace-viewer/search.ts +178 -0
  261. package/src/components/new-trace-viewer/trace-viewer.tsx +336 -293
  262. package/src/components/new-trace-viewer/types.ts +2 -0
  263. package/src/components/new-trace-viewer/utils.test.ts +247 -0
  264. package/src/components/new-trace-viewer/utils.ts +203 -134
  265. package/src/components/run-trace-view.tsx +10 -14
  266. package/src/components/sidebar/attribute-panel.tsx +276 -275
  267. package/src/components/sidebar/attributes-block.tsx +326 -0
  268. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  269. package/src/components/sidebar/entity-detail-panel.tsx +89 -123
  270. package/src/components/sidebar/events-list.tsx +196 -178
  271. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  272. package/src/components/sidebar/span-detail-merge.ts +134 -0
  273. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  274. package/src/components/trace-viewer/components/node.tsx +3 -2
  275. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  276. package/src/components/trace-viewer/util/timing.ts +7 -11
  277. package/src/components/trace-viewer-new.tsx +21 -15
  278. package/src/components/ui/alert.tsx +1 -1
  279. package/src/components/ui/button.tsx +68 -0
  280. package/src/components/ui/card.tsx +1 -1
  281. package/src/components/ui/collapsible.tsx +219 -0
  282. package/src/components/ui/context-card.tsx +784 -0
  283. package/src/components/ui/data-inspector.styles.ts +96 -0
  284. package/src/components/ui/data-inspector.tsx +501 -204
  285. package/src/components/ui/error-card.tsx +1 -1
  286. package/src/components/ui/error-stack-block.tsx +84 -55
  287. package/src/components/ui/icon-button.tsx +53 -0
  288. package/src/components/ui/kbd.tsx +43 -0
  289. package/src/components/ui/skeleton.tsx +1 -1
  290. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  291. package/src/components/ui/tooltip.tsx +47 -0
  292. package/src/components/workflow-trace-view.tsx +31 -36
  293. package/src/components/workflow-traces/event-colors.ts +15 -11
  294. package/src/components/workflow-traces/trace-colors.ts +6 -6
  295. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  296. package/src/components/workflow-traces/trace-span-construction.ts +118 -35
  297. package/src/hooks/use-intersection-observer.ts +57 -0
  298. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  299. package/src/hooks/use-reduced-motion.ts +34 -0
  300. package/src/index.ts +9 -0
  301. package/src/lib/cn.ts +93 -0
  302. package/src/lib/event-analysis.ts +6 -4
  303. package/src/lib/event-materialization.ts +35 -21
  304. package/src/lib/exact-event-search-id.ts +67 -0
  305. package/src/lib/hydration.ts +203 -29
  306. package/src/lib/trace-builder.ts +44 -19
  307. package/src/lib/utils.test.ts +33 -0
  308. package/src/lib/utils.ts +82 -35
  309. package/src/lib/zstd-browser-decoder.ts +42 -0
  310. package/src/styles.css +14 -0
  311. package/dist/components/error-boundary.js.map +0 -1
  312. package/dist/components/event-list-view.js.map +0 -1
  313. package/dist/components/hook-actions.js.map +0 -1
  314. package/dist/components/index.js.map +0 -1
  315. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  316. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  317. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  318. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  319. package/dist/components/new-trace-viewer/context.js.map +0 -1
  320. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  321. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  322. package/dist/components/new-trace-viewer/detail-panel.js +0 -11
  323. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  324. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  325. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  326. package/dist/components/new-trace-viewer/types.js.map +0 -1
  327. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  328. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  330. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  331. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  332. package/dist/components/run-trace-view.js.map +0 -1
  333. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  334. package/dist/components/sidebar/conversation-view.js.map +0 -1
  335. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  336. package/dist/components/sidebar/detail-card.d.ts +0 -14
  337. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  338. package/dist/components/sidebar/detail-card.js +0 -20
  339. package/dist/components/sidebar/detail-card.js.map +0 -1
  340. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  341. package/dist/components/sidebar/events-list.js.map +0 -1
  342. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  343. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  344. package/dist/components/stream-viewer.js.map +0 -1
  345. package/dist/components/trace-viewer/components/map.js.map +0 -1
  346. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  347. package/dist/components/trace-viewer/components/node.js.map +0 -1
  348. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  349. package/dist/components/trace-viewer/components/search.js.map +0 -1
  350. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  351. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  352. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  353. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  354. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  355. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  356. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  357. package/dist/components/trace-viewer/context.js.map +0 -1
  358. package/dist/components/trace-viewer/index.js.map +0 -1
  359. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  360. package/dist/components/trace-viewer/types.js.map +0 -1
  361. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  362. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  363. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  364. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  365. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  366. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  367. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  368. package/dist/components/trace-viewer/worker.js.map +0 -1
  369. package/dist/components/trace-viewer-new.js.map +0 -1
  370. package/dist/components/ui/alert.js.map +0 -1
  371. package/dist/components/ui/card.js.map +0 -1
  372. package/dist/components/ui/data-inspector.js.map +0 -1
  373. package/dist/components/ui/decrypt-button.js.map +0 -1
  374. package/dist/components/ui/error-card.js.map +0 -1
  375. package/dist/components/ui/error-stack-block.js.map +0 -1
  376. package/dist/components/ui/inspector-theme.d.ts +0 -95
  377. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  378. package/dist/components/ui/inspector-theme.js +0 -82
  379. package/dist/components/ui/inspector-theme.js.map +0 -1
  380. package/dist/components/ui/load-more-button.js.map +0 -1
  381. package/dist/components/ui/menu-dropdown.js.map +0 -1
  382. package/dist/components/ui/skeleton.js.map +0 -1
  383. package/dist/components/ui/spinner.js.map +0 -1
  384. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  385. package/dist/components/workflow-trace-view.js.map +0 -1
  386. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  387. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  388. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  389. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  390. package/dist/hooks/use-dark-mode.js.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/lib/event-analysis.js.map +0 -1
  393. package/dist/lib/event-materialization.js.map +0 -1
  394. package/dist/lib/hydration.js.map +0 -1
  395. package/dist/lib/stream-display.js.map +0 -1
  396. package/dist/lib/toast.js.map +0 -1
  397. package/dist/lib/trace-builder.js.map +0 -1
  398. package/dist/lib/utils.js.map +0 -1
  399. package/src/components/new-trace-viewer/detail-panel.tsx +0 -57
  400. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  401. package/src/components/sidebar/detail-card.tsx +0 -65
  402. package/src/components/ui/inspector-theme.ts +0 -110
@@ -1,5 +1,9 @@
1
- import type { Span, SpanEvent } from '../trace-viewer/types';
2
- import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
1
+ import {
2
+ formatDuration,
3
+ formatDurationPrecise,
4
+ getHighResInMs,
5
+ } from '../trace-viewer/util/timing';
6
+ import type { Span, SpanEvent } from './types';
3
7
 
4
8
  // ---------------------------------------------------------------------------
5
9
  // Root bounds
@@ -30,33 +34,69 @@ export function computeRootBounds(spans: Span[]): RootBounds {
30
34
  return { startTime: minStart, endTime: maxEnd, duration };
31
35
  }
32
36
 
37
+ export function getSpanDurationMs(span: Span): number {
38
+ return Math.max(
39
+ 0,
40
+ getHighResInMs(span.endTime) - getHighResInMs(span.startTime)
41
+ );
42
+ }
43
+
44
+ export function isSpanErrored(span: Span): boolean {
45
+ const workflowStatus = (span.attributes.data as Record<string, unknown>)
46
+ ?.status as string | undefined;
47
+ return span.status.code === 2 || workflowStatus === 'failed';
48
+ }
49
+
33
50
  // ---------------------------------------------------------------------------
34
- // Time compression
51
+ // Viewport
35
52
  // ---------------------------------------------------------------------------
36
53
 
37
- export interface TimeCompression {
38
- toVisual(time: number): number;
39
- fromVisual(fraction: number): number;
40
- isCompressed: boolean;
54
+ export interface ViewportRange {
55
+ start: number;
56
+ end: number;
41
57
  }
42
58
 
43
- export function buildTimeCompression(
44
- _spans: Span[],
45
- viewStart: number,
46
- viewEnd: number
47
- ): TimeCompression {
48
- const range = viewEnd - viewStart;
59
+ /**
60
+ * Clamp a candidate viewport to the root extent. The requested duration is
61
+ * preserved where possible (clamped to [minDurationMs, root duration]), then
62
+ * the window is shifted back inside the root bounds.
63
+ */
64
+ export function clampViewportToRoot(
65
+ next: ViewportRange,
66
+ rootStart: number,
67
+ rootEnd: number,
68
+ minDurationMs: number
69
+ ): ViewportRange {
70
+ const rootDuration = Math.max(rootEnd - rootStart, minDurationMs);
71
+ const duration = Math.min(
72
+ rootDuration,
73
+ Math.max(minDurationMs, next.end - next.start)
74
+ );
75
+ const maxStart = rootEnd - duration;
76
+ const start = Math.min(Math.max(next.start, rootStart), maxStart);
77
+ return { start, end: start + duration };
78
+ }
49
79
 
50
- return {
51
- isCompressed: false,
52
- toVisual(time: number): number {
53
- if (range <= 0) return 0;
54
- return Math.min(Math.max((time - viewStart) / range, 0), 1);
55
- },
56
- fromVisual(fraction: number): number {
57
- return viewStart + fraction * range;
58
- },
59
- };
80
+ // ---------------------------------------------------------------------------
81
+ // Wheel gestures — shared between the timeline and the minimap
82
+ // ---------------------------------------------------------------------------
83
+
84
+ /** Convert a wheel delta to pixel units (line-mode deltas arrive in lines). */
85
+ export function wheelDeltaToPixels(delta: number, deltaMode: number): number {
86
+ return deltaMode === 1 ? delta * 16 : delta;
87
+ }
88
+
89
+ /**
90
+ * Exponential zoom factor for a wheel gesture. Coarse mouse-wheel steps are
91
+ * damped harder than trackpad pinches so both feel similar.
92
+ */
93
+ export function wheelZoomScaleFactor(event: {
94
+ deltaY: number;
95
+ deltaMode: number;
96
+ }): number {
97
+ const dy = wheelDeltaToPixels(event.deltaY, event.deltaMode);
98
+ const isMouseWheel = event.deltaMode === 1 || Math.abs(event.deltaY) >= 50;
99
+ return 2 ** (dy / (isMouseWheel ? 200 : 60));
60
100
  }
61
101
 
62
102
  // ---------------------------------------------------------------------------
@@ -66,6 +106,7 @@ export function buildTimeCompression(
66
106
  export interface TimeMarker {
67
107
  position: number;
68
108
  label: string;
109
+ value: number;
69
110
  }
70
111
 
71
112
  const NICE_INTERVALS = [
@@ -77,6 +118,8 @@ const NICE_INTERVALS = [
77
118
 
78
119
  const MAX_MARKERS = 8;
79
120
 
121
+ const MS_IN_SECOND = 1000;
122
+
80
123
  function pickInterval(viewDuration: number, maxTicks: number): number {
81
124
  for (const interval of NICE_INTERVALS) {
82
125
  if (viewDuration / interval <= maxTicks) return interval;
@@ -93,45 +136,26 @@ export function computeTimeMarkers(
93
136
  const maxTicks = 6;
94
137
  const interval = pickInterval(viewDuration, maxTicks);
95
138
 
96
- const firstTick = Math.ceil(offset / interval) * interval;
97
- const markers: TimeMarker[] = [];
98
-
99
- for (let t = firstTick; t <= offset + viewDuration; t += interval) {
100
- const position = (t - offset) / viewDuration;
101
- if (position < -0.01 || position > 1.01) continue;
102
- markers.push({
103
- position: Math.min(Math.max(position, 0), 1),
104
- label: formatDuration(Math.abs(t), true),
105
- });
106
- if (markers.length >= MAX_MARKERS) break;
107
- }
108
-
109
- return markers;
110
- }
111
-
112
- export function computeCompressedTimeMarkers(
113
- compression: TimeCompression,
114
- viewStart: number,
115
- viewEnd: number,
116
- rootStart: number
117
- ): TimeMarker[] {
118
- const viewDuration = viewEnd - viewStart;
119
- if (viewDuration <= 0) return [];
120
-
121
- const maxTicks = 6;
122
- const interval = pickInterval(viewDuration, maxTicks);
123
- const offset = viewStart - rootStart;
139
+ // Sub-second steps need fractional labels, or ticks past 1s collide as
140
+ // duplicate whole seconds ("…1s, 2s, 2s, 3s"). Scale decimals to the step.
141
+ const fractionDigits =
142
+ interval >= MS_IN_SECOND
143
+ ? 0
144
+ : Math.ceil(-Math.log10(interval / MS_IN_SECOND));
124
145
 
125
146
  const firstTick = Math.ceil(offset / interval) * interval;
126
147
  const markers: TimeMarker[] = [];
127
148
 
128
149
  for (let t = firstTick; t <= offset + viewDuration; t += interval) {
129
- const absTime = rootStart + t;
130
- const position = compression.toVisual(absTime);
150
+ const position = (t - offset) / viewDuration;
131
151
  if (position < -0.01 || position > 1.01) continue;
132
152
  markers.push({
133
153
  position: Math.min(Math.max(position, 0), 1),
134
- label: formatDuration(Math.abs(t), true),
154
+ label:
155
+ fractionDigits === 0
156
+ ? formatDuration(Math.abs(t), true)
157
+ : formatDurationPrecise(Math.abs(t), fractionDigits),
158
+ value: t,
135
159
  });
136
160
  if (markers.length >= MAX_MARKERS) break;
137
161
  }
@@ -152,8 +176,12 @@ export interface SpanGap {
152
176
 
153
177
  export function computeSpanGaps(
154
178
  spans: Span[],
155
- compression: TimeCompression
179
+ viewStart: number,
180
+ viewEnd: number
156
181
  ): SpanGap[] {
182
+ const range = viewEnd - viewStart;
183
+ if (range <= 0) return [];
184
+
157
185
  const gaps: SpanGap[] = [];
158
186
  for (let i = 0; i < spans.length - 1; i++) {
159
187
  const endTime = getHighResInMs(spans[i].endTime);
@@ -161,8 +189,8 @@ export function computeSpanGaps(
161
189
  const gapMs = startTime - endTime;
162
190
  if (gapMs <= 0) continue;
163
191
 
164
- const leftFrac = compression.toVisual(endTime);
165
- const rightFrac = compression.toVisual(startTime);
192
+ const leftFrac = Math.min(Math.max((endTime - viewStart) / range, 0), 1);
193
+ const rightFrac = Math.min(Math.max((startTime - viewStart) / range, 0), 1);
166
194
  if (rightFrac - leftFrac < 0.001) continue;
167
195
 
168
196
  gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
@@ -176,18 +204,50 @@ export function computeSpanGaps(
176
204
 
177
205
  export const RESOURCE_COLORS: Record<
178
206
  string,
179
- { bar: string; errorBar?: string }
207
+ {
208
+ bg: string;
209
+ border: string;
210
+ errorBg?: string;
211
+ errorBorder?: string;
212
+ }
180
213
  > = {
181
- run: { bar: 'var(--ds-blue-700)', errorBar: 'var(--ds-red-700)' },
182
- step: { bar: 'var(--ds-green-700)', errorBar: 'var(--ds-red-700)' },
183
- hook: { bar: 'var(--ds-amber-700)', errorBar: 'var(--ds-red-700)' },
184
- sleep: { bar: 'var(--ds-purple-700)', errorBar: 'var(--ds-red-700)' },
185
- default: { bar: 'var(--ds-gray-500)', errorBar: 'var(--ds-red-700)' },
214
+ run: {
215
+ bg: 'var(--ds-blue-200)',
216
+ border: 'var(--ds-blue-500)',
217
+ errorBg: 'var(--ds-red-200)',
218
+ errorBorder: 'var(--ds-red-500)',
219
+ },
220
+ step: {
221
+ bg: 'var(--ds-green-200)',
222
+ border: 'var(--ds-green-500)',
223
+ errorBg: 'var(--ds-red-200)',
224
+ errorBorder: 'var(--ds-red-500)',
225
+ },
226
+ hook: {
227
+ bg: 'var(--ds-amber-200)',
228
+ border: 'var(--ds-amber-500)',
229
+ errorBg: 'var(--ds-red-200)',
230
+ errorBorder: 'var(--ds-red-500)',
231
+ },
232
+ sleep: {
233
+ bg: 'var(--ds-purple-200)',
234
+ border: 'var(--ds-purple-500)',
235
+ errorBg: 'var(--ds-red-200)',
236
+ errorBorder: 'var(--ds-red-500)',
237
+ },
238
+ default: {
239
+ bg: 'var(--ds-gray-200)',
240
+ border: 'var(--ds-gray-500)',
241
+ errorBg: 'var(--ds-red-200)',
242
+ errorBorder: 'var(--ds-red-500)',
243
+ },
186
244
  };
187
245
 
188
246
  export function getResourceColor(resource: string): {
189
- bar: string;
190
- errorBar?: string;
247
+ bg: string;
248
+ border: string;
249
+ errorBg?: string;
250
+ errorBorder?: string;
191
251
  } {
192
252
  return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
193
253
  }
@@ -198,7 +258,9 @@ export function getResourceColor(resource: string): {
198
258
 
199
259
  export type SegmentStatus =
200
260
  | 'queued'
261
+ | 'pending'
201
262
  | 'running'
263
+ | 'completed'
202
264
  | 'failed'
203
265
  | 'retrying'
204
266
  | 'succeeded'
@@ -256,7 +318,7 @@ function computeStepSegmentsFromSpan(
256
318
  ]);
257
319
 
258
320
  if (marks.length === 0) {
259
- segments.push({ startFraction: 0, endFraction: 1, status: 'running' });
321
+ segments.push({ startFraction: 0, endFraction: 1, status: 'queued' });
260
322
  return segments;
261
323
  }
262
324
 
@@ -291,7 +353,7 @@ function computeStepSegmentsFromSpan(
291
353
  ? 'failed'
292
354
  : nextType === 'step_completed'
293
355
  ? 'succeeded'
294
- : 'running';
356
+ : 'retrying';
295
357
  segments.push({
296
358
  startFraction: markFrac,
297
359
  endFraction: nextFrac,
@@ -326,45 +388,18 @@ function computeHookSegmentsFromSpan(
326
388
  const segments: Segment[] = [];
327
389
  if (duration <= 0) return segments;
328
390
 
329
- const sorted = [...events]
330
- .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
331
- .sort((a, b) => a.time - b.time);
332
-
333
- const received = sorted.find((e) => e.name === 'hook_received');
334
- const disposed = sorted.find((e) => e.name === 'hook_disposed');
335
-
336
- if (!received && !disposed) {
337
- segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });
338
- return segments;
339
- }
340
-
341
- const receivedFrac = received
342
- ? timeToFraction(received.time, startMs, duration)
343
- : null;
391
+ const disposed = sortedEventMarks(events, ['hook_disposed'])[0];
344
392
  const disposedFrac = disposed
345
393
  ? timeToFraction(disposed.time, startMs, duration)
346
394
  : null;
347
395
 
348
- if (receivedFrac !== null && receivedFrac > 0.001) {
396
+ const waitingEnd = disposedFrac ?? 1;
397
+ if (waitingEnd > 0.001) {
349
398
  segments.push({
350
399
  startFraction: 0,
351
- endFraction: receivedFrac,
400
+ endFraction: waitingEnd,
352
401
  status: 'waiting',
353
402
  });
354
- } else if (receivedFrac === null && disposedFrac !== null) {
355
- segments.push({
356
- startFraction: 0,
357
- endFraction: disposedFrac,
358
- status: 'waiting',
359
- });
360
- }
361
-
362
- if (receivedFrac !== null) {
363
- segments.push({
364
- startFraction: receivedFrac,
365
- endFraction: disposedFrac ?? 1,
366
- status: 'received',
367
- });
368
403
  }
369
404
 
370
405
  if (disposedFrac !== null && disposedFrac < 0.999) {
@@ -379,39 +414,19 @@ function computeHookSegmentsFromSpan(
379
414
  }
380
415
 
381
416
  function computeSleepSegmentsFromSpan(
382
- startMs: number,
417
+ _startMs: number,
383
418
  duration: number,
384
- events: SpanEvent[]
419
+ _events: SpanEvent[]
385
420
  ): Segment[] {
386
- const segments: Segment[] = [];
387
- if (duration <= 0) return segments;
388
-
389
- const completedTime = events
390
- .filter((e) => e.name === 'wait_completed')
391
- .map((e) => getHighResInMs(e.timestamp))
392
- .sort((a, b) => a - b)[0];
393
-
394
- if (completedTime === undefined) {
395
- segments.push({ startFraction: 0, endFraction: 1, status: 'sleeping' });
396
- return segments;
397
- }
398
-
399
- const completedFrac = timeToFraction(completedTime, startMs, duration);
400
- if (completedFrac > 0.001) {
401
- segments.push({
402
- startFraction: 0,
403
- endFraction: completedFrac,
404
- status: 'sleeping',
405
- });
406
- }
407
-
408
- segments.push({
409
- startFraction: completedFrac,
410
- endFraction: 1,
411
- status: 'succeeded',
412
- });
421
+ if (duration <= 0) return [];
422
+ return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];
423
+ }
413
424
 
414
- return segments;
425
+ function runSegmentStatus(runStatus: string | undefined): SegmentStatus {
426
+ if (runStatus === 'failed') return 'failed';
427
+ if (runStatus === 'pending') return 'pending';
428
+ if (runStatus === 'running') return 'running';
429
+ return 'completed';
415
430
  }
416
431
 
417
432
  function computeRunSegmentsFromSpan(
@@ -428,11 +443,12 @@ function computeRunSegmentsFromSpan(
428
443
  .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
429
444
  .sort((a, b) => a.time - b.time);
430
445
 
446
+ const runData = attributes?.data as Record<string, unknown> | undefined;
447
+ const runStatus = runData?.status as string | undefined;
448
+
431
449
  const hasRunCreated = sorted.some((e) => e.name === 'run_created');
432
450
 
433
451
  if (!hasRunCreated) {
434
- const runData = attributes?.data as Record<string, unknown> | undefined;
435
- const runStatus = runData?.status as string | undefined;
436
452
  return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);
437
453
  }
438
454
 
@@ -454,7 +470,7 @@ function computeRunSegmentsFromSpan(
454
470
  segments.push({
455
471
  startFraction: cursor,
456
472
  endFraction: 1,
457
- status: failedEvent ? 'failed' : 'running',
473
+ status: failedEvent ? 'failed' : runSegmentStatus(runStatus),
458
474
  });
459
475
 
460
476
  return segments;
@@ -484,7 +500,7 @@ function computeV1RunSegments(
484
500
  segments.push({
485
501
  startFraction: cursor,
486
502
  endFraction: 1,
487
- status: runStatus === 'failed' ? 'failed' : 'running',
503
+ status: runSegmentStatus(runStatus),
488
504
  });
489
505
 
490
506
  return segments;
@@ -497,8 +513,7 @@ function computeV1RunSegments(
497
513
  */
498
514
  export function computeSpanSegments(span: Span): Segment[] {
499
515
  const startMs = getHighResInMs(span.startTime);
500
- const endMs = getHighResInMs(span.endTime);
501
- const duration = endMs - startMs;
516
+ const duration = getSpanDurationMs(span);
502
517
  const activeStartMs = span.activeStartTime
503
518
  ? getHighResInMs(span.activeStartTime)
504
519
  : undefined;
@@ -522,3 +537,57 @@ export function computeSpanSegments(span: Span): Segment[] {
522
537
  return [];
523
538
  }
524
539
  }
540
+
541
+ // ---------------------------------------------------------------------------
542
+ // Span markers — point-in-time events rendered as ticks on top of a bar
543
+ // ---------------------------------------------------------------------------
544
+
545
+ export interface SpanMarker {
546
+ timeMs: number;
547
+ }
548
+
549
+ // `hook_received` = a resumption; `attr_set` = attributes written mid-span.
550
+ const MARKER_EVENT_NAMES = ['hook_received', 'attr_set'];
551
+
552
+ export function computeSpanMarkers(span: Span): SpanMarker[] {
553
+ return sortedEventMarks(span.events, MARKER_EVENT_NAMES).map((mark) => ({
554
+ timeMs: mark.time,
555
+ }));
556
+ }
557
+
558
+ export interface OffscreenSide {
559
+ count: number;
560
+ /** Nearest off-screen marker — the one a reveal jumps to. */
561
+ nearestMs: number;
562
+ }
563
+
564
+ export interface OffscreenMarkers {
565
+ left: OffscreenSide | null;
566
+ right: OffscreenSide | null;
567
+ }
568
+
569
+ /** Partition markers outside `[visibleStartMs, visibleEndMs]` by side. */
570
+ export function computeOffscreenMarkers(
571
+ markers: SpanMarker[],
572
+ visibleStartMs: number,
573
+ visibleEndMs: number
574
+ ): OffscreenMarkers {
575
+ let leftCount = 0;
576
+ let rightCount = 0;
577
+ let nearestLeft = Number.NEGATIVE_INFINITY;
578
+ let nearestRight = Number.POSITIVE_INFINITY;
579
+ for (const { timeMs } of markers) {
580
+ if (timeMs < visibleStartMs) {
581
+ leftCount++;
582
+ if (timeMs > nearestLeft) nearestLeft = timeMs;
583
+ } else if (timeMs > visibleEndMs) {
584
+ rightCount++;
585
+ if (timeMs < nearestRight) nearestRight = timeMs;
586
+ }
587
+ }
588
+ return {
589
+ left: leftCount > 0 ? { count: leftCount, nearestMs: nearestLeft } : null,
590
+ right:
591
+ rightCount > 0 ? { count: rightCount, nearestMs: nearestRight } : null,
592
+ };
593
+ }
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
- import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
3
+ import type { Event, Hook, WorkflowRun } from '@workflow/world';
4
4
  import { AlertCircle } from 'lucide-react';
5
- import type { SpanSelectionInfo } from './sidebar/entity-detail-panel';
5
+ import type { FetchSpanDetail } from './sidebar/use-selected-span-detail';
6
6
  import { WorkflowTraceViewer } from './workflow-trace-view';
7
7
 
8
8
  interface RunTraceViewProps {
@@ -10,9 +10,7 @@ interface RunTraceViewProps {
10
10
  events: Event[];
11
11
  isLoading?: boolean;
12
12
  error?: Error | null;
13
- spanDetailData?: WorkflowRun | Step | Hook | Event | null;
14
- spanDetailLoading?: boolean;
15
- spanDetailError?: Error | null;
13
+ fetchSpanDetail: FetchSpanDetail;
16
14
  onWakeUpSleep?: (
17
15
  runId: string,
18
16
  correlationId: string
@@ -25,10 +23,10 @@ interface RunTraceViewProps {
25
23
  onCancelRun?: (runId: string) => Promise<void>;
26
24
  onStreamClick?: (streamId: string) => void;
27
25
  onRunClick?: (runId: string) => void;
28
- onSpanSelect?: (info: SpanSelectionInfo) => void;
29
26
  onLoadMoreSpans?: () => void | Promise<void>;
30
27
  hasMoreSpans?: boolean;
31
28
  isLoadingMoreSpans?: boolean;
29
+ showSeparateEventOccurrenceTimestamps?: boolean;
32
30
  }
33
31
 
34
32
  export function RunTraceView({
@@ -36,18 +34,16 @@ export function RunTraceView({
36
34
  events,
37
35
  isLoading,
38
36
  error,
39
- spanDetailData,
40
- spanDetailLoading,
41
- spanDetailError,
37
+ fetchSpanDetail,
42
38
  onWakeUpSleep,
43
39
  onResolveHook,
44
40
  onCancelRun,
45
41
  onStreamClick,
46
42
  onRunClick,
47
- onSpanSelect,
48
43
  onLoadMoreSpans,
49
44
  hasMoreSpans,
50
45
  isLoadingMoreSpans,
46
+ showSeparateEventOccurrenceTimestamps,
51
47
  }: RunTraceViewProps) {
52
48
  if (error && !run) {
53
49
  return (
@@ -66,18 +62,18 @@ export function RunTraceView({
66
62
  events={events}
67
63
  run={run}
68
64
  isLoading={isLoading}
69
- spanDetailData={spanDetailData}
70
- spanDetailLoading={spanDetailLoading}
71
- spanDetailError={spanDetailError}
65
+ fetchSpanDetail={fetchSpanDetail}
72
66
  onWakeUpSleep={onWakeUpSleep}
73
67
  onResolveHook={onResolveHook}
74
68
  onCancelRun={onCancelRun}
75
69
  onStreamClick={onStreamClick}
76
70
  onRunClick={onRunClick}
77
- onSpanSelect={onSpanSelect}
78
71
  onLoadMoreSpans={onLoadMoreSpans}
79
72
  hasMoreSpans={hasMoreSpans}
80
73
  isLoadingMoreSpans={isLoadingMoreSpans}
74
+ showSeparateEventOccurrenceTimestamps={
75
+ showSeparateEventOccurrenceTimestamps
76
+ }
81
77
  />
82
78
  </div>
83
79
  );