@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,5 +1,9 @@
1
- import type { Span, SpanEvent } from '../trace-viewer/types';
2
- import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
1
+ import type { Span, SpanEvent } from './types';
2
+ import {
3
+ formatDuration,
4
+ formatDurationPrecise,
5
+ getHighResInMs,
6
+ } from './util/timing';
3
7
 
4
8
  // ---------------------------------------------------------------------------
5
9
  // Root bounds
@@ -37,6 +41,64 @@ export function getSpanDurationMs(span: Span): number {
37
41
  );
38
42
  }
39
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
+
50
+ // ---------------------------------------------------------------------------
51
+ // Viewport
52
+ // ---------------------------------------------------------------------------
53
+
54
+ export interface ViewportRange {
55
+ start: number;
56
+ end: number;
57
+ }
58
+
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
+ }
79
+
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));
100
+ }
101
+
40
102
  // ---------------------------------------------------------------------------
41
103
  // Time markers
42
104
  // ---------------------------------------------------------------------------
@@ -56,6 +118,8 @@ const NICE_INTERVALS = [
56
118
 
57
119
  const MAX_MARKERS = 8;
58
120
 
121
+ const MS_IN_SECOND = 1000;
122
+
59
123
  function pickInterval(viewDuration: number, maxTicks: number): number {
60
124
  for (const interval of NICE_INTERVALS) {
61
125
  if (viewDuration / interval <= maxTicks) return interval;
@@ -72,6 +136,13 @@ export function computeTimeMarkers(
72
136
  const maxTicks = 6;
73
137
  const interval = pickInterval(viewDuration, maxTicks);
74
138
 
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));
145
+
75
146
  const firstTick = Math.ceil(offset / interval) * interval;
76
147
  const markers: TimeMarker[] = [];
77
148
 
@@ -80,7 +151,10 @@ export function computeTimeMarkers(
80
151
  if (position < -0.01 || position > 1.01) continue;
81
152
  markers.push({
82
153
  position: Math.min(Math.max(position, 0), 1),
83
- label: formatDuration(Math.abs(t), true),
154
+ label:
155
+ fractionDigits === 0
156
+ ? formatDuration(Math.abs(t), true)
157
+ : formatDurationPrecise(Math.abs(t), fractionDigits),
84
158
  value: t,
85
159
  });
86
160
  if (markers.length >= MAX_MARKERS) break;
@@ -100,6 +174,11 @@ export interface SpanGap {
100
174
  rowIndex: number;
101
175
  }
102
176
 
177
+ /** Project an absolute time onto the viewport as a clamped [0, 1] fraction. */
178
+ function toViewportFrac(ms: number, viewStart: number, range: number): number {
179
+ return Math.min(Math.max((ms - viewStart) / range, 0), 1);
180
+ }
181
+
103
182
  export function computeSpanGaps(
104
183
  spans: Span[],
105
184
  viewStart: number,
@@ -115,8 +194,8 @@ export function computeSpanGaps(
115
194
  const gapMs = startTime - endTime;
116
195
  if (gapMs <= 0) continue;
117
196
 
118
- const leftFrac = Math.min(Math.max((endTime - viewStart) / range, 0), 1);
119
- const rightFrac = Math.min(Math.max((startTime - viewStart) / range, 0), 1);
197
+ const leftFrac = toViewportFrac(endTime, viewStart, range);
198
+ const rightFrac = toViewportFrac(startTime, viewStart, range);
120
199
  if (rightFrac - leftFrac < 0.001) continue;
121
200
 
122
201
  gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
@@ -124,24 +203,129 @@ export function computeSpanGaps(
124
203
  return gaps;
125
204
  }
126
205
 
206
+ export interface SpanDelta {
207
+ /** True measured time between the two spans, unaffected by clamping. */
208
+ deltaMs: number;
209
+ /** Viewport-clamped fraction of the anchor span's measured edge. */
210
+ anchorFrac: number;
211
+ /** Viewport-clamped fraction of the hovered span's measured edge. */
212
+ hoveredFrac: number;
213
+ /**
214
+ * Which edge of the anchor span the measurement runs from: its end when the
215
+ * spans are disjoint and the anchor comes first, otherwise its start.
216
+ */
217
+ anchorEdge: 'start' | 'end';
218
+ /**
219
+ * Set when the hovered span lies entirely outside the viewport on one side,
220
+ * i.e. its row renders an off-screen arrow the line should stop short of.
221
+ */
222
+ hoveredOffscreen: 'left' | 'right' | null;
223
+ }
224
+
225
+ /**
226
+ * Measure the temporal delta between an anchor (selected) span and a hovered
227
+ * span for the Alt+hover measurement overlay. Ordering the two spans by start
228
+ * time (E = earlier-starting, L = later-starting), the measurement runs to
229
+ * L's start from E's end when the spans are disjoint ("how long after E ended
230
+ * did L start"), or from E's start when they overlap ("how long after E
231
+ * started did L start"). Fractions are clamped to the viewport like
232
+ * `computeSpanGaps`; `deltaMs` is always the true duration. Returns null when
233
+ * the measurement lies entirely outside the viewport.
234
+ */
235
+ export function computeSpanDelta(
236
+ anchor: Span,
237
+ hovered: Span,
238
+ viewStart: number,
239
+ viewEnd: number
240
+ ): SpanDelta | null {
241
+ const range = viewEnd - viewStart;
242
+ if (range <= 0) return null;
243
+
244
+ const anchorStart = getHighResInMs(anchor.startTime);
245
+ const hoveredStart = getHighResInMs(hovered.startTime);
246
+ const anchorIsEarlier = anchorStart <= hoveredStart;
247
+ const earlierStart = anchorIsEarlier ? anchorStart : hoveredStart;
248
+ const earlierEnd = getHighResInMs(
249
+ anchorIsEarlier ? anchor.endTime : hovered.endTime
250
+ );
251
+ const laterStart = anchorIsEarlier ? hoveredStart : anchorStart;
252
+
253
+ const originMs = earlierEnd <= laterStart ? earlierEnd : earlierStart;
254
+ const deltaMs = laterStart - originMs;
255
+
256
+ // Entirely outside the viewport. Compared in time-space (not clamped
257
+ // fractions) so a zero-delta point sitting exactly on a viewport edge —
258
+ // e.g. the root span selected at default zoom — still renders.
259
+ if (laterStart < viewStart || originMs > viewEnd) {
260
+ return null;
261
+ }
262
+
263
+ const originFrac = toViewportFrac(originMs, viewStart, range);
264
+ const laterFrac = toViewportFrac(laterStart, viewStart, range);
265
+
266
+ const hoveredEnd = getHighResInMs(hovered.endTime);
267
+
268
+ return {
269
+ deltaMs,
270
+ anchorFrac: anchorIsEarlier ? originFrac : laterFrac,
271
+ hoveredFrac: anchorIsEarlier ? laterFrac : originFrac,
272
+ anchorEdge: anchorIsEarlier && earlierEnd <= laterStart ? 'end' : 'start',
273
+ hoveredOffscreen:
274
+ hoveredStart > viewEnd ? 'right' : hoveredEnd < viewStart ? 'left' : null,
275
+ };
276
+ }
277
+
127
278
  // ---------------------------------------------------------------------------
128
279
  // Resource colors
129
280
  // ---------------------------------------------------------------------------
130
281
 
131
282
  export const RESOURCE_COLORS: Record<
132
283
  string,
133
- { bar: string; errorBar?: string }
284
+ {
285
+ bg: string;
286
+ border: string;
287
+ errorBg?: string;
288
+ errorBorder?: string;
289
+ }
134
290
  > = {
135
- run: { bar: 'var(--ds-blue-700)', errorBar: 'var(--ds-red-700)' },
136
- step: { bar: 'var(--ds-green-700)', errorBar: 'var(--ds-red-700)' },
137
- hook: { bar: 'var(--ds-amber-700)', errorBar: 'var(--ds-red-700)' },
138
- sleep: { bar: 'var(--ds-purple-700)', errorBar: 'var(--ds-red-700)' },
139
- default: { bar: 'var(--ds-gray-500)', errorBar: 'var(--ds-red-700)' },
291
+ run: {
292
+ bg: 'var(--ds-blue-200)',
293
+ border: 'var(--ds-blue-500)',
294
+ errorBg: 'var(--ds-red-200)',
295
+ errorBorder: 'var(--ds-red-500)',
296
+ },
297
+ step: {
298
+ bg: 'var(--ds-green-200)',
299
+ border: 'var(--ds-green-500)',
300
+ errorBg: 'var(--ds-red-200)',
301
+ errorBorder: 'var(--ds-red-500)',
302
+ },
303
+ // Passive spans (hooks) stay gray — matches event-list icons and the minimap.
304
+ hook: {
305
+ bg: 'var(--ds-gray-200)',
306
+ border: 'var(--ds-gray-500)',
307
+ errorBg: 'var(--ds-red-200)',
308
+ errorBorder: 'var(--ds-red-500)',
309
+ },
310
+ sleep: {
311
+ bg: 'var(--ds-purple-200)',
312
+ border: 'var(--ds-purple-500)',
313
+ errorBg: 'var(--ds-red-200)',
314
+ errorBorder: 'var(--ds-red-500)',
315
+ },
316
+ default: {
317
+ bg: 'var(--ds-gray-200)',
318
+ border: 'var(--ds-gray-500)',
319
+ errorBg: 'var(--ds-red-200)',
320
+ errorBorder: 'var(--ds-red-500)',
321
+ },
140
322
  };
141
323
 
142
324
  export function getResourceColor(resource: string): {
143
- bar: string;
144
- errorBar?: string;
325
+ bg: string;
326
+ border: string;
327
+ errorBg?: string;
328
+ errorBorder?: string;
145
329
  } {
146
330
  return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
147
331
  }
@@ -152,7 +336,9 @@ export function getResourceColor(resource: string): {
152
336
 
153
337
  export type SegmentStatus =
154
338
  | 'queued'
339
+ | 'pending'
155
340
  | 'running'
341
+ | 'completed'
156
342
  | 'failed'
157
343
  | 'retrying'
158
344
  | 'succeeded'
@@ -210,7 +396,7 @@ function computeStepSegmentsFromSpan(
210
396
  ]);
211
397
 
212
398
  if (marks.length === 0) {
213
- segments.push({ startFraction: 0, endFraction: 1, status: 'running' });
399
+ segments.push({ startFraction: 0, endFraction: 1, status: 'queued' });
214
400
  return segments;
215
401
  }
216
402
 
@@ -245,7 +431,7 @@ function computeStepSegmentsFromSpan(
245
431
  ? 'failed'
246
432
  : nextType === 'step_completed'
247
433
  ? 'succeeded'
248
- : 'running';
434
+ : 'retrying';
249
435
  segments.push({
250
436
  startFraction: markFrac,
251
437
  endFraction: nextFrac,
@@ -280,47 +466,20 @@ function computeHookSegmentsFromSpan(
280
466
  const segments: Segment[] = [];
281
467
  if (duration <= 0) return segments;
282
468
 
283
- const sorted = [...events]
284
- .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
285
- .sort((a, b) => a.time - b.time);
286
-
287
- const received = sorted.find((e) => e.name === 'hook_received');
288
- const disposed = sorted.find((e) => e.name === 'hook_disposed');
289
-
290
- if (!received && !disposed) {
291
- segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });
292
- return segments;
293
- }
294
-
295
- const receivedFrac = received
296
- ? timeToFraction(received.time, startMs, duration)
297
- : null;
469
+ const disposed = sortedEventMarks(events, ['hook_disposed'])[0];
298
470
  const disposedFrac = disposed
299
471
  ? timeToFraction(disposed.time, startMs, duration)
300
472
  : null;
301
473
 
302
- if (receivedFrac !== null && receivedFrac > 0.001) {
303
- segments.push({
304
- startFraction: 0,
305
- endFraction: receivedFrac,
306
- status: 'waiting',
307
- });
308
- } else if (receivedFrac === null && disposedFrac !== null) {
474
+ const waitingEnd = disposedFrac ?? 1;
475
+ if (waitingEnd > 0.001) {
309
476
  segments.push({
310
477
  startFraction: 0,
311
- endFraction: disposedFrac,
478
+ endFraction: waitingEnd,
312
479
  status: 'waiting',
313
480
  });
314
481
  }
315
482
 
316
- if (receivedFrac !== null) {
317
- segments.push({
318
- startFraction: receivedFrac,
319
- endFraction: disposedFrac ?? 1,
320
- status: 'received',
321
- });
322
- }
323
-
324
483
  if (disposedFrac !== null && disposedFrac < 0.999) {
325
484
  segments.push({
326
485
  startFraction: disposedFrac,
@@ -341,6 +500,13 @@ function computeSleepSegmentsFromSpan(
341
500
  return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];
342
501
  }
343
502
 
503
+ function runSegmentStatus(runStatus: string | undefined): SegmentStatus {
504
+ if (runStatus === 'failed') return 'failed';
505
+ if (runStatus === 'pending') return 'pending';
506
+ if (runStatus === 'running') return 'running';
507
+ return 'completed';
508
+ }
509
+
344
510
  function computeRunSegmentsFromSpan(
345
511
  startMs: number,
346
512
  duration: number,
@@ -355,11 +521,12 @@ function computeRunSegmentsFromSpan(
355
521
  .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
356
522
  .sort((a, b) => a.time - b.time);
357
523
 
524
+ const runData = attributes?.data as Record<string, unknown> | undefined;
525
+ const runStatus = runData?.status as string | undefined;
526
+
358
527
  const hasRunCreated = sorted.some((e) => e.name === 'run_created');
359
528
 
360
529
  if (!hasRunCreated) {
361
- const runData = attributes?.data as Record<string, unknown> | undefined;
362
- const runStatus = runData?.status as string | undefined;
363
530
  return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);
364
531
  }
365
532
 
@@ -381,7 +548,7 @@ function computeRunSegmentsFromSpan(
381
548
  segments.push({
382
549
  startFraction: cursor,
383
550
  endFraction: 1,
384
- status: failedEvent ? 'failed' : 'running',
551
+ status: failedEvent ? 'failed' : runSegmentStatus(runStatus),
385
552
  });
386
553
 
387
554
  return segments;
@@ -411,7 +578,7 @@ function computeV1RunSegments(
411
578
  segments.push({
412
579
  startFraction: cursor,
413
580
  endFraction: 1,
414
- status: runStatus === 'failed' ? 'failed' : 'running',
581
+ status: runSegmentStatus(runStatus),
415
582
  });
416
583
 
417
584
  return segments;
@@ -448,3 +615,57 @@ export function computeSpanSegments(span: Span): Segment[] {
448
615
  return [];
449
616
  }
450
617
  }
618
+
619
+ // ---------------------------------------------------------------------------
620
+ // Span markers — point-in-time events rendered as ticks on top of a bar
621
+ // ---------------------------------------------------------------------------
622
+
623
+ export interface SpanMarker {
624
+ timeMs: number;
625
+ }
626
+
627
+ // `hook_received` = a resumption; `attr_set` = attributes written mid-span.
628
+ const MARKER_EVENT_NAMES = ['hook_received', 'attr_set'];
629
+
630
+ export function computeSpanMarkers(span: Span): SpanMarker[] {
631
+ return sortedEventMarks(span.events, MARKER_EVENT_NAMES).map((mark) => ({
632
+ timeMs: mark.time,
633
+ }));
634
+ }
635
+
636
+ export interface OffscreenSide {
637
+ count: number;
638
+ /** Nearest off-screen marker — the one a reveal jumps to. */
639
+ nearestMs: number;
640
+ }
641
+
642
+ export interface OffscreenMarkers {
643
+ left: OffscreenSide | null;
644
+ right: OffscreenSide | null;
645
+ }
646
+
647
+ /** Partition markers outside `[visibleStartMs, visibleEndMs]` by side. */
648
+ export function computeOffscreenMarkers(
649
+ markers: SpanMarker[],
650
+ visibleStartMs: number,
651
+ visibleEndMs: number
652
+ ): OffscreenMarkers {
653
+ let leftCount = 0;
654
+ let rightCount = 0;
655
+ let nearestLeft = Number.NEGATIVE_INFINITY;
656
+ let nearestRight = Number.POSITIVE_INFINITY;
657
+ for (const { timeMs } of markers) {
658
+ if (timeMs < visibleStartMs) {
659
+ leftCount++;
660
+ if (timeMs > nearestLeft) nearestLeft = timeMs;
661
+ } else if (timeMs > visibleEndMs) {
662
+ rightCount++;
663
+ if (timeMs < nearestRight) nearestRight = timeMs;
664
+ }
665
+ }
666
+ return {
667
+ left: leftCount > 0 ? { count: leftCount, nearestMs: nearestLeft } : null,
668
+ right:
669
+ rightCount > 0 ? { count: rightCount, nearestMs: nearestRight } : null,
670
+ };
671
+ }
@@ -1,49 +1,55 @@
1
- import { useMemo } from 'react';
2
1
  import type { WorkflowRun } from '@workflow/core/runtime';
3
2
  import type { Event } from '@workflow/world';
3
+ import { useMemo } from 'react';
4
4
  import { buildTrace, type TraceWithMeta } from '../lib/trace-builder';
5
- import { NewTraceViewer as NewTraceViewerComponent } from './new-trace-viewer/trace-viewer';
6
5
  import {
7
- SidebarDataProvider,
8
6
  type SidebarDataContextValue,
7
+ SidebarDataProvider,
9
8
  } from './sidebar/sidebar-data-context';
10
- import type { Trace } from './trace-viewer/types';
9
+ import { TraceViewerSkeleton } from './trace-viewer/components/trace-viewer-skeleton';
10
+ import { TraceViewer as TraceViewerComponent } from './trace-viewer/trace-viewer';
11
11
 
12
- const NewTraceViewer = ({
12
+ const TraceViewer = ({
13
13
  run,
14
14
  events,
15
15
  sidebarData,
16
+ onLoadMore,
17
+ hasMore,
18
+ isLoadingMore,
19
+ loading = false,
16
20
  }: {
17
21
  run: WorkflowRun;
18
22
  events: Event[];
19
23
  sidebarData: SidebarDataContextValue;
24
+ onLoadMore?: () => void | Promise<void>;
25
+ hasMore?: boolean;
26
+ isLoadingMore?: boolean;
27
+ loading?: boolean;
20
28
  }) => {
21
- // Build trace only when actual data changes no timer-driven rebuilds.
22
- // Active span widths are animated imperatively by useLiveTick at 60fps.
23
- const traceWithMeta: TraceWithMeta | undefined = useMemo(() => {
29
+ const trace: TraceWithMeta | undefined = useMemo(() => {
24
30
  if (!run?.runId) {
25
31
  return undefined;
26
32
  }
27
33
  return buildTrace(run, events, new Date());
28
- // eslint-disable-next-line react-hooks/exhaustive-deps -- `new Date()` is intentionally not a dep; useLiveTick handles live growth
34
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- `new Date()` is intentionally not a dep
29
35
  }, [run, events]);
30
- const trace = traceWithMeta;
31
36
 
32
- if (!trace) {
33
- return (
34
- <div className="relative w-full h-full flex items-center justify-center">
35
- <div className="text-gray-500 text-sm">Loading trace…</div>
36
- </div>
37
- );
37
+ if (!trace || (loading && events.length === 0)) {
38
+ return <TraceViewerSkeleton />;
38
39
  }
39
40
 
40
41
  return (
41
42
  <SidebarDataProvider value={sidebarData}>
42
43
  <div className="relative w-full h-full flex">
43
- <NewTraceViewerComponent trace={trace as Trace} />
44
+ <TraceViewerComponent
45
+ trace={trace}
46
+ onLoadMore={onLoadMore}
47
+ hasMore={hasMore}
48
+ isLoadingMore={isLoadingMore}
49
+ />
44
50
  </div>
45
51
  </SidebarDataProvider>
46
52
  );
47
53
  };
48
54
 
49
- export { NewTraceViewer };
55
+ export { TraceViewer };
@@ -1,7 +1,7 @@
1
1
  import { cva, type VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
 
4
- import { cn } from '../../lib/utils';
4
+ import { cn } from '../../lib/cn';
5
5
 
6
6
  const alertVariants = cva(
7
7
  'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4',
@@ -50,7 +50,7 @@ const AlertDescription = React.forwardRef<
50
50
  >(({ className, ...props }, ref) => (
51
51
  <div
52
52
  ref={ref}
53
- className={cn('text-sm [&_p]:leading-relaxed', className)}
53
+ className={cn('text-copy-14 [&_p]:leading-relaxed', className)}
54
54
  {...props}
55
55
  />
56
56
  ));
@@ -0,0 +1,68 @@
1
+ import { cva, type VariantProps } from 'class-variance-authority';
2
+ import type * as React from 'react';
3
+ import { cn } from '../../lib/cn';
4
+
5
+ const buttonVariants = cva(
6
+ [
7
+ 'outline-none m-0 border-0 align-baseline no-underline group/trigger',
8
+ 'relative cursor-pointer select-none transform translate-z-0',
9
+ 'inline-flex max-w-full items-center justify-center gap-x-1 whitespace-nowrap rounded-md font-medium',
10
+ '!text-gray-100',
11
+ 'bg-gray-1000',
12
+ 'transition-[border-color,background,color,transform,box-shadow] duration-150 ease-in-out',
13
+ // Geist invert hover: literal fallbacks (no token dep, so it resolves in any
14
+ // consuming app), darkened via ancestor theme class without a registered variant.
15
+ 'hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))]',
16
+ '[.dark-theme_&]:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]',
17
+ '[[data-theme=dark]_&]:hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))]',
18
+ // Geist focus ring as arbitrary properties (no bare `outline`/ambiguous
19
+ // arbitrary-color utilities, which differ between Tailwind v3 and v4).
20
+ 'focus-visible:[outline:2px_solid_var(--ds-focus-color)] focus-visible:[outline-offset:2px]',
21
+ // disabled styles
22
+ 'disabled:cursor-not-allowed aria-disabled:cursor-not-allowed',
23
+ 'disabled:bg-gray-100 disabled:!text-gray-700 disabled:hover:bg-gray-100',
24
+ 'aria-disabled:bg-gray-100 aria-disabled:text-gray-700 aria-disabled:hover:bg-gray-100',
25
+ ],
26
+ {
27
+ variants: {
28
+ variant: {
29
+ default: '',
30
+ secondary:
31
+ 'border border-gray-alpha-400 [--themed-bg:_var(--ds-background-100)] [--themed-fg:_var(--ds-gray-1000)] [--themed-hover-bg:_var(--ds-gray-alpha-200)]',
32
+ ghost:
33
+ '[--themed-bg:_transparent] [--themed-fg:_var(--ds-gray-1000)] [--themed-hover-bg:_var(--ds-gray-alpha-100)]',
34
+ },
35
+ size: {
36
+ default: 'h-10 px-4 text-button-14',
37
+ sm: 'h-8 px-3 text-button-14',
38
+ xs: 'h-6 px-1.5 py-0.5 text-button-12 rounded-[4px]',
39
+ icon: 'h-8 w-8',
40
+ },
41
+ },
42
+ defaultVariants: {
43
+ variant: 'default',
44
+ size: 'default',
45
+ },
46
+ }
47
+ );
48
+
49
+ export type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
50
+ VariantProps<typeof buttonVariants>;
51
+
52
+ export function Button({
53
+ className,
54
+ variant,
55
+ size,
56
+ type = 'button',
57
+ ...props
58
+ }: ButtonProps) {
59
+ return (
60
+ <button
61
+ type={type}
62
+ className={cn(buttonVariants({ variant, size, className }))}
63
+ {...props}
64
+ />
65
+ );
66
+ }
67
+
68
+ export { buttonVariants };
@@ -2,7 +2,7 @@
2
2
 
3
3
  import * as React from 'react';
4
4
 
5
- import { cn } from '../../lib/utils';
5
+ import { cn } from '../../lib/cn';
6
6
 
7
7
  const Card = React.forwardRef<
8
8
  HTMLDivElement,
@@ -32,14 +32,7 @@ const CardTitle = React.forwardRef<
32
32
  HTMLDivElement,
33
33
  React.HTMLAttributes<HTMLDivElement>
34
34
  >(({ className, ...props }, ref) => (
35
- <div
36
- ref={ref}
37
- className={cn(
38
- 'text-2xl font-semibold leading-none tracking-tight',
39
- className
40
- )}
41
- {...props}
42
- />
35
+ <div ref={ref} className={cn('text-heading-24', className)} {...props} />
43
36
  ));
44
37
  CardTitle.displayName = 'CardTitle';
45
38
 
@@ -49,7 +42,7 @@ const CardDescription = React.forwardRef<
49
42
  >(({ className, ...props }, ref) => (
50
43
  <div
51
44
  ref={ref}
52
- className={cn('text-sm', className)}
45
+ className={cn('text-copy-14', className)}
53
46
  style={{ color: 'var(--ds-gray-900)' }}
54
47
  {...props}
55
48
  />