@workflow/web-shared 4.1.0-beta.47 → 4.1.0-beta.49

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 (301) hide show
  1. package/README.md +26 -52
  2. package/dist/components/error-boundary.d.ts.map +1 -0
  3. package/dist/{error-boundary.js → components/error-boundary.js} +1 -1
  4. package/dist/components/error-boundary.js.map +1 -0
  5. package/dist/{event-list-view.d.ts → components/event-list-view.d.ts} +2 -3
  6. package/dist/components/event-list-view.d.ts.map +1 -0
  7. package/dist/{event-list-view.js → components/event-list-view.js} +9 -17
  8. package/dist/components/event-list-view.js.map +1 -0
  9. package/dist/{hook-actions.d.ts → components/hook-actions.d.ts} +2 -3
  10. package/dist/components/hook-actions.d.ts.map +1 -0
  11. package/dist/{hook-actions.js → components/hook-actions.js} +3 -4
  12. package/dist/components/hook-actions.js.map +1 -0
  13. package/dist/components/index.d.ts +10 -0
  14. package/dist/components/index.d.ts.map +1 -0
  15. package/dist/components/index.js +8 -0
  16. package/dist/components/index.js.map +1 -0
  17. package/dist/components/run-trace-view.d.ts +22 -0
  18. package/dist/components/run-trace-view.d.ts.map +1 -0
  19. package/dist/components/run-trace-view.js +11 -0
  20. package/dist/components/run-trace-view.js.map +1 -0
  21. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -0
  22. package/dist/{sidebar → components/sidebar}/attribute-panel.js +3 -3
  23. package/dist/components/sidebar/attribute-panel.js.map +1 -0
  24. package/dist/components/sidebar/conversation-view.d.ts.map +1 -0
  25. package/dist/components/sidebar/conversation-view.js.map +1 -0
  26. package/dist/components/sidebar/detail-card.d.ts.map +1 -0
  27. package/dist/components/sidebar/detail-card.js.map +1 -0
  28. package/dist/components/sidebar/entity-detail-panel.d.ts +32 -0
  29. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -0
  30. package/dist/{sidebar → components/sidebar}/entity-detail-panel.js +61 -49
  31. package/dist/components/sidebar/entity-detail-panel.js.map +1 -0
  32. package/dist/components/sidebar/events-list.d.ts +8 -0
  33. package/dist/components/sidebar/events-list.d.ts.map +1 -0
  34. package/dist/components/sidebar/events-list.js +16 -0
  35. package/dist/components/sidebar/events-list.js.map +1 -0
  36. package/dist/components/sidebar/resolve-hook-modal.d.ts.map +1 -0
  37. package/dist/components/sidebar/resolve-hook-modal.js.map +1 -0
  38. package/dist/components/stream-viewer.d.ts +18 -0
  39. package/dist/components/stream-viewer.d.ts.map +1 -0
  40. package/dist/{stream-viewer.js → components/stream-viewer.js} +1 -59
  41. package/dist/components/stream-viewer.js.map +1 -0
  42. package/dist/components/trace-viewer/components/map.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/map.js.map +1 -0
  44. package/dist/components/trace-viewer/components/markers.d.ts.map +1 -0
  45. package/dist/components/trace-viewer/components/markers.js.map +1 -0
  46. package/dist/components/trace-viewer/components/node.d.ts.map +1 -0
  47. package/dist/components/trace-viewer/components/node.js.map +1 -0
  48. package/dist/components/trace-viewer/components/search-input.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/search-input.js.map +1 -0
  50. package/dist/components/trace-viewer/components/search.d.ts.map +1 -0
  51. package/dist/components/trace-viewer/components/search.js.map +1 -0
  52. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +1 -0
  53. package/dist/components/trace-viewer/components/span-detail-panel.js.map +1 -0
  54. package/dist/components/trace-viewer/components/ui.d.ts.map +1 -0
  55. package/dist/components/trace-viewer/components/ui.js.map +1 -0
  56. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +1 -0
  57. package/dist/components/trace-viewer/components/zoom-button.js.map +1 -0
  58. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +1 -0
  59. package/dist/components/trace-viewer/components/zoom-icons.js.map +1 -0
  60. package/dist/components/trace-viewer/context.d.ts.map +1 -0
  61. package/dist/components/trace-viewer/context.js.map +1 -0
  62. package/dist/components/trace-viewer/index.d.ts.map +1 -0
  63. package/dist/components/trace-viewer/index.js.map +1 -0
  64. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -0
  65. package/dist/components/trace-viewer/trace-viewer.js.map +1 -0
  66. package/dist/components/trace-viewer/types.d.ts.map +1 -0
  67. package/dist/components/trace-viewer/types.js.map +1 -0
  68. package/dist/components/trace-viewer/util/constants.d.ts.map +1 -0
  69. package/dist/components/trace-viewer/util/constants.js.map +1 -0
  70. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +1 -0
  71. package/dist/components/trace-viewer/util/scrollbar-width.js.map +1 -0
  72. package/dist/{trace-viewer → components/trace-viewer}/util/timing.d.ts +1 -1
  73. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -0
  74. package/dist/{trace-viewer → components/trace-viewer}/util/timing.js +1 -1
  75. package/dist/components/trace-viewer/util/timing.js.map +1 -0
  76. package/dist/components/trace-viewer/util/tree.d.ts.map +1 -0
  77. package/dist/components/trace-viewer/util/tree.js.map +1 -0
  78. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +1 -0
  79. package/dist/components/trace-viewer/util/use-immediate-style.js.map +1 -0
  80. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +1 -0
  81. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +1 -0
  82. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +1 -0
  83. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +1 -0
  84. package/dist/components/trace-viewer/worker.d.ts.map +1 -0
  85. package/dist/components/trace-viewer/worker.js.map +1 -0
  86. package/dist/components/workflow-trace-view.d.ts +24 -0
  87. package/dist/components/workflow-trace-view.d.ts.map +1 -0
  88. package/dist/components/workflow-trace-view.js +152 -0
  89. package/dist/components/workflow-trace-view.js.map +1 -0
  90. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -0
  91. package/dist/components/workflow-traces/event-colors.js.map +1 -0
  92. package/dist/components/workflow-traces/trace-colors.d.ts.map +1 -0
  93. package/dist/components/workflow-traces/trace-colors.js.map +1 -0
  94. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -0
  95. package/dist/components/workflow-traces/trace-span-construction.js.map +1 -0
  96. package/dist/components/workflow-traces/trace-time-utils.d.ts.map +1 -0
  97. package/dist/components/workflow-traces/trace-time-utils.js.map +1 -0
  98. package/dist/index.d.ts +3 -13
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +2 -9
  101. package/dist/index.js.map +1 -1
  102. package/package.json +15 -11
  103. package/src/components/error-boundary.tsx +79 -0
  104. package/src/components/event-list-view.tsx +429 -0
  105. package/src/components/hook-actions.tsx +167 -0
  106. package/src/components/index.d.ts +1 -0
  107. package/src/components/index.ts +23 -0
  108. package/src/components/run-trace-view.tsx +75 -0
  109. package/src/components/sidebar/attribute-panel.tsx +938 -0
  110. package/src/components/sidebar/conversation-view.tsx +235 -0
  111. package/src/components/sidebar/detail-card.tsx +43 -0
  112. package/src/components/sidebar/entity-detail-panel.tsx +338 -0
  113. package/src/components/sidebar/events-list.tsx +119 -0
  114. package/src/components/sidebar/resolve-hook-modal.tsx +219 -0
  115. package/src/components/stream-viewer.tsx +143 -0
  116. package/src/components/trace-viewer/components/map.tsx +226 -0
  117. package/src/components/trace-viewer/components/markers.tsx +564 -0
  118. package/src/components/trace-viewer/components/node.tsx +259 -0
  119. package/src/components/trace-viewer/components/search-input.tsx +52 -0
  120. package/src/components/trace-viewer/components/search.tsx +47 -0
  121. package/src/components/trace-viewer/components/span-detail-panel.tsx +650 -0
  122. package/src/components/trace-viewer/components/ui.tsx +156 -0
  123. package/src/components/trace-viewer/components/zoom-button.tsx +61 -0
  124. package/src/components/trace-viewer/components/zoom-icons.tsx +65 -0
  125. package/src/components/trace-viewer/context.tsx +633 -0
  126. package/src/components/trace-viewer/index.tsx +4 -0
  127. package/src/components/trace-viewer/modules.d.ts +16 -0
  128. package/src/components/trace-viewer/trace-viewer.module.css +1292 -0
  129. package/src/components/trace-viewer/trace-viewer.tsx +448 -0
  130. package/src/components/trace-viewer/types.ts +234 -0
  131. package/src/components/trace-viewer/util/constants.ts +8 -0
  132. package/src/components/trace-viewer/util/scrollbar-width.ts +13 -0
  133. package/src/components/trace-viewer/util/timing.ts +33 -0
  134. package/src/components/trace-viewer/util/tree.ts +277 -0
  135. package/src/components/trace-viewer/util/use-immediate-style.ts +38 -0
  136. package/src/components/trace-viewer/util/use-streaming-spans.ts +415 -0
  137. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +51 -0
  138. package/src/components/trace-viewer/worker.ts +128 -0
  139. package/src/components/ui/alert.tsx +59 -0
  140. package/src/components/ui/card.tsx +88 -0
  141. package/src/components/ui/error-card.tsx +65 -0
  142. package/src/components/ui/skeleton.tsx +15 -0
  143. package/src/components/workflow-trace-view.tsx +306 -0
  144. package/src/components/workflow-traces/event-colors.ts +94 -0
  145. package/src/components/workflow-traces/trace-colors.ts +112 -0
  146. package/src/components/workflow-traces/trace-span-construction.ts +299 -0
  147. package/src/components/workflow-traces/trace-time-utils.ts +50 -0
  148. package/src/hooks/use-dark-mode.ts +34 -0
  149. package/src/index.d.ts +1 -0
  150. package/src/index.ts +29 -0
  151. package/src/lib/event-analysis.ts +231 -0
  152. package/src/lib/utils.ts +166 -0
  153. package/dist/api/workflow-api-client.d.ts +0 -543
  154. package/dist/api/workflow-api-client.d.ts.map +0 -1
  155. package/dist/api/workflow-api-client.js +0 -953
  156. package/dist/api/workflow-api-client.js.map +0 -1
  157. package/dist/api/workflow-server-actions.d.ts +0 -230
  158. package/dist/api/workflow-server-actions.d.ts.map +0 -1
  159. package/dist/api/workflow-server-actions.js +0 -861
  160. package/dist/api/workflow-server-actions.js.map +0 -1
  161. package/dist/error-boundary.d.ts.map +0 -1
  162. package/dist/error-boundary.js.map +0 -1
  163. package/dist/event-list-view.d.ts.map +0 -1
  164. package/dist/event-list-view.js.map +0 -1
  165. package/dist/hook-actions.d.ts.map +0 -1
  166. package/dist/hook-actions.js.map +0 -1
  167. package/dist/run-trace-view.d.ts +0 -8
  168. package/dist/run-trace-view.d.ts.map +0 -1
  169. package/dist/run-trace-view.js +0 -15
  170. package/dist/run-trace-view.js.map +0 -1
  171. package/dist/sidebar/attribute-panel.d.ts.map +0 -1
  172. package/dist/sidebar/attribute-panel.js.map +0 -1
  173. package/dist/sidebar/conversation-view.d.ts.map +0 -1
  174. package/dist/sidebar/conversation-view.js.map +0 -1
  175. package/dist/sidebar/detail-card.d.ts.map +0 -1
  176. package/dist/sidebar/detail-card.js.map +0 -1
  177. package/dist/sidebar/entity-detail-panel.d.ts +0 -12
  178. package/dist/sidebar/entity-detail-panel.d.ts.map +0 -1
  179. package/dist/sidebar/entity-detail-panel.js.map +0 -1
  180. package/dist/sidebar/events-list.d.ts +0 -9
  181. package/dist/sidebar/events-list.d.ts.map +0 -1
  182. package/dist/sidebar/events-list.js +0 -36
  183. package/dist/sidebar/events-list.js.map +0 -1
  184. package/dist/sidebar/resolve-hook-modal.d.ts.map +0 -1
  185. package/dist/sidebar/resolve-hook-modal.js.map +0 -1
  186. package/dist/stream-viewer.d.ts +0 -13
  187. package/dist/stream-viewer.d.ts.map +0 -1
  188. package/dist/stream-viewer.js.map +0 -1
  189. package/dist/trace-viewer/components/map.d.ts.map +0 -1
  190. package/dist/trace-viewer/components/map.js.map +0 -1
  191. package/dist/trace-viewer/components/markers.d.ts.map +0 -1
  192. package/dist/trace-viewer/components/markers.js.map +0 -1
  193. package/dist/trace-viewer/components/node.d.ts.map +0 -1
  194. package/dist/trace-viewer/components/node.js.map +0 -1
  195. package/dist/trace-viewer/components/search-input.d.ts.map +0 -1
  196. package/dist/trace-viewer/components/search-input.js.map +0 -1
  197. package/dist/trace-viewer/components/search.d.ts.map +0 -1
  198. package/dist/trace-viewer/components/search.js.map +0 -1
  199. package/dist/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  200. package/dist/trace-viewer/components/span-detail-panel.js.map +0 -1
  201. package/dist/trace-viewer/components/ui.d.ts.map +0 -1
  202. package/dist/trace-viewer/components/ui.js.map +0 -1
  203. package/dist/trace-viewer/components/zoom-button.d.ts.map +0 -1
  204. package/dist/trace-viewer/components/zoom-button.js.map +0 -1
  205. package/dist/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  206. package/dist/trace-viewer/components/zoom-icons.js.map +0 -1
  207. package/dist/trace-viewer/context.d.ts.map +0 -1
  208. package/dist/trace-viewer/context.js.map +0 -1
  209. package/dist/trace-viewer/index.d.ts.map +0 -1
  210. package/dist/trace-viewer/index.js.map +0 -1
  211. package/dist/trace-viewer/trace-viewer.d.ts.map +0 -1
  212. package/dist/trace-viewer/trace-viewer.js.map +0 -1
  213. package/dist/trace-viewer/types.d.ts.map +0 -1
  214. package/dist/trace-viewer/types.js.map +0 -1
  215. package/dist/trace-viewer/util/constants.d.ts.map +0 -1
  216. package/dist/trace-viewer/util/constants.js.map +0 -1
  217. package/dist/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  218. package/dist/trace-viewer/util/scrollbar-width.js.map +0 -1
  219. package/dist/trace-viewer/util/timing.d.ts.map +0 -1
  220. package/dist/trace-viewer/util/timing.js.map +0 -1
  221. package/dist/trace-viewer/util/tree.d.ts.map +0 -1
  222. package/dist/trace-viewer/util/tree.js.map +0 -1
  223. package/dist/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  224. package/dist/trace-viewer/util/use-immediate-style.js.map +0 -1
  225. package/dist/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  226. package/dist/trace-viewer/util/use-streaming-spans.js.map +0 -1
  227. package/dist/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  228. package/dist/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  229. package/dist/trace-viewer/worker.d.ts.map +0 -1
  230. package/dist/trace-viewer/worker.js.map +0 -1
  231. package/dist/workflow-trace-view.d.ts +0 -14
  232. package/dist/workflow-trace-view.d.ts.map +0 -1
  233. package/dist/workflow-trace-view.js +0 -135
  234. package/dist/workflow-trace-view.js.map +0 -1
  235. package/dist/workflow-traces/event-colors.d.ts.map +0 -1
  236. package/dist/workflow-traces/event-colors.js.map +0 -1
  237. package/dist/workflow-traces/trace-colors.d.ts.map +0 -1
  238. package/dist/workflow-traces/trace-colors.js.map +0 -1
  239. package/dist/workflow-traces/trace-span-construction.d.ts.map +0 -1
  240. package/dist/workflow-traces/trace-span-construction.js.map +0 -1
  241. package/dist/workflow-traces/trace-time-utils.d.ts.map +0 -1
  242. package/dist/workflow-traces/trace-time-utils.js.map +0 -1
  243. package/server/README.md +0 -1
  244. package/server/package.json +0 -4
  245. /package/dist/{error-boundary.d.ts → components/error-boundary.d.ts} +0 -0
  246. /package/dist/{sidebar → components/sidebar}/attribute-panel.d.ts +0 -0
  247. /package/dist/{sidebar → components/sidebar}/conversation-view.d.ts +0 -0
  248. /package/dist/{sidebar → components/sidebar}/conversation-view.js +0 -0
  249. /package/dist/{sidebar → components/sidebar}/detail-card.d.ts +0 -0
  250. /package/dist/{sidebar → components/sidebar}/detail-card.js +0 -0
  251. /package/dist/{sidebar → components/sidebar}/resolve-hook-modal.d.ts +0 -0
  252. /package/dist/{sidebar → components/sidebar}/resolve-hook-modal.js +0 -0
  253. /package/dist/{trace-viewer → components/trace-viewer}/components/map.d.ts +0 -0
  254. /package/dist/{trace-viewer → components/trace-viewer}/components/map.js +0 -0
  255. /package/dist/{trace-viewer → components/trace-viewer}/components/markers.d.ts +0 -0
  256. /package/dist/{trace-viewer → components/trace-viewer}/components/markers.js +0 -0
  257. /package/dist/{trace-viewer → components/trace-viewer}/components/node.d.ts +0 -0
  258. /package/dist/{trace-viewer → components/trace-viewer}/components/node.js +0 -0
  259. /package/dist/{trace-viewer → components/trace-viewer}/components/search-input.d.ts +0 -0
  260. /package/dist/{trace-viewer → components/trace-viewer}/components/search-input.js +0 -0
  261. /package/dist/{trace-viewer → components/trace-viewer}/components/search.d.ts +0 -0
  262. /package/dist/{trace-viewer → components/trace-viewer}/components/search.js +0 -0
  263. /package/dist/{trace-viewer → components/trace-viewer}/components/span-detail-panel.d.ts +0 -0
  264. /package/dist/{trace-viewer → components/trace-viewer}/components/span-detail-panel.js +0 -0
  265. /package/dist/{trace-viewer → components/trace-viewer}/components/ui.d.ts +0 -0
  266. /package/dist/{trace-viewer → components/trace-viewer}/components/ui.js +0 -0
  267. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-button.d.ts +0 -0
  268. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-button.js +0 -0
  269. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-icons.d.ts +0 -0
  270. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-icons.js +0 -0
  271. /package/dist/{trace-viewer → components/trace-viewer}/context.d.ts +0 -0
  272. /package/dist/{trace-viewer → components/trace-viewer}/context.js +0 -0
  273. /package/dist/{trace-viewer → components/trace-viewer}/index.d.ts +0 -0
  274. /package/dist/{trace-viewer → components/trace-viewer}/index.js +0 -0
  275. /package/dist/{trace-viewer → components/trace-viewer}/trace-viewer.d.ts +0 -0
  276. /package/dist/{trace-viewer → components/trace-viewer}/trace-viewer.js +0 -0
  277. /package/dist/{trace-viewer → components/trace-viewer}/trace-viewer.module.css +0 -0
  278. /package/dist/{trace-viewer → components/trace-viewer}/types.d.ts +0 -0
  279. /package/dist/{trace-viewer → components/trace-viewer}/types.js +0 -0
  280. /package/dist/{trace-viewer → components/trace-viewer}/util/constants.d.ts +0 -0
  281. /package/dist/{trace-viewer → components/trace-viewer}/util/constants.js +0 -0
  282. /package/dist/{trace-viewer → components/trace-viewer}/util/scrollbar-width.d.ts +0 -0
  283. /package/dist/{trace-viewer → components/trace-viewer}/util/scrollbar-width.js +0 -0
  284. /package/dist/{trace-viewer → components/trace-viewer}/util/tree.d.ts +0 -0
  285. /package/dist/{trace-viewer → components/trace-viewer}/util/tree.js +0 -0
  286. /package/dist/{trace-viewer → components/trace-viewer}/util/use-immediate-style.d.ts +0 -0
  287. /package/dist/{trace-viewer → components/trace-viewer}/util/use-immediate-style.js +0 -0
  288. /package/dist/{trace-viewer → components/trace-viewer}/util/use-streaming-spans.d.ts +0 -0
  289. /package/dist/{trace-viewer → components/trace-viewer}/util/use-streaming-spans.js +0 -0
  290. /package/dist/{trace-viewer → components/trace-viewer}/util/use-trackpad-zoom.d.ts +0 -0
  291. /package/dist/{trace-viewer → components/trace-viewer}/util/use-trackpad-zoom.js +0 -0
  292. /package/dist/{trace-viewer → components/trace-viewer}/worker.d.ts +0 -0
  293. /package/dist/{trace-viewer → components/trace-viewer}/worker.js +0 -0
  294. /package/dist/{workflow-traces → components/workflow-traces}/event-colors.d.ts +0 -0
  295. /package/dist/{workflow-traces → components/workflow-traces}/event-colors.js +0 -0
  296. /package/dist/{workflow-traces → components/workflow-traces}/trace-colors.d.ts +0 -0
  297. /package/dist/{workflow-traces → components/workflow-traces}/trace-colors.js +0 -0
  298. /package/dist/{workflow-traces → components/workflow-traces}/trace-span-construction.d.ts +0 -0
  299. /package/dist/{workflow-traces → components/workflow-traces}/trace-span-construction.js +0 -0
  300. /package/dist/{workflow-traces → components/workflow-traces}/trace-time-utils.d.ts +0 -0
  301. /package/dist/{workflow-traces → components/workflow-traces}/trace-time-utils.js +0 -0
