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

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
@@ -3,8 +3,12 @@
3
3
  */
4
4
 
5
5
  import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
6
- import type { Event, WorkflowRun } from '@workflow/world';
7
- import type { Span, SpanEvent } from '../trace-viewer/types';
6
+ import {
7
+ type Event,
8
+ isTerminalStepEventType,
9
+ type WorkflowRun,
10
+ } from '@workflow/world';
11
+ import type { Span, SpanEvent } from '../../lib/trace-types';
8
12
  import { shouldShowVerticalLine } from './event-colors';
9
13
  import { calculateDuration, dateToOtelTime } from './trace-time-utils';
10
14
 
@@ -26,15 +30,27 @@ const MARKER_EVENT_TYPES: Set<Event['eventType']> = new Set([
26
30
  'run_failed',
27
31
  'wait_created',
28
32
  'wait_completed',
33
+ 'attr_set',
29
34
  ]);
30
35
 
36
+ export const getEventTimestamp = (
37
+ event: Event | undefined
38
+ ): Date | undefined => {
39
+ const value = event?.occurredAt ?? event?.createdAt;
40
+ if (!value) return undefined;
41
+
42
+ const date = value instanceof Date ? value : new Date(value);
43
+ return Number.isNaN(date.getTime()) ? undefined : date;
44
+ };
45
+
31
46
  /**
32
47
  * Convert workflow events to span events
33
48
  * Only includes events that should be displayed as markers
34
49
  */
