@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,39 +1,43 @@
1
1
  'use client';
2
2
 
3
- import { EVENT_DATA_REF_FIELDS, type Event } from '@workflow/world';
4
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
- import { isExpiredMarker } from '../../lib/hydration';
6
- import { ErrorCard } from '../ui/error-card';
3
+ import { type Event, getEventDataRefFields } from '@workflow/world';
4
+ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
5
+ import { hasEncryptedFields, isExpiredMarker } from '../../lib/hydration';
7
6
  import {
8
- ErrorStackBlock,
9
- isStructuredErrorWithStack,
10
- } from '../ui/error-stack-block';
7
+ Collapsible,
8
+ CollapsibleContent,
9
+ CollapsibleRoot,
10
+ CollapsibleTrigger,
11
+ } from '../ui/collapsible';
12
+ import { RunClickContext, StreamClickContext } from '../ui/data-inspector';
13
+ import { ErrorCard } from '../ui/error-card';
14
+ import { ErrorStackBlock, isStructuredError } from '../ui/error-stack-block';
11
15
  import { Skeleton } from '../ui/skeleton';
12
- import { localMillisecondTime } from './attribute-panel';
13
- import { CopyableDataBlock } from './copyable-data-block';
14
- import { DetailCard } from './detail-card';
16
+ import { TimestampTooltip } from '../ui/timestamp-tooltip';
17
+ import { AttrSetEventBlock } from './attributes-block';
18
+ import { CopyableDataBlock, EncryptedDataBlock } from './copyable-data-block';
15
19
 
16
- /**
17
- * Event types whose eventData contains an error field with a StructuredError.
18
- */
19
- const ERROR_EVENT_TYPES = new Set(['step_failed', 'step_retrying']);
20
+ const parseDateValue = (value: unknown): Date | null => {
21
+ if (value == null) return null;
20
22
 
21
- /**
22
- * Event types that carry user-serialized data in their eventData field.
23
- */
24
- const DATA_EVENT_TYPES = new Set([
25
- 'step_created',
26
- 'step_completed',
27
- 'step_failed',
28
- 'step_retrying',
29
- 'hook_created',
30
- 'hook_received',
31
- 'run_created',
32
- 'run_completed',
33
- 'run_failed',
34
- 'wait_created',
35
- 'wait_completed',
36
- ]);
23
+ const date = value instanceof Date ? value : new Date(String(value));
24
+ return Number.isNaN(date.getTime()) ? null : date;
25
+ };
26
+
27
+ const getEffectiveEventDate = (
28
+ event: Pick<Event, 'createdAt' | 'occurredAt'>
29
+ ): Date => parseDateValue(event.occurredAt) ?? new Date(event.createdAt);
30
+
31
+ const formatEventTimestamp = (date: Date): string =>
32
+ date.toLocaleString(undefined, {
33
+ month: 'short',
34
+ day: 'numeric',
35
+ hour: 'numeric',
36
+ minute: 'numeric',
37
+ second: 'numeric',
38
+ fractionalSecondDigits: 3,
39
+ timeZoneName: 'short',
40
+ });
37
41
 
38
42
  /**
39
43
  * A single event row that can lazy-load its eventData when expanded.
@@ -42,14 +46,14 @@ function EventItem({
42
46
  event,
43
47
  onLoadEventData,
44
48
  encryptionKey,
49
+ showSeparateEventOccurrenceTimestamps = false,
45
50
  }: {
46
51
  event: Event;
47
- onLoadEventData?: (
48
- correlationId: string,
49
- eventId: string
50
- ) => Promise<unknown | null>;
52
+ onLoadEventData?: (event: Event) => Promise<unknown | null>;
51
53
  /** When this changes (e.g., Decrypt was clicked), invalidate cached data */
52
54
  encryptionKey?: Uint8Array;