@@ -0,0 +1,33 @@
1
+ import { formatDuration } from '../../../lib/utils';
2
+
3
+ export { formatDuration };
4
+
5
+ export function getHighResInMs([seconds, nanoseconds]: [
6
+ number,
7
+ number,
8
+ ]): number {
9
+ return seconds * 1000 + nanoseconds / 1e6;
10
+ }
11
+
12
+ export function getMsInHighRes(ms: number): [number, number] {
13
+ return [Math.floor(ms / 1000), (ms % 1000) * 1000];
14
+ }
15
+
16
+ /**
17
+ * Formats a duration for timeline display (compact single-unit format).
18
+ * @deprecated Use formatDuration(ms, true) instead.
19
+ */
20
+ export const formatDurationForTimeline = (ms: number): string =>
21
+ formatDuration(ms, true);
22
+
23
+ const timeSelectionFormatter = new Intl.NumberFormat(undefined, {
24
+ minimumFractionDigits: 2,
25
+ maximumFractionDigits: 2,
26
+ });
27
+
28
+ export function formatTimeSelection(ms: number): string {
29
+ if (ms >= 1000) {
30
+ return `${timeSelectionFormatter.format(ms / 1000)}s`;
31
+ }
32
+ return `${timeSelectionFormatter.format(ms)}ms`;
33
+ }
@@ -0,0 +1,277 @@
1
+ import type {
2
+ RootNode,
3
+ Span,
4
+ SpanNode,
5
+ SpanNodeEvent,
6
+ Trace,
7
+ TraceNode,
8
+ VisibleSpan,
9
+ } from '../types';
10
+ import { getHighResInMs, getMsInHighRes } from './timing';
11
+
12
+ export const parseTrace = (
13
+ trace: Trace
14
+ ): { root: RootNode; map: Record<string, SpanNode> } => {
15
+ const { spans } = trace;
16
+ const root: RootNode = {
17
+ startTime: 0,
18
+ endTime: 0,
19
+ duration: 0,
20
+ depth: 0,
21
+ children: [],
22
+ };
23
+ const map: Record<string, SpanNode> = {};
24
+
25
+ const resourceIndices = new Map<string, number>();
26
+ const getResourceIndex = (resource: string): number => {
27
+ const existing = resourceIndices.get(resource);
28
+ if (existing) return existing;
29
+
30
+ const index = resourceIndices.size + 1;
31
+ resourceIndices.set(resource, index);
32
+ return index;
33
+ };
34
+
35
+ let hasUserSpans = false;
36
+ for (const span of spans) {
37
+ const startTime = getHighResInMs(span.startTime);
38
+ const endTime = getHighResInMs(span.endTime);
39
+ const duration = getHighResInMs(span.duration);
40
+ if (endTime > root.endTime) {
41
+ root.endTime = endTime;
42
+ root.duration = endTime - root.startTime;
43
+ }
44
+ if (root.startTime === 0 || startTime < root.startTime) {
45
+ root.startTime = startTime;
46
+ root.duration = root.endTime - startTime;
47
+ }
48
+ const isVercelResource = span.resource.startsWith('vercel.');
49
+ if (!isVercelResource) {
50
+ hasUserSpans = true;
51
+ }
52
+
53
+ const isVercel =
54
+ isVercelResource &&
55
+ (span.resource !== 'vercel.serverless-runtime' ||
56
+ !('http.method' in span.attributes));
57
+
58
+ const resourceIndex = isVercel ? 0 : getResourceIndex(span.resource);
59
+
60
+ let label: string | undefined;
61
+ if (isVercel) {
62
+ label = `▲ ${span.name}`;
63
+ }
64
+ map[span.spanId] = {
65
+ parent: null as unknown as SpanNode,
66
+ startTime,
67
+ endTime,
68
+ duration,
69
+ span,
70
+ depth: 0,
71
+ label,
72
+ events: parseEvents(span),
73
+ isVercel,
74
+ children: [],
75
+ resourceIndex,
76
+ // Pass through activeStartTime if present (for showing queued period)
77
+ activeStartTime: span.activeStartTime
78
+ ? getHighResInMs(span.activeStartTime)
79
+ : undefined,
80
+ };
81
+ }
82
+
83
+ const addTo = (node: SpanNode, parentId?: string): void => {
84
+ let parent: TraceNode | undefined;
85
+ if (parentId) {
86
+ parent = map[parentId];
87
+ if (!parent) {
88
+ if (process.env.NODE_ENV === 'development') {
89
+ console.warn('Could not find parent span with spanId: %s', parentId);
90
+ }
91
+ parent = root;
92
+ }
93
+ } else {
94
+ parent = root;
95
+ }
96
+ node.parent = parent;
97
+ parent.children.push(node);
98
+ };
99
+
100
+ const updateDepth = (node: TraceNode): void => {
101
+ if ('parent' in node) {
102
+ node.depth = node.parent.depth + 1;
103
+ }
104
+ for (const child of node.children) {
105
+ updateDepth(child);
106
+ }
107
+ };
108
+
109
+ let hintIdCounter = 1;
110
+ const addInstrumentationHint = (node: TraceNode, name: string): boolean => {
111
+ if ('parent' in node) {
112
+ if (node.span.name === name) {
113
+ let waitUntilStart = node.endTime;
114
+ // Detect the parent that's most likely to be at the bottom of the UI
115
+ const findParent = (span: SpanNode): SpanNode => {
116
+ if (!span.children.length) {
117
+ if (span.span.name === 'waitUntil') {
118
+ waitUntilStart = span.startTime;
119
+ return span.parent as SpanNode;
120
+ }
121
+ return span;
122
+ }
123
+
124
+ return (
125
+ span.children
126
+ .map(findParent)
127
+ .sort((a, b) => a.duration - b.duration)[0] || span
128
+ );
129
+ };
130
+ const parent = findParent(node);
131
+
132
+ const spanId = `instrumentation-hint-${hintIdCounter++}`;
133
+ const offset = node.duration * 0.05;
134
+ const startTime = node.startTime + offset;
135
+ const endTime = Math.max(
136
+ startTime + offset,
137
+ Math.min(waitUntilStart - node.duration * 0.01, node.endTime - offset)
138
+ );
139
+ const duration = endTime - startTime;
140
+ const hint: SpanNode = {
141
+ parent,
142
+ startTime,
143
+ endTime,
144
+ duration,
145
+ span: {
146
+ spanId,
147
+ name: 'Add your spans here',
148
+ resource: '',
149
+ kind: 0,
150
+ library: {
151
+ name: '',
152
+ },
153
+ status: {
154
+ code: 200,
155
+ },
156
+ traceFlags: 0,
157
+ attributes: {},
158
+ links: [],
159
+ events: [],
160
+ startTime: getMsInHighRes(startTime),
161
+ endTime: getMsInHighRes(endTime),
162
+ duration: getMsInHighRes(duration),
163
+ },
164
+ depth: node.depth + 1,
165
+ isVercel: false,
166
+ isInstrumentationHint: true,
167
+ children: [],
168
+ resourceIndex: 1,
169
+ };
170
+ parent.children.push(hint);
171
+ map[spanId] = hint;
172
+ return true;
173
+ }
174
+ }
175
+ for (const child of node.children) {
176
+ if (addInstrumentationHint(child, name)) return true;
177
+ }
178
+ return false;
179
+ };
180
+
181
+ // Create tree by matching nodes to their parents
182
+ for (const node of Object.values(map)) {
183
+ addTo(node, node.span.parentSpanId);
184
+ }
185
+
186
+ // Adjust depth of each node now that the tree is fully constructed
187
+ updateDepth(root);
188
+
189
+ // Add hints in the places where user spans would appear
190
+ if (!hasUserSpans) {
191
+ for (const name of [
192
+ 'Invoke Function',
193
+ 'Invoke Middleware',
194
+ 'Vercel Runtime',
195
+ ]) {
196
+ if (addInstrumentationHint(root, name)) break;
197
+ }
198
+ }
199
+
200
+ return { root, map };
201
+ };
202
+
203
+ const parseEvents = (span: Span): SpanNodeEvent[] | undefined => {
204
+ if (!span.events.length) return;
205
+
206
+ const keyPrefix = `${span.spanId}:ev`;
207
+
208
+ return span.events
209
+ .map<SpanNodeEvent>((event, index) => ({
210
+ key: `${keyPrefix}${index}`,
211
+ timestamp: getHighResInMs(event.timestamp),
212
+ event,
213
+ }))
214
+ .sort((a, b) => a.timestamp - b.timestamp);
215
+ };
216
+
217
+ /**
218
+ * Adds a node to a row and attempts to find the ideal placement
219
+ * within an existing row, creating a new one if necessary
220
+ */
221
+ export const addToRow = (
222
+ placed: VisibleSpan[][],
223
+ node: VisibleSpan,
224
+ precision: number
225
+ ): void => {
226
+ const parent = node.parent as VisibleSpan | undefined;
227
+ for (let y = (parent?.row || -1) + 1; ; ++y) {
228
+ let row = placed[y];
229
+ if (!row) {
230
+ row = [];
231
+ placed.push(row);
232
+ } else if (
233
+ !row.every(
234
+ ({ startTime, endTime }) =>
235
+ startTime + precision > node.endTime ||
236
+ endTime - precision < node.startTime
237
+ )
238
+ ) {
239
+ continue;
240
+ }
241
+ node.row = y;
242
+ row.push(node);
243
+ break;
244
+ }
245
+ };
246
+
247
+ export const spanVisiblityHelper = (
248
+ node: TraceNode,
249
+ scale: number,
250
+ visible: VisibleSpan[]
251
+ ): void => {
252
+ if ('parent' in node) {
253
+ const n = node as VisibleSpan;
254
+ n.row = -1;
255
+ // Always make spans visible regardless of width
256
+ n.isVisible = true;
257
+ n.isHovered = false;
258
+ if (!n.isVisible) return;
259
+
260
+ visible.push(n);
261
+ }
262
+
263
+ for (const child of node.children) {
264
+ spanVisiblityHelper(child, scale, visible);
265
+ }
266
+ };
267
+
268
+ export const adjustSpanVisibility = (
269
+ span: VisibleSpan,
270
+ _scale: number
271
+ ): boolean => {
272
+ // Always make spans visible regardless of width
273
+ span.isVisible = true;
274
+ span.isHovered = false;
275
+
276
+ return span.isVisible;
277
+ };
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+
3
+ import type { CSSProperties, MutableRefObject } from 'react';
4
+ import { useCallback, useRef } from 'react';
5
+
6
+ type SetStyle = (propertyName: string, value: string | undefined) => void;
7
+
8
+ interface ImmediateStyle {
9
+ setStyle: SetStyle;
10
+ styleRef: MutableRefObject<CSSProperties>;
11
+ style: CSSProperties;
12
+ }
13
+
14
+ /**
15
+ * Update an element's style without forcing renders, but in a way that is still
16
+ * safe if the element re-renders for another reason.
17
+ * @returns The current style & a method to update the style
18
+ */
19
+ export function useImmediateStyle(
20
+ ref: MutableRefObject<HTMLElement | null>
21
+ ): ImmediateStyle {
22
+ const styleRef = useRef<CSSProperties>({});
23
+ const setStyle = useCallback<SetStyle>(
24
+ (propertyName, value) => {
25
+ // @ts-expect-error typeof keyof CSSProperties is too big of a union
26
+ styleRef.current[propertyName] = value;
27
+ if (!ref.current) return;
28
+ if (!value) {
29
+ ref.current.style.removeProperty(propertyName);
30
+ return;
31
+ }
32
+ ref.current.style.setProperty(propertyName, value);
33
+ },
34
+ [ref]
35
+ );
36
+
37
+ return { setStyle, styleRef, style: { ...styleRef.current } };
38
+ }