35
50
  export function convertEventsToSpanEvents(
36
51
  events: Event[],
37
- filterTypes = true
52
+ filterTypes = true,
53
+ options: { preferOccurredAt?: boolean } = {}
38
54
  ): SpanEvent[] {
39
55
  return events
40
56
  .filter((event) =>
@@ -42,7 +58,11 @@ export function convertEventsToSpanEvents(
42
58
  )
43
59
  .map((event) => ({
44
60
  name: event.eventType,
45
- timestamp: dateToOtelTime(event.createdAt),
61
+ timestamp: dateToOtelTime(
62
+ options.preferOccurredAt
63
+ ? (getEventTimestamp(event) ?? event.createdAt)
64
+ : event.createdAt
65
+ ),
46
66
  attributes: {
47
67
  eventId: event.eventId,
48
68
  correlationId: event.correlationId,
@@ -72,11 +92,11 @@ export const waitEventsToWaitEntity = (
72
92
  return {
73
93
  waitId: startEvent.correlationId,
74
94
  runId: startEvent.runId,
75
- createdAt: startEvent.createdAt,
95
+ createdAt: getEventTimestamp(startEvent) ?? startEvent.createdAt,
76
96
  resumeAt: startEvent.eventData?.resumeAt
77
97
  ? new Date(startEvent.eventData.resumeAt)
78
98
  : undefined,
79
- completedAt: completedEvent?.createdAt,
99
+ completedAt: getEventTimestamp(completedEvent),
80
100
  };
81
101
  };
82
102
 
@@ -168,16 +188,16 @@ export const stepEventsToStepEntity = (
168
188
  case 'step_started':
169
189
  status = 'running';
170
190
  attempt += 1;
171
- if (!startedAt) startedAt = e.createdAt;
191
+ if (!startedAt) startedAt = getEventTimestamp(e) ?? e.createdAt;
172
192
  completedAt = undefined;
173
193
  break;
174
194
  case 'step_completed':
175
195
  status = 'completed';
176
- completedAt = e.createdAt;
196
+ completedAt = getEventTimestamp(e) ?? e.createdAt;
177
197
  break;
178
198
  case 'step_failed':
179
199
  status = 'failed';
180
- completedAt = e.createdAt;
200
+ completedAt = getEventTimestamp(e) ?? e.createdAt;
181
201
  break;
182
202
  case 'step_retrying':
183
203
  status = 'pending';
@@ -190,14 +210,18 @@ export const stepEventsToStepEntity = (
190
210
  if (attempt === 0) attempt = 1;
191
211
 
192
212
  const lastEvent = events[events.length - 1];
213
+
193
214
  return {
194
215
  stepId: anchorEvent.correlationId ?? '',
195
216
  runId: anchorEvent.runId,
196
217
  stepName: createdEvent?.eventData?.stepName ?? '',
197
218
  status,
198
219
  attempt,
199
- createdAt: anchorEvent.createdAt,
200
- updatedAt: lastEvent?.createdAt ?? anchorEvent.createdAt,
220
+ createdAt: getEventTimestamp(anchorEvent) ?? anchorEvent.createdAt,
221
+ updatedAt:
222
+ getEventTimestamp(lastEvent) ??
223
+ lastEvent?.createdAt ??
224
+ anchorEvent.createdAt,
201
225
  startedAt,
202
226
  completedAt,
203
227
  specVersion: anchorEvent.specVersion,
@@ -220,25 +244,37 @@ export function stepToSpan(stepEvents: Event[], maxEndTime: Date): Span | null {
220
244
  };
221
245
 
222
246
  const resource = 'step';
223
- const endTime = new Date(step.completedAt ?? maxEndTime);
224
247
 
225
248
  // Include ALL correlated events on the span so the sidebar detail view
226
249
  // can display them. The timeline uses the `showVerticalLine` flag to
227
250
  // determine which events appear as markers.
228
- const events = convertEventsToSpanEvents(stepEvents, false);
251
+ const events = convertEventsToSpanEvents(stepEvents, false, {
252
+ preferOccurredAt: true,
253
+ });
229
254
 
230
- // Use createdAt as span start time, with activeStartTime for when execution began
231
- // This allows visualization of the "queued" period before execution
232
- const spanStartTime = new Date(step.createdAt);
255
+ // Use the event occurrence timestamp for step spans when it is available,
256
+ // falling back to the ingest timestamp used by older event streams.
257
+ const spanStartEvent =
258
+ stepEvents.find((event) => event.eventType === 'step_created') ??
259
+ stepEvents[0];
260
+ const spanStartTime =
261
+ getEventTimestamp(spanStartEvent) ?? new Date(step.createdAt);
233
262
  let activeStartTime = step.startedAt ? new Date(step.startedAt) : undefined;
234
263
  const firstStartEvent = stepEvents.find(
235
264
  (event) => event.eventType === 'step_started'
236
265
  );
237
266
  if (firstStartEvent) {
238
- // `step.startedAt` is the server-side creation timestamp, and `event.createdAt` is
239
- // the client-side creation timestamp. For now, to align the event marker with the
240
- // line we show for step.startedAt, we overwrite here to always use client-side time.
241
- activeStartTime = new Date(firstStartEvent.createdAt);
267
+ activeStartTime =
268
+ getEventTimestamp(firstStartEvent) ?? new Date(firstStartEvent.createdAt);
269
+ }
270
+
271
+ let endTime = new Date(maxEndTime);
272
+ if (step.completedAt) {
273
+ const completedEvent = stepEvents
274
+ .slice()
275
+ .reverse()
276
+ .find((event) => isTerminalStepEventType(event.eventType));
277
+ endTime = getEventTimestamp(completedEvent) ?? new Date(step.completedAt);
242
278
  }
243
279
 
244
280
  return {
@@ -291,10 +327,10 @@ export const hookEventsToHookEntity = (
291
327
  hookId: createdEvent.correlationId,
292
328
  runId: createdEvent.runId,
293
329
  token: createdEvent.eventData?.token,
294
- createdAt: createdEvent.createdAt,
330
+ createdAt: getEventTimestamp(createdEvent) ?? createdEvent.createdAt,
295
331
  receivedCount: receivedEvents.length,
296
- lastReceivedAt: lastReceivedEvent?.createdAt || undefined,
297
- disposedAt: disposedEvents.at(-1)?.createdAt || undefined,
332
+ lastReceivedAt: getEventTimestamp(lastReceivedEvent),
333
+ disposedAt: getEventTimestamp(disposedEvents.at(-1)),
298
334
  };
299
335
  };
300
336
 
@@ -314,7 +350,7 @@ export function hookToSpan(hookEvents: Event[], maxEndTime: Date): Span | null {
314
350
 
315
351
  return {
316
352
  spanId: String(hook.hookId),
317
- name: String(hook.hookId),
353
+ name: hook.token ?? String(hook.hookId),
318
354
  kind: 1, // INTERNAL span kind
319
355
  resource: 'hook',
320
356
  library: WORKFLOW_LIBRARY,
@@ -342,21 +378,50 @@ export function runToSpan(
342
378
  ): Span {
343
379
  const now = nowTime ?? new Date();
344
380
 
381
+ // Prefer the event occurrence timestamp when available so the root span
382
+ // lines up with child spans that already use event occurrence time.
383
+ const runCreatedEvent = runEvents.find(
384
+ (event) => event.eventType === 'run_created'
385
+ );
386
+ const runStartedEvent = runEvents.find(
387
+ (event) => event.eventType === 'run_started'
388
+ );
389
+ const terminalEvent = runEvents
390
+ .slice()
391
+ .reverse()
392
+ .find(
393
+ (event) =>
394
+ event.eventType === 'run_completed' ||
395
+ event.eventType === 'run_failed' ||
396
+ event.eventType === 'run_cancelled'
397
+ );
398
+ const spanStartTime =
399
+ getEventTimestamp(runCreatedEvent) ?? new Date(run.createdAt);
400
+ const activeStartTime =
401
+ getEventTimestamp(runStartedEvent) ??
402
+ (run.startedAt ? new Date(run.startedAt) : undefined);
403
+ const completedAt =
404
+ getEventTimestamp(terminalEvent) ?? run.completedAt ?? undefined;
405
+ const endTime = completedAt ?? now;
406
+
345
407
  // Only embed identification fields — not the full object with
346
- // input/output/error which may contain non-cloneable types.
408
+ // input/output/error which may contain non-cloneable types. Lifecycle
409
+ // timestamps are event-derived so detail rows align with the span timeline.
347
410
  const { input: _i, output: _o, error: _e, ...runIdentity } = run;
348
411
  const attributes = {
349
412
  resource: 'run' as const,
350
- data: runIdentity,
413
+ data: {
414
+ ...runIdentity,
415
+ createdAt: spanStartTime,
416
+ startedAt: activeStartTime,
417
+ completedAt,
418
+ },
351
419
  };
352
420
 
353
- // Use createdAt as span start time, with activeStartTime for when execution began
354
- const spanStartTime = new Date(run.createdAt);
355
- const activeStartTime = run.startedAt ? new Date(run.startedAt) : undefined;
356
- const endTime = run.completedAt ?? now;
357
-
358
421
  // Convert run-level events to span events
359
- const events = convertEventsToSpanEvents(runEvents, false);
422
+ const events = convertEventsToSpanEvents(runEvents, false, {
423
+ preferOccurredAt: true,
424
+ });
360
425
 
361
426
  return {
362
427
  spanId: String(run.runId),
@@ -0,0 +1,57 @@
1
+ 'use client';
2
+
3
+ import type { RefObject } from 'react';
4
+ import { useEffect, useState } from 'react';
5
+
6
+ interface UseIntersectionObserverArgs
7
+ extends Omit<IntersectionObserverInit, 'root'> {
8
+ /**
9
+ * Scroll container the target is observed within. Defaults to the viewport.
10
+ * Passed as a ref so it resolves after commit (when the node exists).
11
+ */
12
+ rootRef?: RefObject<Element | null>;
13
+ freezeOnceVisible?: boolean;
14
+ }
15
+
16
+ /**
17
+ * Returns the latest IntersectionObserverEntry for `elementRef`.
18
+ * Ported from vercel/front's `@vercel/hooks` `useIntersectionObserver`, with
19
+ * `root` threaded as a ref so we can observe inside a custom scroll container.
20
+ */
21
+ export function useIntersectionObserver(
22
+ elementRef: RefObject<Element | null>,
23
+ {
24
+ threshold = 0,
25
+ rootRef,
26
+ rootMargin = '0%',
27
+ freezeOnceVisible = false,
28
+ }: UseIntersectionObserverArgs = {}
29
+ ): IntersectionObserverEntry | undefined {
30
+ const [entry, setEntry] = useState<IntersectionObserverEntry>();
31
+
32
+ const frozen = entry?.isIntersecting && freezeOnceVisible;
33
+
34
+ useEffect(() => {
35
+ const node = elementRef?.current;
36
+
37
+ const hasIOSupport = !!window.IntersectionObserver;
38
+
39
+ if (!hasIOSupport || frozen || !node) return;
40
+
41
+ const updateEntry = ([entry]: IntersectionObserverEntry[]): void => {
42
+ setEntry(entry);
43
+ };
44
+
45
+ const observer = new IntersectionObserver(updateEntry, {
46
+ threshold,
47
+ root: rootRef?.current ?? null,
48
+ rootMargin,
49
+ });
50
+
51
+ observer.observe(node);
52
+
53
+ return () => observer.disconnect();
54
+ }, [elementRef, threshold, rootRef, rootMargin, frozen]);
55
+
56
+ return entry;
57
+ }
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+
3
+ import type { RefObject } from 'react';
4
+ import { useEffect, useRef } from 'react';
5
+ import { useIntersectionObserver } from './use-intersection-observer';
6
+
7
+ interface UseLoadMoreOnScrollOptions {
8
+ hasMore: boolean;
9
+ isLoadingMore: boolean;
10
+ /** Scroll container the sentinel lives in. Defaults to the viewport. */
11
+ rootRef?: RefObject<Element | null>;
12
+ rootMargin?: string;
13
+ }
14
+
15
+ /**
16
+ * Triggers `loadMore` when a sentinel element scrolls into view.
17
+ * Returns a ref to attach to an invisible sentinel `<div>` placed after the
18
+ * list content. Ported from vercel/front's `@vercel/hooks`
19
+ * `useLoadMoreOnScroll`.
20
+ *
21
+ * Because it keys off `isIntersecting`/`isLoadingMore`, it self-continues:
22
+ * if the sentinel is still in view once a page finishes loading, the next
23
+ * page is requested automatically.
24
+ */
25
+ export function useLoadMoreOnScroll(
26
+ loadMore: () => void,
27
+ {
28
+ hasMore,
29
+ isLoadingMore,
30
+ rootRef,
31
+ rootMargin = '400px',
32
+ }: UseLoadMoreOnScrollOptions
33
+ ) {
34
+ const sentinelRef = useRef<HTMLDivElement>(null);
35
+ const entry = useIntersectionObserver(sentinelRef, { rootRef, rootMargin });
36
+
37
+ const loadMoreRef = useRef(loadMore);
38
+ useEffect(() => {
39
+ loadMoreRef.current = loadMore;
40
+ }, [loadMore]);
41
+
42
+ useEffect(() => {
43
+ if (entry?.isIntersecting && hasMore && !isLoadingMore) {
44
+ loadMoreRef.current();
45
+ }
46
+ }, [entry?.isIntersecting, hasMore, isLoadingMore]);
47
+
48
+ return sentinelRef;
49
+ }
@@ -0,0 +1,34 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useState } from 'react';
4
+
5
+ const QUERY = '(prefers-reduced-motion: reduce)';
6
+
7
+ /**
8
+ * Hook that detects whether the user has requested reduced motion and reacts
9
+ * to changes. Mirrors the `prefers-reduced-motion: reduce` media query so
10
+ * components can skip or shorten animations for users with motion
11
+ * sensitivities (e.g. vestibular disorders).
12
+ *
13
+ * @returns `true` if the user prefers reduced motion, `false` otherwise
14
+ */
15
+ export const useReducedMotion = (): boolean => {
16
+ const [reduced, setReduced] = useState(() => {
17
+ if (typeof window === 'undefined' || !window.matchMedia) return false;
18
+ return window.matchMedia(QUERY).matches;
19
+ });
20
+
21
+ useEffect(() => {
22
+ if (typeof window === 'undefined' || !window.matchMedia) return;
23
+
24
+ const media = window.matchMedia(QUERY);
25
+ const onChange = (): void => setReduced(media.matches);
26
+
27
+ media.addEventListener('change', onChange);
28
+ onChange();
29
+
30
+ return () => media.removeEventListener('change', onChange);
31
+ }, []);
32
+
33
+ return reduced;
34
+ };
package/src/index.ts CHANGED
@@ -1,7 +1,4 @@
1
- export type {
2
- HealthCheckEndpoint,
3
- HealthCheckResult,
4
- } from '@workflow/core/runtime';
1
+ export type { HealthCheckResult } from '@workflow/core/runtime';
5
2
  export {
6
3
  parseStepName,
7
4
  parseWorkflowName,
@@ -33,6 +30,13 @@ export {
33
30
  materializeSteps,
34
31
  materializeWaits,
35
32
  } from './lib/event-materialization';
33
+ export {
34
+ type ExactIdSearchResult,
35
+ type ExactWorkflowSearchId,
36
+ type ExactWorkflowSearchIdKind,
37
+ looksLikeWorkflowIdSearchInput,
38
+ parseExactWorkflowSearchId,
39
+ } from './lib/exact-event-search-id';
36
40
  export type { Revivers, StreamRef } from './lib/hydration';
37
41
  export {
38
42
  CLASS_INSTANCE_REF_TYPE,
@@ -42,6 +46,7 @@ export {
42
46
  getWebRevivers,
43
47
  hasEncryptedFields,
44
48
  hydrateResourceIO,
49
+ hydrateResourceIOAsync,
45
50
  hydrateResourceIOWithKey,
46
51
  isClassInstanceRef,
47
52
  isEncryptedMarker,
@@ -57,6 +62,7 @@ export type { StreamStep } from './lib/utils';
57
62
  export {
58
63
  extractConversation,
59
64
  formatDuration,
65
+ formatDurationPrecise,
60
66
  identifyStreamSteps,
61
67
  isDoStreamStep,
62
68
  } from './lib/utils';
package/src/lib/cn.ts ADDED
@@ -0,0 +1,93 @@
1
+ import { type ClassValue, clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+
4
+ const twMergeConfig = {
5
+ extend: {
6
+ classGroups: {
7
+ 'text-heading': [
8
+ {
9
+ 'text-heading': [
10
+ '72',
11
+ '64',
12
+ '56',
13
+ '48',
14
+ '40',
15
+ '32',
16
+ '24',
17
+ '20',
18
+ '16',
19
+ '14',
20
+ ],
21
+ },
22
+ ],
23
+ 'text-button': [
24
+ {
25
+ 'text-button': ['16', '14', '12'],
26
+ },
27
+ ],
28
+ 'text-label': [
29
+ {
30
+ 'text-label': [
31
+ '20',
32
+ '18',
33
+ '16',
34
+ '14',
35
+ '14-mono',
36
+ '13',
37
+ '13-mono',
38
+ '12',
39
+ '12-mono',
40
+ ],
41
+ },
42
+ ],
43
+ 'text-copy': [
44
+ {
45
+ 'text-copy': ['24', '20', '18', '16', '14', '13', '13-mono'],
46
+ },
47
+ ],
48
+ material: [
49
+ {
50
+ material: [
51
+ 'base',
52
+ 'small',
53
+ 'medium',
54
+ 'large',
55
+ 'tooltip',
56
+ 'menu',
57
+ 'modal',
58
+ 'fullscreen',
59
+ ],
60
+ },
61
+ ],
62
+ },
63
+ // Make each category conflict with itself, so e.g. text-heading-32 overrides text-heading-24
64
+ conflictingClassGroups: {
65
+ 'text-heading': ['text-heading'],
66
+ 'text-button': ['text-button'],
67
+ 'text-label': ['text-label'],
68
+ 'text-copy': ['text-copy'],
69
+ material: ['material'],
70
+ },
71
+ },
72
+ } as const;
73
+
74
+ type CustomClassGroupIds =
75
+ | 'text-heading'
76
+ | 'text-button'
77
+ | 'text-label'
78
+ | 'text-copy'
79
+ | 'material';
80
+
81
+ const customTwMerge = extendTailwindMerge<CustomClassGroupIds>(twMergeConfig);
82
+
83
+ /**
84
+ * Merges Tailwind class names and resolves any conflicts using `clsx` with `tailwind-merge`.
85
+ *
86
+ * @param inputs - An array of class names to merge.
87
+ * @returns A string of merged and optimized class names.
88
+ */
89
+ function cn(...classes: ClassValue[]) {
90
+ return customTwMerge(clsx(...classes));
91
+ }
92
+
93
+ export { cn };
@@ -3,7 +3,11 @@
3
3
  * Used by run-actions and trace viewer components.
4
4
  */
5
5
 
6
- import type { Event, WorkflowRunStatus } from '@workflow/world';
6
+ import {
7
+ type Event,
8
+ isTerminalWorkflowRunStatus,
9
+ type WorkflowRunStatus,
10
+ } from '@workflow/world';
7
11
 
8
12
  // Time thresholds for Re-enqueue button visibility
9
13
  const STEP_ACTIVITY_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
@@ -140,9 +144,7 @@ export function analyzeEvents(events: Event[] | undefined): EventAnalysis {
140
144
  export function isTerminalStatus(
141
145
  status: WorkflowRunStatus | undefined
142
146
  ): boolean {
143
- return (
144
- status === 'completed' || status === 'failed' || status === 'cancelled'
145
- );
147
+ return status ? isTerminalWorkflowRunStatus(status) : false;
146
148
  }
147
149
 
148
150
  /**
@@ -10,7 +10,13 @@
10
10
  * of making separate API calls for each entity type.
11
11
  */
12
12
 
13
- import type { Event, StepStatus } from '@workflow/world';
13
+ import {
14
+ type Event,
15
+ isHookLifecycleEventType,
16
+ isStepEventType,
17
+ isWaitEventType,
18
+ type StepStatus,
19
+ } from '@workflow/world';
14
20
 
15
21
  // ---------------------------------------------------------------------------
16
22
  // Materialized entity types
@@ -60,18 +66,18 @@ export interface MaterializedEntities {
60
66
  }
61
67
 
62
68
  // ---------------------------------------------------------------------------
63
- // Helper: group events by correlationId prefix
69
+ // Helper: group events by correlationId
64
70
  // ---------------------------------------------------------------------------
65
71
 
66
72
  function groupByCorrelationId(
67
73
  events: Event[],
68
- prefixes: string[]
74
+ matchesEventType: (eventType: string) => boolean
69
75
  ): Map<string, Event[]> {
70
76
  const groups = new Map<string, Event[]>();
71
77
  for (const event of events) {
72
78
  const cid = event.correlationId;
73
79
  if (!cid) continue;
74
- if (!prefixes.some((p) => cid.startsWith(p))) continue;
80
+ if (!matchesEventType(event.eventType)) continue;
75
81
  const existing = groups.get(cid);
76
82
  if (existing) {
77
83
  existing.push(event);
@@ -82,6 +88,14 @@ function groupByCorrelationId(
82
88
  return groups;
83
89
  }
84
90
 
91
+ function getEventTimestamp(event: Event | undefined): Date | undefined {
92
+ const value = event?.occurredAt ?? event?.createdAt;
93
+ if (!value) return undefined;
94
+
95
+ const date = value instanceof Date ? value : new Date(value);
96
+ return Number.isNaN(date.getTime()) ? undefined : date;
97
+ }
98
+
85
99
  // ---------------------------------------------------------------------------
86
100
  // materializeSteps
87
101
  // ---------------------------------------------------------------------------
@@ -93,7 +107,7 @@ function groupByCorrelationId(
93
107
  * step_created event with no completion yet.
94
108
  */
95
109
  export function materializeSteps(events: Event[]): MaterializedStep[] {
96
- const groups = groupByCorrelationId(events, ['step_']);
110
+ const groups = groupByCorrelationId(events, isStepEventType);
97
111
  const steps: MaterializedStep[] = [];
98
112
 
99
113
  for (const [correlationId, stepEvents] of groups) {
@@ -104,31 +118,31 @@ export function materializeSteps(events: Event[]): MaterializedStep[] {
104
118
  let attempt = 0;
105
119
  let startedAt: Date | undefined;
106
120
  let completedAt: Date | undefined;
107
- let updatedAt = created.createdAt;
121
+ let updatedAt = getEventTimestamp(created) ?? created.createdAt;
108
122
 
109
123
  for (const e of stepEvents) {
110
124
  switch (e.eventType) {
111
125
  case 'step_started':
112
126
  status = 'running';
113
127
  attempt += 1;
114
- if (!startedAt) startedAt = e.createdAt;
128
+ if (!startedAt) startedAt = getEventTimestamp(e) ?? e.createdAt;
115
129
  completedAt = undefined;
116
- updatedAt = e.createdAt;
130
+ updatedAt = getEventTimestamp(e) ?? e.createdAt;
117
131
  break;
118
132
  case 'step_completed':
119
133
  status = 'completed';
120
- completedAt = e.createdAt;
121
- updatedAt = e.createdAt;
134
+ completedAt = getEventTimestamp(e) ?? e.createdAt;
135
+ updatedAt = getEventTimestamp(e) ?? e.createdAt;
122
136
  break;
123
137
  case 'step_failed':
124
138
  status = 'failed';
125
- completedAt = e.createdAt;
126
- updatedAt = e.createdAt;
139
+ completedAt = getEventTimestamp(e) ?? e.createdAt;
140
+ updatedAt = getEventTimestamp(e) ?? e.createdAt;
127
141
  break;
128
142
  case 'step_retrying':
129
143
  status = 'pending';
130
144
  completedAt = undefined;
131
- updatedAt = e.createdAt;
145
+ updatedAt = getEventTimestamp(e) ?? e.createdAt;
132
146
  break;
133
147
  }
134
148
  }
@@ -142,7 +156,7 @@ export function materializeSteps(events: Event[]): MaterializedStep[] {
142
156
  : correlationId,
143
157
  status,
144
158
  attempt,
145
- createdAt: created.createdAt,
159
+ createdAt: getEventTimestamp(created) ?? created.createdAt,
146
160
  startedAt,
147
161
  completedAt,
148
162
  updatedAt,
@@ -161,7 +175,7 @@ export function materializeSteps(events: Event[]): MaterializedStep[] {
161
175
  * Group hook_* events by correlationId and build Hook-like entities.
162
176
  */
163
177
  export function materializeHooks(events: Event[]): MaterializedHook[] {
164
- const groups = groupByCorrelationId(events, ['hook_']);
178
+ const groups = groupByCorrelationId(events, isHookLifecycleEventType);
165
179
  const hooks: MaterializedHook[] = [];
166
180
 
167
181
  for (const [correlationId, hookEvents] of groups) {
@@ -181,10 +195,10 @@ export function materializeHooks(events: Event[]): MaterializedHook[] {
181
195
  created.eventType === 'hook_created'
182
196
  ? created.eventData?.token
183
197
  : undefined,
184
- createdAt: created.createdAt,
198
+ createdAt: getEventTimestamp(created) ?? created.createdAt,
185
199
  receivedCount: receivedEvents.length,
186
- lastReceivedAt: lastReceived?.createdAt,
187
- disposedAt: disposed?.createdAt,
200
+ lastReceivedAt: getEventTimestamp(lastReceived),
201
+ disposedAt: getEventTimestamp(disposed),
188
202
  events: hookEvents,
189
203
  });
190
204
  }
@@ -200,7 +214,7 @@ export function materializeHooks(events: Event[]): MaterializedHook[] {
200
214
  * Group wait_* events by correlationId and build Wait-like entities.
201
215
  */
202
216
  export function materializeWaits(events: Event[]): MaterializedWait[] {
203
- const groups = groupByCorrelationId(events, ['wait_']);
217
+ const groups = groupByCorrelationId(events, isWaitEventType);
204
218
  const waits: MaterializedWait[] = [];
205
219
 
206
220
  for (const [correlationId, waitEvents] of groups) {
@@ -213,12 +227,12 @@ export function materializeWaits(events: Event[]): MaterializedWait[] {
213
227
  waitId: correlationId,
214
228
  runId: created.runId,
215
229
  status: completed ? 'completed' : 'waiting',
216
- createdAt: created.createdAt,
230
+ createdAt: getEventTimestamp(created) ?? created.createdAt,
217
231
  resumeAt:
218
232
  created.eventType === 'wait_created'
219
233
  ? created.eventData?.resumeAt
220
234
  : undefined,
221
- completedAt: completed?.createdAt,
235
+ completedAt: getEventTimestamp(completed),
222
236
  events: waitEvents,
223
237
  });
224
238
  }