55
+ /** Show occurredAt separately instead of folding it into the Created timestamp. */
56
+ showSeparateEventOccurrenceTimestamps?: boolean;
53
57
  }) {
54
58
  const [loadedData, setLoadedData] = useState<unknown | null>(null);
55
59
  const [isLoading, setIsLoading] = useState(false);
@@ -62,19 +66,20 @@ function EventItem({
62
66
  const existingData =
63
67
  'eventData' in event && event.eventData != null ? event.eventData : null;
64
68
  const mergedDisplay = loadedData ?? existingData;
65
- const canHaveData = DATA_EVENT_TYPES.has(event.eventType);
69
+ const canHaveData =
70
+ existingData !== null || getEventDataRefFields(event.eventType).length > 0;
66
71
 
67
72
  const loadEventData = useCallback(
68
- async (options?: { force?: boolean }) => {
69
- if (!onLoadEventData || !event.correlationId || !event.eventId) return;
70
- if (!options?.force && loadedDataRef.current !== null) {
73
+ async (force: boolean) => {
74
+ if (!onLoadEventData) return;
75
+ if (!force && loadedDataRef.current !== null) {
71
76
  return;
72
77
  }
73
78
 
74
79
  try {
75
80
  setIsLoading(true);
76
81
  setLoadError(null);
77
- const data = await onLoadEventData(event.correlationId, event.eventId);
82
+ const data = await onLoadEventData(event);
78
83
  loadedDataRef.current = data;
79
84
  setLoadedData(data);
80
85
  } catch (err) {
@@ -83,46 +88,44 @@ function EventItem({
83
88
  setIsLoading(false);
84
89
  }
85
90
  },
86
- [onLoadEventData, event.correlationId, event.eventId]
91
+ [onLoadEventData, event]
87
92
  );
88
93
 
89
- const handleExpand = useCallback(async () => {
94
+ const handleExpand = useCallback(() => {
90
95
  if (isLoading) return;
91
96
  wasExpandedRef.current = true;
92
- await loadEventData();
97
+ void loadEventData(false);
93
98
  }, [isLoading, loadEventData]);
94
99
 
95
100
  // When the encryption key changes and this event was previously expanded,
96
101
  // re-load the data so it gets decrypted
97
- useEffect(() => {
102
+ useLayoutEffect(() => {
98
103
  if (!encryptionKey || !wasExpandedRef.current) return;
99
104
  loadedDataRef.current = null;
100
105
  setLoadedData(null);
101
- void loadEventData({ force: true });
106
+ void loadEventData(true);
102
107
  }, [encryptionKey, loadEventData]);
103
108
 
104
109
  const createdAt = new Date(event.createdAt);
110
+ const occurredAt = parseDateValue(event.occurredAt);
111
+ const displayedCreatedAt = showSeparateEventOccurrenceTimestamps
112
+ ? createdAt
113
+ : getEffectiveEventDate(event);
114
+ const displayedCreatedAtTime = displayedCreatedAt.toLocaleTimeString(
115
+ undefined,
116
+ {
117
+ hour: 'numeric',
118
+ minute: 'numeric',
119
+ second: 'numeric',
120
+ }
121
+ );
105
122
 
106
123
  const displayPayload = isLoading ? loadedData : mergedDisplay;
107
124
 
108
125
  return (
109
- <DetailCard
110
- summaryClassName="text-base py-2"
111
- summary={
112
- <>
113
- <span
114
- className="font-medium"
115
- style={{ color: 'var(--ds-gray-1000)' }}
116
- >
117
- {event.eventType}
118
- </span>{' '}
119
- -{' '}
120
- <span style={{ color: 'var(--ds-gray-700)' }}>
121
- {localMillisecondTime(createdAt.getTime())}
122
- </span>
123
- </>
124
- }
125
- onToggle={
126
+ <CollapsibleRoot
127
+ variant="card"
128
+ onOpenChange={
126
129
  canHaveData
127
130
  ? (open) => {
128
131
  if (open) handleExpand();
@@ -130,90 +133,79 @@ function EventItem({
130
133
  : undefined
131
134
  }
132
135
  >
133
- {/* Event attributes */}
134
- <div
135
- className="flex flex-col divide-y rounded-md border overflow-hidden"
136
- style={{
137
- borderColor: 'var(--ds-gray-300)',
138
- backgroundColor: 'var(--ds-gray-100)',
139
- }}
140
- >
141
- <div
142
- className="flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5"
143
- style={{ borderColor: 'var(--ds-gray-300)' }}
144
- >
145
- <span
146
- className="text-[13px] font-medium"
147
- style={{ color: 'var(--ds-gray-700)' }}
148
- >
149
- Event ID
136
+ <CollapsibleTrigger className="px-3 py-2">
137
+ <div className="flex w-full items-center justify-between gap-3">
138
+ <span className="text-gray-1000 text-label-12 font-mono">
139
+ {event.eventType}
150
140
  </span>
151
- <span
152
- className="max-w-[70%] truncate text-right text-[13px] font-mono"
153
- style={{ color: 'var(--ds-gray-1000)' }}
154
- title={event.eventId}
155
- >
156
- {event.eventId}
141
+ <span className="shrink-0 text-label-13 text-gray-900">
142
+ {displayedCreatedAtTime}
157
143
  </span>
158
144
  </div>
159
- {event.correlationId && (
160
- <div
161
- className="flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5"
162
- style={{ borderColor: 'var(--ds-gray-300)' }}
163
- >
164
- <span
165
- className="text-[13px] font-medium"
166
- style={{ color: 'var(--ds-gray-700)' }}
167
- >
168
- Correlation ID
169
- </span>
170
- <span
171
- className="max-w-[70%] truncate text-right text-[13px] font-mono"
172
- style={{ color: 'var(--ds-gray-1000)' }}
173
- title={event.correlationId}
174
- >
175
- {event.correlationId}
145
+ </CollapsibleTrigger>
146
+ <CollapsibleContent>
147
+ {/* Event attributes */}
148
+ <div className="flex flex-col bg-background-200 [&:has(+_*)]:border-b [&:has(+_*)]:border-gray-alpha-400">
149
+ {showSeparateEventOccurrenceTimestamps && occurredAt && (
150
+ <div className="flex items-center justify-between gap-2 py-2 px-3">
151
+ <span className="text-label-12 text-gray-900">Occurred</span>
152
+ <TimestampTooltip date={occurredAt}>
153
+ <span className="max-w-[70%] truncate text-right text-label-12 font-mono">
154
+ {formatEventTimestamp(occurredAt)}
155
+ </span>
156
+ </TimestampTooltip>
157
+ </div>
158
+ )}
159
+ <div className="flex items-center justify-between gap-2 py-2 px-3">
160
+ <span className="text-label-12 text-gray-900">Event ID</span>
161
+ <span className="max-w-[70%] truncate text-right text-label-12 font-mono">
162
+ {event.eventId}
176
163
  </span>
177
164
  </div>
178
- )}
179
- </div>
180
-
181
- {/* Loading state */}
182
- {isLoading && (
183
- <div
184
- className="mt-2 rounded-md border p-3"
185
- style={{
186
- borderColor: 'var(--ds-gray-300)',
187
- }}
188
- >
189
- <Skeleton className="h-4 w-[35%]" />
190
- <Skeleton className="mt-2 h-4 w-[90%]" />
191
- <Skeleton className="mt-2 h-4 w-[75%]" />
165
+ {event.correlationId && (
166
+ <div className="flex items-center justify-between gap-2 py-2 px-3">
167
+ <span className="text-label-12 text-gray-900">
168
+ Correlation ID
169
+ </span>
170
+ <span className="max-w-[70%] truncate text-right text-label-12 font-mono">
171
+ {event.correlationId}
172
+ </span>
173
+ </div>
174
+ )}
192
175
  </div>
193
- )}
194
176
 
195
- {/* Error state */}
196
- {loadError && (
197
- <ErrorCard
198
- title="Failed to load event data"
199
- details={loadError}
200
- className="mt-2"
201
- />
202
- )}
177
+ {/* Loading state */}
178
+ {isLoading && (
179
+ <div className="p-3">
180
+ <Skeleton className="h-4 w-[35%]" />
181
+ <Skeleton className="mt-2 h-4 w-[90%]" />
182
+ <Skeleton className="mt-2 h-4 w-[75%]" />
183
+ </div>
184
+ )}
185
+
186
+ {/* Error state */}
187
+ {loadError && (
188
+ <ErrorCard
189
+ title="Failed to load event data"
190
+ details={loadError}
191
+ className="mt-2"
192
+ />
193
+ )}
203
194
 
204
- {/* Event data */}
205
- {displayPayload != null && (
206
- <div className="mt-2">
207
- <EventDataBlock eventType={event.eventType} data={displayPayload} />
208
- </div>
209
- )}
210
- </DetailCard>
195
+ {/* Event data */}
196
+ {displayPayload != null && (
197
+ <div className="[&>div]:border-none [&>div]:rounded-none">
198
+ <EventDataBlock eventType={event.eventType} data={displayPayload} />
199
+ </div>
200
+ )}
201
+ </CollapsibleContent>
202
+ </CollapsibleRoot>
211
203
  );
212
204
  }
213
205
 
214
206
  /**
215
207
  * Check if an eventData object has only expired marker values in ref/payload
216
- * fields for this event type (see {@link EVENT_DATA_REF_FIELDS}). Other keys
208
+ * fields for this event type (see {@link getEventDataRefFields}). Other keys
217
209
  * (e.g. `resumeAt`, `stepName`) are ignored.
218
210
  */
219
211
  function hasOnlyExpiredFields(data: unknown, eventType: string): boolean {
@@ -221,7 +213,7 @@ function hasOnlyExpiredFields(data: unknown, eventType: string): boolean {
221
213
  return false;
222
214
  }
223
215
  const record = data as Record<string, unknown>;
224
- const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
216
+ const refKeys = getEventDataRefFields(eventType);
225
217
  const presentKeys = refKeys.filter((k) => k in record);
226
218
  return (
227
219
  presentKeys.length > 0 &&
@@ -230,8 +222,8 @@ function hasOnlyExpiredFields(data: unknown, eventType: string): boolean {
230
222
  }
231
223
 
232
224
  /**
233
- * Renders event data, using ErrorStackBlock for error events that contain
234
- * a structured error with a stack trace, and CopyableDataBlock otherwise.
225
+ * Renders event data, using ErrorStackBlock for error events that contain a
226
+ * structured error, and CopyableDataBlock otherwise.
235
227
  */
236
228
  function EventDataBlock({
237
229
  eventType,
@@ -246,7 +238,7 @@ function EventDataBlock({
246
238
  if (isExpiredMarker(data) || hasOnlyExpiredFields(data, eventType)) {
247
239
  return (
248
240
  <div
249
- className="flex items-center gap-1.5 rounded-md border px-3 py-2 text-xs"
241
+ className="flex items-center gap-1.5 rounded-md border px-3 py-2 text-label-12"
250
242
  style={{
251
243
  borderColor: 'var(--ds-gray-300)',
252
244
  backgroundColor: 'var(--ds-gray-100)',
@@ -258,23 +250,32 @@ function EventDataBlock({
258
250
  );
259
251
  }
260
252
 
261
- // For error events (step_failed, step_retrying), the eventData has the shape
262
- // { error: StructuredError, stack?: string, ... }. Check both the top-level
263
- // value and the nested `error` field for a stack trace.
253
+ if (hasEncryptedFields({ eventType, eventData: data })) {
254
+ return <EncryptedDataBlock />;
255
+ }
256
+
257
+ // Attribute changes — render the changed keys and the writer instead of
258
+ // the raw JSON payload.
259
+ if (eventType === 'attr_set') {
260
+ return <AttrSetEventBlock data={data} />;
261
+ }
262
+
263
+ // Error events carry a StructuredError in eventData.error. Check both the
264
+ // nested field and the top-level value for legacy payloads.
264
265
  if (
265
- ERROR_EVENT_TYPES.has(eventType) &&
266
+ getEventDataRefFields(eventType).includes('error') &&
266
267
  data != null &&
267
268
  typeof data === 'object'
268
269
  ) {
269
270
  const record = data as Record<string, unknown>;
270
271
 
271
272
  // Check the nested `error` field first (the StructuredError)
272
- if (isStructuredErrorWithStack(record.error)) {
273
+ if (isStructuredError(record.error)) {
273
274
  return <ErrorStackBlock value={record.error} />;
274
275
  }
275
276
 
276
- // Some error formats put the stack at the top level of eventData
277
- if (isStructuredErrorWithStack(record)) {
277
+ // Some error formats put the message/stack at the top level of eventData.
278
+ if (isStructuredError(record)) {
278
279
  return <ErrorStackBlock value={record} />;
279
280
  }
280
281
  }
@@ -289,58 +290,75 @@ export function EventsList({
289
290
  isLoading = false,
290
291
  error,
291
292
  onLoadEventData,
293
+ onStreamClick,
294
+ onRunClick,
292
295
  encryptionKey,
296
+ showSeparateEventOccurrenceTimestamps = false,
293
297
  }: {
294
298
  events: Event[];
295
299
  isLoading?: boolean;
296
300
  error?: Error | null;
297
- onLoadEventData?: (
298
- correlationId: string,
299
- eventId: string
300
- ) => Promise<unknown | null>;
301
+ onLoadEventData?: (event: Event) => Promise<unknown | null>;
302
+ onStreamClick?: (streamId: string) => void;
303
+ onRunClick?: (runId: string) => void;
301
304
  /** When provided, signals that decryption is active (triggers re-load of expanded events) */
302
305
  encryptionKey?: Uint8Array;
306
+ /** Show occurredAt separately instead of folding it into the Created timestamp. */
307
+ showSeparateEventOccurrenceTimestamps?: boolean;
303
308
  }) {
304
- // Sort by createdAt
309
+ // Sort by the timestamp shown as Created by default.
305
310
  const sortedEvents = useMemo(
306
311
  () =>
307
312
  [...events].sort(
308
313
  (a, b) =>
309
- new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()
314
+ getEffectiveEventDate(a).getTime() -
315
+ getEffectiveEventDate(b).getTime()
310
316
  ),
311
317
  [events]
312
318
  );
313
319
 
320
+ const hasEvents = sortedEvents.length > 0 && !error;
321
+
322
+ if (!hasEvents && !isLoading) {
323
+ return <Collapsible label="Events" disabled />;
324
+ }
325
+
314
326
  return (
315
- <div className="mt-2" style={{ color: 'var(--ds-gray-1000)' }}>
316
- <h3
317
- className="text-label-14 font-medium mt-4 mb-2"
318
- style={{ color: 'var(--ds-gray-1000)' }}
319
- >
320
- Events
321
- </h3>
322
- {isLoading ? (
323
- <div className="flex flex-col gap-4">
324
- <Skeleton className="h-9 w-full rounded-md" />
325
- <Skeleton className="h-9 w-full rounded-md" />
326
- <Skeleton className="h-9 w-full rounded-md" />
327
- </div>
328
- ) : null}
329
- {!isLoading && !error && sortedEvents.length === 0 && (
330
- <div className="text-sm">No events found</div>
331
- )}
332
- {sortedEvents.length > 0 && !error ? (
333
- <div className="flex flex-col gap-4">
334
- {sortedEvents.map((event) => (
335
- <EventItem
336
- key={event.eventId}
337
- event={event}
338
- onLoadEventData={onLoadEventData}
339
- encryptionKey={encryptionKey}
340
- />
341
- ))}
342
- </div>
343
- ) : null}
344
- </div>
327
+ <RunClickContext.Provider value={onRunClick}>
328
+ <StreamClickContext.Provider value={onStreamClick}>
329
+ <CollapsibleRoot defaultOpen>
330
+ <CollapsibleTrigger>Events</CollapsibleTrigger>
331
+ <CollapsibleContent className="mb-0">
332
+ {isLoading ? (
333
+ <div className="flex flex-col -mx-4">
334
+ {[0, 1, 2].map((i) => (
335
+ <div
336
+ key={i}
337
+ className="flex items-center justify-between gap-3 bg-background-200 px-4 py-2"
338
+ >
339
+ <Skeleton className="h-4 w-32 rounded" />
340
+ <Skeleton className="h-3 w-16 rounded" />
341
+ </div>
342
+ ))}
343
+ </div>
344
+ ) : (
345
+ <div className="flex flex-col -mx-4">
346
+ {sortedEvents.map((event) => (
347
+ <EventItem
348
+ key={event.eventId}
349
+ event={event}
350
+ onLoadEventData={onLoadEventData}
351
+ encryptionKey={encryptionKey}
352
+ showSeparateEventOccurrenceTimestamps={
353
+ showSeparateEventOccurrenceTimestamps
354
+ }
355
+ />
356
+ ))}
357
+ </div>
358
+ )}
359
+ </CollapsibleContent>
360
+ </CollapsibleRoot>
361
+ </StreamClickContext.Provider>
362
+ </RunClickContext.Provider>
345
363
  );
346
364
  }
@@ -1,26 +1,20 @@
1
1
  'use client';
2
2
 
3
- import { createContext, useContext, type ReactNode } from 'react';
4
- import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
5
- import type { SpanSelectionInfo } from './entity-detail-panel';
3
+ import type { Event, Hook, WorkflowRun } from '@workflow/world';
4
+ import { createContext, type ReactNode, useContext } from 'react';
5
+ import type { FetchSpanDetail } from './use-selected-span-detail';
6
6
 
7
7
  export interface SidebarDataContextValue {
8
8
  run: WorkflowRun;
9
9
  events: Event[];
10
- spanDetailData: WorkflowRun | Step | Hook | Event | null;
11
- spanDetailError?: Error | null;
12
- spanDetailLoading?: boolean;
13
- onSpanSelect: (info: SpanSelectionInfo) => void;
10
+ fetchSpanDetail: FetchSpanDetail;
14
11
  onStreamClick?: (streamId: string) => void;
15
12
  onRunClick?: (runId: string) => void;
16
13
  onWakeUpSleep?: (
17
14
  runId: string,
18
15
  correlationId: string
19
16
  ) => Promise<{ stoppedCount: number }>;
20
- onLoadEventData?: (
21
- correlationId: string,
22
- eventId: string
23
- ) => Promise<unknown | null>;
17
+ onLoadEventData?: (event: Event) => Promise<unknown | null>;
24
18
  onResolveHook?: (
25
19
  hookToken: string,
26
20
  payload: unknown,
@@ -30,6 +24,12 @@ export interface SidebarDataContextValue {
30
24
  onDecrypt?: () => void;
31
25
  isDecrypting?: boolean;
32
26
  hasEncryptedData?: boolean;
27
+ /** Show occurredAt separately instead of folding it into the Created timestamp. */
28
+ showSeparateEventOccurrenceTimestamps?: boolean;
29
+ getModuleSourceUrl?: (info: {
30
+ moduleSpecifier: string;
31
+ deploymentId: string;
32
+ }) => string | undefined;
33
33
  }
34
34
 
35
35
  const SidebarDataContext = createContext<SidebarDataContextValue | null>(null);