@workflow/web-shared 5.0.0-beta.7 → 5.0.0-beta.8

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 (192) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts +12 -0
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +26 -13
  5. package/dist/components/hook-actions.js +1 -1
  6. package/dist/components/index.js +1 -1
  7. package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
  8. package/dist/components/new-trace-viewer/components/event-list.js +2 -2
  9. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +1 -1
  10. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +1 -1
  11. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +1 -1
  12. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +1 -1
  13. package/dist/components/new-trace-viewer/components/split-pane.js +1 -1
  14. package/dist/components/new-trace-viewer/components/timeline.js +1 -1
  15. package/dist/components/new-trace-viewer/context.js +1 -1
  16. package/dist/components/new-trace-viewer/detail-panel.js +2 -2
  17. package/dist/components/new-trace-viewer/icons.js +1 -1
  18. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  19. package/dist/components/new-trace-viewer/trace-viewer.js +45 -23
  20. package/dist/components/new-trace-viewer/types.js +1 -1
  21. package/dist/components/new-trace-viewer/util/constants.js +1 -1
  22. package/dist/components/new-trace-viewer/utils.js +1 -1
  23. package/dist/components/run-trace-view.js +1 -1
  24. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  25. package/dist/components/sidebar/attribute-panel.js +99 -73
  26. package/dist/components/sidebar/conversation-view.js +1 -1
  27. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  28. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  29. package/dist/components/sidebar/copyable-data-block.js +16 -15
  30. package/dist/components/sidebar/detail-card.d.ts +5 -6
  31. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  32. package/dist/components/sidebar/detail-card.js +32 -16
  33. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  34. package/dist/components/sidebar/entity-detail-panel.js +6 -3
  35. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  36. package/dist/components/sidebar/events-list.js +21 -15
  37. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  38. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  39. package/dist/components/stream-viewer.js +1 -1
  40. package/dist/components/trace-viewer/components/map.js +1 -1
  41. package/dist/components/trace-viewer/components/markers.js +1 -1
  42. package/dist/components/trace-viewer/components/node.js +1 -1
  43. package/dist/components/trace-viewer/components/search-input.js +1 -1
  44. package/dist/components/trace-viewer/components/search.js +1 -1
  45. package/dist/components/trace-viewer/components/span-content.js +1 -1
  46. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  47. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  48. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  49. package/dist/components/trace-viewer/components/ui.js +1 -1
  50. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  51. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  52. package/dist/components/trace-viewer/context.js +1 -1
  53. package/dist/components/trace-viewer/index.js +1 -1
  54. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  55. package/dist/components/trace-viewer/types.js +1 -1
  56. package/dist/components/trace-viewer/util/constants.js +1 -1
  57. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  58. package/dist/components/trace-viewer/util/timing.js +1 -1
  59. package/dist/components/trace-viewer/util/tree.js +1 -1
  60. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  61. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  62. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  63. package/dist/components/trace-viewer/worker.js +1 -1
  64. package/dist/components/trace-viewer-new.js +1 -1
  65. package/dist/components/ui/alert.js +1 -1
  66. package/dist/components/ui/button.d.ts +10 -0
  67. package/dist/components/ui/button.d.ts.map +1 -0
  68. package/dist/components/ui/button.js +39 -0
  69. package/dist/components/ui/card.js +1 -1
  70. package/dist/components/ui/data-inspector.d.ts +1 -0
  71. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  72. package/dist/components/ui/data-inspector.js +4 -9
  73. package/dist/components/ui/decrypt-button.js +1 -1
  74. package/dist/components/ui/error-card.js +1 -1
  75. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  76. package/dist/components/ui/error-stack-block.js +4 -18
  77. package/dist/components/ui/inspector-theme.js +1 -1
  78. package/dist/components/ui/load-more-button.js +1 -1
  79. package/dist/components/ui/menu-dropdown.js +1 -1
  80. package/dist/components/ui/skeleton.js +1 -1
  81. package/dist/components/ui/spinner.js +1 -1
  82. package/dist/components/ui/timestamp-tooltip.js +1 -1
  83. package/dist/components/workflow-trace-view.js +1 -1
  84. package/dist/components/workflow-traces/event-colors.js +1 -1
  85. package/dist/components/workflow-traces/trace-colors.js +1 -1
  86. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  87. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  88. package/dist/hooks/use-dark-mode.js +1 -1
  89. package/dist/hooks/use-reduced-motion.js +1 -1
  90. package/dist/index.js +1 -1
  91. package/dist/lib/event-analysis.js +1 -1
  92. package/dist/lib/event-materialization.js +1 -1
  93. package/dist/lib/hydration.js +1 -1
  94. package/dist/lib/stream-display.js +1 -1
  95. package/dist/lib/toast.js +1 -1
  96. package/dist/lib/trace-builder.js +1 -1
  97. package/dist/lib/utils.js +1 -1
  98. package/package.json +5 -5
  99. package/src/components/event-list-view.tsx +29 -13
  100. package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
  101. package/src/components/new-trace-viewer/components/event-list.tsx +1 -1
  102. package/src/components/new-trace-viewer/detail-panel.tsx +1 -1
  103. package/src/components/new-trace-viewer/trace-viewer.tsx +83 -56
  104. package/src/components/sidebar/attribute-panel.tsx +212 -235
  105. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  106. package/src/components/sidebar/detail-card.tsx +119 -41
  107. package/src/components/sidebar/entity-detail-panel.tsx +28 -28
  108. package/src/components/sidebar/events-list.tsx +51 -79
  109. package/src/components/ui/button.tsx +61 -0
  110. package/src/components/ui/data-inspector.tsx +9 -18
  111. package/src/components/ui/error-stack-block.tsx +7 -26
  112. package/dist/components/error-boundary.js.map +0 -1
  113. package/dist/components/event-list-view.js.map +0 -1
  114. package/dist/components/hook-actions.js.map +0 -1
  115. package/dist/components/index.js.map +0 -1
  116. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  117. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  118. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  119. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  120. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  121. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  122. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  123. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  124. package/dist/components/new-trace-viewer/context.js.map +0 -1
  125. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  126. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  127. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  128. package/dist/components/new-trace-viewer/types.js.map +0 -1
  129. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  130. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  131. package/dist/components/run-trace-view.js.map +0 -1
  132. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  133. package/dist/components/sidebar/conversation-view.js.map +0 -1
  134. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  135. package/dist/components/sidebar/detail-card.js.map +0 -1
  136. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  137. package/dist/components/sidebar/events-list.js.map +0 -1
  138. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  139. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  140. package/dist/components/stream-viewer.js.map +0 -1
  141. package/dist/components/trace-viewer/components/map.js.map +0 -1
  142. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  143. package/dist/components/trace-viewer/components/node.js.map +0 -1
  144. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  145. package/dist/components/trace-viewer/components/search.js.map +0 -1
  146. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  147. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  148. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  149. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  150. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  151. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  152. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  153. package/dist/components/trace-viewer/context.js.map +0 -1
  154. package/dist/components/trace-viewer/index.js.map +0 -1
  155. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  156. package/dist/components/trace-viewer/types.js.map +0 -1
  157. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  158. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  159. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  160. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  161. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  162. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  163. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  164. package/dist/components/trace-viewer/worker.js.map +0 -1
  165. package/dist/components/trace-viewer-new.js.map +0 -1
  166. package/dist/components/ui/alert.js.map +0 -1
  167. package/dist/components/ui/card.js.map +0 -1
  168. package/dist/components/ui/data-inspector.js.map +0 -1
  169. package/dist/components/ui/decrypt-button.js.map +0 -1
  170. package/dist/components/ui/error-card.js.map +0 -1
  171. package/dist/components/ui/error-stack-block.js.map +0 -1
  172. package/dist/components/ui/inspector-theme.js.map +0 -1
  173. package/dist/components/ui/load-more-button.js.map +0 -1
  174. package/dist/components/ui/menu-dropdown.js.map +0 -1
  175. package/dist/components/ui/skeleton.js.map +0 -1
  176. package/dist/components/ui/spinner.js.map +0 -1
  177. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  178. package/dist/components/workflow-trace-view.js.map +0 -1
  179. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  180. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  181. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  182. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  183. package/dist/hooks/use-dark-mode.js.map +0 -1
  184. package/dist/hooks/use-reduced-motion.js.map +0 -1
  185. package/dist/index.js.map +0 -1
  186. package/dist/lib/event-analysis.js.map +0 -1
  187. package/dist/lib/event-materialization.js.map +0 -1
  188. package/dist/lib/hydration.js.map +0 -1
  189. package/dist/lib/stream-display.js.map +0 -1
  190. package/dist/lib/toast.js.map +0 -1
  191. package/dist/lib/trace-builder.js.map +0 -1
  192. package/dist/lib/utils.js.map +0 -1
@@ -127,4 +127,4 @@ export function buildTrace(run, events, now) {
127
127
  knownDurationMs: Math.max(0, knownDurationMs),
128
128
  };
129
129
  }
130
- //# sourceMappingURL=trace-builder.js.map
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdHJhY2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFJSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGdCQUFnQixHQUNqQixNQUFNLHVEQUF1RCxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUU5RSw4RUFBOEU7QUFDOUUseUJBQXlCO0FBQ3pCLDhFQUE4RTtBQUU5RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRWhGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUNoRCxTQUFTLEtBQUssY0FBYyxJQUFJLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQztBQUVqRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUN4RCxTQUFTLEtBQUssZUFBZTtJQUM3QixTQUFTLEtBQUssY0FBYztJQUM1QixTQUFTLEtBQUssZUFBZSxDQUFDO0FBYWhDLFNBQVMsU0FBUyxDQUNoQixHQUF5QixFQUN6QixhQUFxQixFQUNyQixLQUFZO0lBRVosTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixPQUFPO0lBQ1QsQ0FBQztJQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdC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IFdvcmtmbG93UnVuIGFuZCBpdHMgRXZlbnRzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGdyb3VwcyByYXcgZXZlbnRzIGJ5IGNvcnJlbGF0aW9uIElEIGFuZCBlbnRpdHkgdHlwZSxcbiAqIGNvbnZlcnRzIGVhY2ggZ3JvdXAgaW50byBhbiBPcGVuVGVsZW1ldHJ5LXN0eWxlIFNwYW4sIGFuZCByZXR1cm5zXG4gKiBhIGZ1bGx5LWZvcm1lZCBUcmFjZSByZWFkeSBmb3IgdGhlIHRyYWNlIHZpZXdlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi9jb21wb25lbnRzL3RyYWNlLXZpZXdlci90eXBlcyc7XG5pbXBvcnQge1xuICBob29rVG9TcGFuLFxuICBydW5Ub1NwYW4sXG4gIHN0ZXBUb1NwYW4sXG4gIHdhaXRUb1NwYW4sXG4gIFdPUktGTE9XX0xJQlJBUlksXG59IGZyb20gJy4uL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXNwYW4tY29uc3RydWN0aW9uJztcbmltcG9ydCB7IG90ZWxUaW1lVG9NcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXRpbWUtdXRpbHMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZW50IHR5cGUgY2xhc3NpZmllcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgaXNTdGVwRXZlbnQgPSAoZXZlbnRUeXBlOiBzdHJpbmcpID0+IGV2ZW50VHlwZS5zdGFydHNXaXRoKCdzdGVwXycpO1xuXG5leHBvcnQgY29uc3QgaXNUaW1lckV2ZW50ID0gKGV2ZW50VHlwZTogc3RyaW5nKSA9PlxuICBldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnIHx8IGV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJztcblxuZXhwb3J0IGNvbnN0IGlzSG9va0xpZmVjeWNsZUV2ZW50ID0gKGV2ZW50VHlwZTogc3RyaW5nKSA9PlxuICBldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyB8fFxuICBldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gIGV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZW50IGdyb3VwaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgR3JvdXBlZEV2ZW50cyA9IHtcbiAgZXZlbnRzQnlTdGVwSWQ6IE1hcDxzdHJpbmcsIEV2ZW50W10+O1xuICBydW5MZXZlbEV2ZW50czogRXZlbnRbXTtcbiAgdGltZXJFdmVudHM6IE1hcDxzdHJpbmcsIEV2ZW50W10+O1xuICBob29rRXZlbnRzOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbn07XG5cbmZ1bmN0aW9uIHB1c2hFdmVudChcbiAgbWFwOiBNYXA8c3RyaW5nLCBFdmVudFtdPixcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICBldmVudDogRXZlbnRcbikge1xuICBjb25zdCBleGlzdGluZyA9IG1hcC5nZXQoY29ycmVsYXRpb25JZCk7XG4gIGlmIChleGlzdGluZykge1xuICAgIGV4aXN0aW5nLnB1c2goZXZlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuICBtYXAuc2V0KGNvcnJlbGF0aW9uSWQsIFtldmVudF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBFdmVudHNCeUNvcnJlbGF0aW9uKGV2ZW50czogRXZlbnRbXSk6IEdyb3VwZWRFdmVudHMge1xuICBjb25zdCBldmVudHNCeVN0ZXBJZCA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFtdPigpO1xuICBjb25zdCBydW5MZXZlbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICBjb25zdCB0aW1lckV2ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFtdPigpO1xuICBjb25zdCBob29rRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50W10+KCk7XG5cbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gZXZlbnQuY29ycmVsYXRpb25JZDtcbiAgICBpZiAoIWNvcnJlbGF0aW9uSWQpIHtcbiAgICAgIHJ1bkxldmVsRXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzVGltZXJFdmVudChldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICBwdXNoRXZlbnQodGltZXJFdmVudHMsIGNvcnJlbGF0aW9uSWQsIGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc0hvb2tMaWZlY3ljbGVFdmVudChldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICBwdXNoRXZlbnQoaG9va0V2ZW50cywgY29ycmVsYXRpb25JZCwgZXZlbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RlcEV2ZW50KGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHB1c2hFdmVudChldmVudHNCeVN0ZXBJZCwgY29ycmVsYXRpb25JZCwgZXZlbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcnVuTGV2ZWxFdmVudHMucHVzaChldmVudCk7XG4gIH1cblxuICByZXR1cm4geyBldmVudHNCeVN0ZXBJZCwgcnVuTGV2ZWxFdmVudHMsIHRpbWVyRXZlbnRzLCBob29rRXZlbnRzIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHJhY2UgY29uc3RydWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbGF0ZXN0IGtub3duIGV2ZW50IHRpbWUgZnJvbSB0aGUgZXZlbnRzIGxpc3QuXG4gKiBBY3RpdmUgKGluLXByb2dyZXNzKSBjaGlsZCBzcGFucyBhcmUgY2FwcGVkIGF0IHRoaXMgdGltZSBpbnN0ZWFkIG9mIGBub3dgLFxuICogc28gdGhleSBvbmx5IGV4dGVuZCBhcyBmYXIgYXMgb3VyIGRhdGEgZ29lcy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhdGVzdEtub3duVGltZShldmVudHM6IEV2ZW50W10sIHJ1bjogV29ya2Zsb3dSdW4pOiBEYXRlIHtcbiAgbGV0IGxhdGVzdCA9IG5ldyBEYXRlKHJ1bi5jcmVhdGVkQXQpLmdldFRpbWUoKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCB0ID0gbmV3IERhdGUoZXZlbnQuY3JlYXRlZEF0KS5nZXRUaW1lKCk7XG4gICAgaWYgKHQgPiBsYXRlc3QpIGxhdGVzdCA9IHQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKGxhdGVzdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhbnMoXG4gIHJ1bjogV29ya2Zsb3dSdW4sXG4gIGdyb3VwZWRFdmVudHM6IEdyb3VwZWRFdmVudHMsXG4gIG5vdzogRGF0ZSxcbiAgbGF0ZXN0S25vd25UaW1lOiBEYXRlXG4pIHtcbiAgLy8gQWN0aXZlIGNoaWxkIHNwYW5zIGNhcCBhdCBsYXRlc3RLbm93blRpbWUgc28gdGhleSBkb24ndCBleHRlbmQgaW50b1xuICAvLyB1bmtub3duIHRlcnJpdG9yeS4gRXZlbiB3aGVuIHRoZSBydW4gaXMgY29tcGxldGVkLCB3ZSBtYXkgbm90IGhhdmUgbG9hZGVkXG4gIC8vIGFsbCBldmVudHMgeWV0LCBzbyBhbHdheXMgdXNlIHRoZSBsYXRlc3QgZXZlbnQgd2UndmUgYWN0dWFsbHkgc2Vlbi5cbiAgY29uc3QgY2hpbGRNYXhFbmQgPSBsYXRlc3RLbm93blRpbWU7XG4gIGNvbnN0IHJ1bk1heEVuZCA9IHJ1bi5jb21wbGV0ZWRBdCA/PyBub3c7XG5cbiAgY29uc3Qgc3RlcFNwYW5zID0gQXJyYXkuZnJvbShncm91cGVkRXZlbnRzLmV2ZW50c0J5U3RlcElkLnZhbHVlcygpKVxuICAgIC5tYXAoKGV2ZW50cykgPT4gc3RlcFRvU3BhbihldmVudHMsIGNoaWxkTWF4RW5kKSlcbiAgICAuZmlsdGVyKChzcGFuKTogc3BhbiBpcyBTcGFuID0+IHNwYW4gIT09IG51bGwpO1xuXG4gIGNvbnN0IGhvb2tTcGFucyA9IEFycmF5LmZyb20oZ3JvdXBlZEV2ZW50cy5ob29rRXZlbnRzLnZhbHVlcygpKVxuICAgIC5tYXAoKGV2ZW50cykgPT4gaG9va1RvU3BhbihldmVudHMsIGNoaWxkTWF4RW5kKSlcbiAgICAuZmlsdGVyKChzcGFuKTogc3BhbiBpcyBTcGFuID0+IHNwYW4gIT09IG51bGwpO1xuXG4gIGNvbnN0IHdhaXRTcGFucyA9IEFycmF5LmZyb20oZ3JvdXBlZEV2ZW50cy50aW1lckV2ZW50cy52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IHdhaXRUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCwgcnVuTWF4RW5kKSlcbiAgICAuZmlsdGVyKChzcGFuKTogc3BhbiBpcyBTcGFuID0+IHNwYW4gIT09IG51bGwpO1xuXG4gIHJldHVybiB7XG4gICAgcnVuU3BhbjogcnVuVG9TcGFuKHJ1biwgZ3JvdXBlZEV2ZW50cy5ydW5MZXZlbEV2ZW50cywgbm93KSxcbiAgICBzcGFuczogWy4uLnN0ZXBTcGFucywgLi4uaG9va1NwYW5zLCAuLi53YWl0U3BhbnNdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjYXNjYWRlU3BhbnMocnVuU3BhbjogU3Bhbiwgc3BhbnM6IFNwYW5bXSkge1xuICBjb25zdCBzb3J0ZWRTcGFucyA9IFtcbiAgICBydW5TcGFuLFxuICAgIC4uLnNwYW5zLnNsaWNlKCkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYVN0YXJ0ID0gb3RlbFRpbWVUb01zKGEuc3RhcnRUaW1lKTtcbiAgICAgIGNvbnN0IGJTdGFydCA9IG90ZWxUaW1lVG9NcyhiLnN0YXJ0VGltZSk7XG4gICAgICByZXR1cm4gYVN0YXJ0IC0gYlN0YXJ0O1xuICAgIH0pLFxuICBdO1xuXG4gIHJldHVybiBzb3J0ZWRTcGFucy5tYXAoKHNwYW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcGFyZW50U3BhbklkID1cbiAgICAgIGluZGV4ID09PSAwID8gdW5kZWZpbmVkIDogU3RyaW5nKHNvcnRlZFNwYW5zW2luZGV4IC0gMV0uc3BhbklkKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3BhbixcbiAgICAgIHBhcmVudFNwYW5JZCxcbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFjZVdpdGhNZXRhIHtcbiAgdHJhY2VJZDogc3RyaW5nO1xuICByb290U3BhbklkOiBzdHJpbmc7XG4gIHNwYW5zOiBTcGFuW107XG4gIHJlc291cmNlczogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfVtdO1xuICAvKiogRHVyYXRpb24gaW4gbXMgZnJvbSB0cmFjZSBzdGFydCB0byB0aGUgbGF0ZXN0IGtub3duIGV2ZW50LiAqL1xuICBrbm93bkR1cmF0aW9uTXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVHJhY2UoXG4gIHJ1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgbm93OiBEYXRlXG4pOiBUcmFjZVdpdGhNZXRhIHtcbiAgY29uc3QgZ3JvdXBlZEV2ZW50cyA9IGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbihldmVudHMpO1xuICBjb25zdCBsYXRlc3RLbm93blRpbWUgPSBjb21wdXRlTGF0ZXN0S25vd25UaW1lKGV2ZW50cywgcnVuKTtcbiAgY29uc3QgeyBydW5TcGFuLCBzcGFucyB9ID0gYnVpbGRTcGFucyhcbiAgICBydW4sXG4gICAgZ3JvdXBlZEV2ZW50cyxcbiAgICBub3csXG4gICAgbGF0ZXN0S25vd25UaW1lXG4gICk7XG4gIGNvbnN0IHNvcnRlZENhc2NhZGluZ1NwYW5zID0gY2FzY2FkZVNwYW5zKHJ1blNwYW4sIHNwYW5zKTtcblxuICAvLyBDb21wdXRlIGtub3duIGR1cmF0aW9uIHJlbGF0aXZlIHRvIHRyYWNlIHN0YXJ0XG4gIGNvbnN0IHRyYWNlU3RhcnRNcyA9IG90ZWxUaW1lVG9NcyhydW5TcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGtub3duRHVyYXRpb25NcyA9IGxhdGVzdEtub3duVGltZS5nZXRUaW1lKCkgLSB0cmFjZVN0YXJ0TXM7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFjZUlkOiBydW4ucnVuSWQsXG4gICAgcm9vdFNwYW5JZDogcnVuLnJ1bklkLFxuICAgIHNwYW5zOiBzb3J0ZWRDYXNjYWRpbmdTcGFucyxcbiAgICByZXNvdXJjZXM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3dvcmtmbG93JyxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiBXT1JLRkxPV19MSUJSQVJZLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gICAga25vd25EdXJhdGlvbk1zOiBNYXRoLm1heCgwLCBrbm93bkR1cmF0aW9uTXMpLFxuICB9O1xufVxuIl19
package/dist/lib/utils.js CHANGED
@@ -124,4 +124,4 @@ export function identifyStreamSteps(steps) {
124
124
  };
125
125
  });
126
126
  }
127
- //# sourceMappingURL=utils.js.map
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBb0I7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUUvRCxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsSUFB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O0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGVwIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pIHtcbiAgcmV0dXJuIHR3TWVyZ2UoY2xzeChpbnB1dHMpKTtcbn1cblxuY29uc3QgTVNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IE1TX0lOX01JTlVURSA9IDYwICogTVNfSU5fU0VDT05EO1xuY29uc3QgTVNfSU5fSE9VUiA9IDYwICogTVNfSU5fTUlOVVRFO1xuY29uc3QgTVNfSU5fREFZID0gMjQgKiBNU19JTl9IT1VSO1xuXG4vKipcbiAqIEZvcm1hdHMgYSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gY29tcGFjdCAtIElmIHRydWUsIHJldHVybnMgYSBjb21wYWN0IGZvcm1hdCAoZS5nLiwgXCIzODBtc1wiLCBcIjJtIDMwc1wiKS5cbiAqICAgICAgICAgICAgICAgICAgSWYgZmFsc2UgKGRlZmF1bHQpLCByZXR1cm5zIG11bHRpLXBhcnQgZm9ybWF0IChlLmcuLCBcIjFtIDEzc1wiLCBcIjJkIDVoIDNtIDEyc1wiKS5cbiAqXG4gKiBDb21wYWN0IGZvcm1hdCAodGltZWxpbmUgbWFya2Vycyk6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCIzODBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA8IDFoOiBzaG93cyBtaW51dGVzIGFuZCBzZWNvbmRzIChlLmcuLCBcIjJtIDMwc1wiKVxuICogLSA+PSAxaDogc2hvd3MgaG91cnMgYW5kIG1pbnV0ZXMgKGUuZy4sIFwiMmggMzBtXCIpXG4gKlxuICogRnVsbCBmb3JtYXQ6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCIzODBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA+PSAxbTogc2hvd3MgZGVjb21wb3NlZCBmb3JtYXQgd2l0aCB3aG9sZSBzZWNvbmRzIChlLmcuLCBcIjFtIDEzc1wiLCBcIjJtIDEzc1wiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXM6IG51bWJlciwgY29tcGFjdCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKG1zID09PSAwKSB7XG4gICAgcmV0dXJuICcwcyc7XG4gIH1cblxuICBpZiAobXMgPCBNU19JTl9TRUNPTkQpIHtcbiAgICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zKTtcbiAgICByZXR1cm4gcm91bmRlZE1zIDwgTVNfSU5fU0VDT05EID8gYCR7cm91bmRlZE1zfW1zYCA6ICcxcyc7XG4gIH1cblxuICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zIC8gTVNfSU5fU0VDT05EKSAqIE1TX0lOX1NFQ09ORDtcblxuICBpZiAocm91bmRlZE1zIDwgTVNfSU5fTUlOVVRFKSB7XG4gICAgcmV0dXJuIGAke01hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fU0VDT05EKX1zYDtcbiAgfVxuXG4gIC8vIENvbXBhY3QgZm9ybWF0OiBtdWx0aS11bml0IHdpdGhvdXQgZGVjaW1hbHMgKGUuZy4gXCI4bSAyMHNcIiwgXCIyaCAzMG1cIilcbiAgaWYgKGNvbXBhY3QpIHtcbiAgICBpZiAocm91bmRlZE1zIDwgTVNfSU5fSE9VUikge1xuICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fTUlOVVRFKTtcbiAgICAgIGNvbnN0IHMgPSBNYXRoLmZsb29yKChyb3VuZGVkTXMgJSBNU19JTl9NSU5VVEUpIC8gTVNfSU5fU0VDT05EKTtcbiAgICAgIHJldHVybiBzID4gMCA/IGAke219bSAke3N9c2AgOiBgJHttfW1gO1xuICAgIH1cbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihyb3VuZGVkTXMgLyBNU19JTl9IT1VSKTtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICAgIHJldHVybiBtID4gMCA/IGAke2h9aCAke219bWAgOiBgJHtofWhgO1xuICB9XG5cbiAgLy8gRnVsbCBmb3JtYXQ6IGRlY29tcG9zZSBpbnRvIGxhcmdlciB1bml0cyArIHdob2xlIHNlY29uZHMuXG4gIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX0RBWSk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fREFZKSAvIE1TX0lOX0hPVVIpO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG5cbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGRheXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtkYXlzfWRgKTtcbiAgfVxuICBpZiAoaG91cnMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtob3Vyc31oYCk7XG4gIH1cbiAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHttaW51dGVzfW1gKTtcbiAgfVxuICBwYXJ0cy5wdXNoKGAke3NlY29uZHN9c2ApO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZvcm1hdHRlZCBwYWdpbmF0aW9uIGRpc3BsYXkgc3RyaW5nXG4gKiBAcGFyYW0gY3VycmVudFBhZ2UgLSBUaGUgY3VycmVudCBwYWdlIG51bWJlclxuICogQHBhcmFtIHRvdGFsUGFnZXMgLSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHZpc2l0ZWQgc28gZmFyXG4gKiBAcGFyYW0gaGFzTW9yZSAtIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgcGFnZXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3RyaW5nIGxpa2UgXCJQYWdlIDEgb2YgMytcIiBvciBcIlBhZ2UgMiBvZiAyXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2luYXRpb25EaXNwbGF5KFxuICBjdXJyZW50UGFnZTogbnVtYmVyLFxuICB0b3RhbFBhZ2VzOiBudW1iZXIsXG4gIGhhc01vcmU6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGlmIChoYXNNb3JlKSB7XG4gICAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc30rYDtcbiAgfVxuICByZXR1cm4gYFBhZ2UgJHtjdXJyZW50UGFnZX0gb2YgJHt0b3RhbFBhZ2VzfWA7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIER1cmFibGUgQWdlbnQgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdGVwIGlzIGEgZG9TdHJlYW1TdGVwIChMTE0gY2FsbCB3aXRoIGNvbnZlcnNhdGlvbiBpbnB1dClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9TdHJlYW1TdGVwKHN0ZXBOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0ZXBOYW1lLmVuZHNXaXRoKCcvL2RvU3RyZWFtU3RlcCcpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIGNvbnZlcnNhdGlvbiBmcm9tIGEgaHlkcmF0ZWQgZG9TdHJlYW1TdGVwIGlucHV0LlxuICogZG9TdHJlYW1TdGVwIHNpZ25hdHVyZTogKGNvbnZlcnNhdGlvblByb21wdCwgbW9kZWwsIHdyaXRhYmxlLCB0b29scywgb3B0aW9ucylcbiAqIFNvIGlucHV0WzBdIGlzIHRoZSBjb252ZXJzYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXBJbnB1dDogdW5rbm93bik6IE1vZGVsTWVzc2FnZVtdIHwgbnVsbCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdGVwSW5wdXQpIHx8IHN0ZXBJbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0QXJnID0gc3RlcElucHV0WzBdO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaXJzdEFyZykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGl0IGxvb2tzIGxpa2UgTW9kZWxNZXNzYWdlW11cbiAgaWYgKFxuICAgICFmaXJzdEFyZy5ldmVyeSgobXNnKSA9PiBtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgJiYgJ3JvbGUnIGluIG1zZylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmlyc3RBcmcgYXMgTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogQSBkb1N0cmVhbVN0ZXAgd2l0aCBpdHMgY29udmVyc2F0aW9uIGlucHV0IGV4dHJhY3RlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVN0ZXAge1xuICBzdGVwSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgY29udmVyc2F0aW9uOiBNb2RlbE1lc3NhZ2VbXTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGFsbCBzdHJlYW0gc3RlcHMgKGRvU3RyZWFtU3RlcCkgaW4gYSBydW4gYW5kIGV4dHJhY3RzIHRoZWlyIGNvbnZlcnNhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeVN0cmVhbVN0ZXBzKHN0ZXBzOiBTdGVwW10pOiBTdHJlYW1TdGVwW10ge1xuICByZXR1cm4gc3RlcHNcbiAgICAuZmlsdGVyKChzdGVwKSA9PiBpc0RvU3RyZWFtU3RlcChzdGVwLnN0ZXBOYW1lKSlcbiAgICAubWFwKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzdGVwLnN0ZXBOYW1lLnNwbGl0KCcvLycpLnBvcCgpID8/ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGV4dHJhY3RDb252ZXJzYXRpb24oc3RlcC5pbnB1dCkgPz8gW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBjb252ZXJzYXRpb24sXG4gICAgICB9O1xuICAgIH0pO1xufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.7",
4
+ "version": "5.0.0-beta.8",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -53,9 +53,9 @@
53
53
  "streamdown": "2.3.0",
54
54
  "tailwind-merge": "3.5.0",
55
55
  "tailwindcss": "4",
56
- "@workflow/core": "5.0.0-beta.7",
57
- "@workflow/utils": "5.0.0-beta.2",
58
- "@workflow/world": "5.0.0-beta.4"
56
+ "@workflow/core": "5.0.0-beta.8",
57
+ "@workflow/utils": "5.0.0-beta.3",
58
+ "@workflow/world": "5.0.0-beta.5"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@biomejs/biome": "^2.4.4",
@@ -65,7 +65,7 @@
65
65
  "ai": "6.0.116",
66
66
  "typescript": "^5.9.3",
67
67
  "vitest": "^4.0.18",
68
- "@workflow/errors": "5.0.0-beta.4",
68
+ "@workflow/errors": "5.0.0-beta.5",
69
69
  "@workflow/tsconfig": "5.0.0-beta.0"
70
70
  },
71
71
  "scripts": {
@@ -142,7 +142,7 @@ function buildNameMaps(
142
142
  return { correlationNameMap, workflowName };
143
143
  }
144
144
 
145
- interface DurationInfo {
145
+ export interface DurationInfo {
146
146
  /** Time from created → started (ms) */
147
147
  queued?: number;
148
148
  /** Time from started → completed/failed/cancelled (ms) */
@@ -154,19 +154,30 @@ interface DurationInfo {
154
154
  * created ↔ started (queued) and started ↔ completed/failed/cancelled (ran).
155
155
  * Also computes run-level durations under the key '__run__'.
156
156
  */
157
- function buildDurationMap(events: Event[]): Map<string, DurationInfo> {
157
+ export function buildDurationMap(events: Event[]): Map<string, DurationInfo> {
158
+ // Process events in chronological order so the result doesn't depend on
159
+ // the caller's sort direction. Retried steps emit multiple `step_started`
160
+ // events for the same correlationId; the queued duration must be measured
161
+ // against the first one, not the last.
162
+ const chronological = [...events].sort(
163
+ (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()
164
+ );
165
+
158
166
  const createdTimes = new Map<string, number>();
167
+ const firstStartedTimes = new Map<string, number>();
159
168
  const startedTimes = new Map<string, number>();
160
169
  const durations = new Map<string, DurationInfo>();
161
170
 
162
- for (const event of events) {
171
+ for (const event of chronological) {
163
172
  const ts = new Date(event.createdAt).getTime();
164
173
  const key = event.correlationId ?? '__run__';
165
174
  const type: string = event.eventType;
166
175
 
167
176
  // Track created times (first event for each correlation)
168
177
  if (type === 'step_created' || type === 'run_created') {
169
- createdTimes.set(key, ts);
178
+ if (!createdTimes.has(key)) {
179
+ createdTimes.set(key, ts);
180
+ }
170
181
  }
171
182
 
172
183
  // Track started times & compute queued duration
@@ -176,16 +187,21 @@ function buildDurationMap(events: Event[]): Map<string, DurationInfo> {
176
187
  type === 'workflow_started'
177
188
  ) {
178
189
  startedTimes.set(key, ts);
179
- // If no explicit created event was seen, use the started time as created
180
- if (!createdTimes.has(key)) {
181
- createdTimes.set(key, ts);
182
- }
183
- const createdAt = createdTimes.get(key);
184
- const info = durations.get(key) ?? {};
185
- if (createdAt !== undefined) {
186
- info.queued = ts - createdAt;
190
+ // The queued duration is anchored on the first start event only
191
+ // subsequent step_started events come from retries.
192
+ if (!firstStartedTimes.has(key)) {
193
+ firstStartedTimes.set(key, ts);
194
+ // If no explicit created event was seen, use the started time as created
195
+ if (!createdTimes.has(key)) {
196
+ createdTimes.set(key, ts);
197
+ }
198
+ const createdAt = createdTimes.get(key);
199
+ const info = durations.get(key) ?? {};
200
+ if (createdAt !== undefined) {
201
+ info.queued = ts - createdAt;
202
+ }
203
+ durations.set(key, info);
187
204
  }
188
- durations.set(key, info);
189
205
  }
190
206
 
191
207
  // Compute ran duration on terminal events
@@ -31,7 +31,7 @@ export function CopyButton({
31
31
  type="button"
32
32
  aria-label={ariaLabel}
33
33
  className={cn(
34
- 'cursor-pointer text-gray-800 hover:text-gray-1000 bg-transparent border-none p-1 m-0',
34
+ 'cursor-pointer text-gray-800 hover:text-gray-1000 bg-transparent border-0 p-1 m-0',
35
35
  className
36
36
  )}
37
37
  onClick={(e) => {
@@ -68,7 +68,7 @@ const EventRow = ({
68
68
  onClick={() => onSelectSpan(span.spanId)}
69
69
  >
70
70
  <div className="h-full hover:bg-gray-100 group-aria-selected:bg-gray-100 group-aria-selected:hover:bg-gray-200">
71
- <div className="flex h-full min-w-0 items-center px-2">
71
+ <div className="flex h-full min-w-0 items-center pl-4 pr-2">
72
72
  <div className="flex min-w-0 flex-1 items-center gap-2">
73
73
  <span className={cn('shrink-0', tagClassName)}>
74
74
  <Icon className="w-4 h-4" />
@@ -29,7 +29,7 @@ export function DetailPanel({
29
29
  </span>
30
30
  <button
31
31
  type="button"
32
- className="p-1 rounded-md text-gray-900 hover:text-gray-1000 hover:bg-gray-alpha-200 transition-colors"
32
+ className="p-1 rounded-md text-gray-1000 hover:bg-gray-alpha-100 transition-colors"
33
33
  onClick={onClose}
34
34
  >
35
35
  <X className="w-4 h-4" />
@@ -1,7 +1,15 @@
1
1
  'use client';
2
2
 
3
3
  import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
- import { RotateCcw, Search, X, ZoomIn, ZoomOut } from 'lucide-react';
4
+ import {
5
+ ChevronDown,
6
+ ChevronUp,
7
+ RotateCcw,
8
+ Search,
9
+ X,
10
+ ZoomIn,
11
+ ZoomOut,
12
+ } from 'lucide-react';
5
13
  import {
6
14
  type ReactNode,
7
15
  useCallback,
@@ -19,7 +27,6 @@ import {
19
27
  import { useSidebarDataOptional } from '../sidebar/sidebar-data-context';
20
28
  import type { Trace } from '../trace-viewer/types';
21
29
  import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
22
- import { CopyButton } from './components/copy-button';
23
30
  import EventList from './components/event-list';
24
31
  import { SplitPane } from './components/split-pane';
25
32
  import {
@@ -307,13 +314,31 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
307
314
  const [altHeld, setAltHeld] = useState(false);
308
315
 
309
316
  useEffect(() => {
317
+ const handleSidebarNavKey = (e: KeyboardEvent): void => {
318
+ const target = e.target as HTMLElement | null;
319
+ if (
320
+ target instanceof HTMLInputElement ||
321
+ target instanceof HTMLTextAreaElement ||
322
+ target?.isContentEditable
323
+ ) {
324
+ return;
325
+ }
326
+ const targetId =
327
+ e.key === 'k' ? prevSpanIdRef.current : nextSpanIdRef.current;
328
+ if (targetId) {
329
+ e.preventDefault();
330
+ handleSelectSpanRef.current(targetId);
331
+ }
332
+ };
333
+
310
334
  const onKeyDown = (e: KeyboardEvent): void => {
311
335
  if (e.key === 'Escape') {
312
336
  clearActiveSpan();
313
- }
314
- if (e.key === 'Alt') {
337
+ } else if (e.key === 'Alt') {
315
338
  e.preventDefault();
316
339
  setAltHeld(true);
340
+ } else if (e.key === 'j' || e.key === 'k') {
341
+ handleSidebarNavKey(e);
317
342
  }
318
343
  };
319
344
  const onKeyUp = (e: KeyboardEvent): void => {
@@ -468,21 +493,30 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
468
493
  );
469
494
  }, [selectedSpan?.data, selectedSpan?.resource]);
470
495
 
471
- const selectedResource = selectedSpan?.resource as string | undefined;
472
- const selectedResourceId = useMemo(() => {
473
- if (!selectedSpan?.data) return undefined;
474
- const data = selectedSpan.data as Record<string, unknown>;
475
- if (selectedSpan.resource === 'hook') {
476
- return (data.hookId as string | undefined) ?? selectedSpan.spanId;
477
- }
496
+ const { prevSpanId, nextSpanId } = useMemo(() => {
497
+ if (!activeSpanId) return { prevSpanId: null, nextSpanId: null };
498
+ const i = filteredSpans.findIndex((s) => s.spanId === activeSpanId);
499
+ if (i === -1) return { prevSpanId: null, nextSpanId: null };
500
+ return {
501
+ prevSpanId: filteredSpans[i - 1]?.spanId ?? null,
502
+ nextSpanId: filteredSpans[i + 1]?.spanId ?? null,
503
+ };
504
+ }, [activeSpanId, filteredSpans]);
478
505
 
479
- return (
480
- (data.stepId as string) ??
481
- (data.runId as string) ??
482
- (data.hookId as string) ??
483
- selectedSpan.spanId
484
- );
485
- }, [selectedSpan?.data, selectedSpan?.resource, selectedSpan?.spanId]);
506
+ const handleSelectPrevSpan = useCallback(() => {
507
+ if (prevSpanId) handleSelectSpan(prevSpanId);
508
+ }, [prevSpanId, handleSelectSpan]);
509
+
510
+ const handleSelectNextSpan = useCallback(() => {
511
+ if (nextSpanId) handleSelectSpan(nextSpanId);
512
+ }, [nextSpanId, handleSelectSpan]);
513
+
514
+ const prevSpanIdRef = useRef(prevSpanId);
515
+ const nextSpanIdRef = useRef(nextSpanId);
516
+ const handleSelectSpanRef = useRef(handleSelectSpan);
517
+ prevSpanIdRef.current = prevSpanId;
518
+ nextSpanIdRef.current = nextSpanId;
519
+ handleSelectSpanRef.current = handleSelectSpan;
486
520
 
487
521
  return (
488
522
  <div
@@ -496,7 +530,7 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
496
530
  >
497
531
  <SplitPane
498
532
  startHeader={
499
- <div className="bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center px-2 gap-1.5">
533
+ <div className="bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center pl-4 pr-2 gap-1.5">
500
534
  <Search className="w-3.5 h-3.5 shrink-0 text-gray-800" />
501
535
  <input
502
536
  id="trace-viewer-search"
@@ -511,6 +545,7 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
511
545
  {searchQuery && (
512
546
  <button
513
547
  type="button"
548
+ aria-label="Clear search"
514
549
  onClick={() => setSearchQuery('')}
515
550
  className="shrink-0 p-0.5 rounded-sm text-gray-800 hover:text-gray-1000 hover:bg-gray-200 transition-colors"
516
551
  >
@@ -581,45 +616,37 @@ function NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {
581
616
  {activeSpan && sidebar ? (
582
617
  <aside className="flex flex-col h-full max-h-full bg-background-100 border-l border-gray-alpha-400 overflow-auto">
583
618
  {/* Panel header */}
584
- <div className="flex-shrink-0 px-4 pt-4 pb-3">
585
- <div className="flex items-start justify-between gap-2">
586
- <div className="min-w-0 flex-1">
587
- <span className="text-[15px] font-semibold text-gray-1000 truncate block">
588
- {selectedSpanName}
589
- </span>
590
- {selectedResourceId && (
591
- <div className="mt-1 flex items-center gap-2">
592
- {selectedResource && (
593
- <span
594
- className={`inline-flex items-center rounded-md px-1.5 py-0.5 text-[11px] font-medium leading-none shrink-0 ${
595
- selectedResource === 'step'
596
- ? 'bg-green-200 text-green-900'
597
- : selectedResource === 'run'
598
- ? 'bg-blue-200 text-blue-900'
599
- : 'bg-gray-200 text-gray-900'
600
- }`}
601
- >
602
- {selectedResource.charAt(0).toUpperCase() +
603
- selectedResource.slice(1)}
604
- </span>
605
- )}
606
- <div
607
- className="flex items-center gap-1 text-[13px] font-mono text-gray-700 min-w-0"
608
- title={selectedResourceId}
609
- >
610
- <span className="truncate">{selectedResourceId}</span>
611
- <CopyButton
612
- copyText={selectedResourceId}
613
- ariaLabel="Copy ID"
614
- className="shrink-0"
615
- />
616
- </div>
617
- </div>
618
- )}
619
- </div>
619
+ <div className="flex items-center justify-between gap-2 shrink-0 px-4 pt-3 pb-3">
620
+ <span className="text-label-14 font-medium text-gray-1000 truncate block">
621
+ {selectedSpanName}
622
+ </span>
623
+ <div className="flex items-center gap-0.5 shrink-0">
624
+ <button
625
+ type="button"
626
+ aria-label="Navigate to previous span"
627
+ aria-keyshortcuts="K"
628
+ onClick={handleSelectPrevSpan}
629
+ disabled={!prevSpanId}
630
+ className="p-1 rounded text-gray-1000 transition-colors enabled:hover:bg-gray-alpha-100 disabled:opacity-40 disabled:cursor-not-allowed"
631
+ >
632
+ <ChevronUp className="w-4 h-4" />
633
+ </button>
634
+ <button
635
+ type="button"
636
+ aria-label="Navigate to next span"
637
+ aria-keyshortcuts="J"
638
+ onClick={handleSelectNextSpan}
639
+ disabled={!nextSpanId}
640
+ className="p-1 rounded text-gray-1000 transition-colors enabled:hover:bg-gray-alpha-100 disabled:opacity-40 disabled:cursor-not-allowed"
641
+ >
642
+ <ChevronDown className="w-4 h-4" />
643
+ </button>
644
+ <div aria-hidden className="w-px h-4 bg-gray-alpha-400 mx-1" />
620
645
  <button
621
646
  type="button"
622
- className="p-1 rounded-md text-gray-900 hover:text-gray-1000 hover:bg-gray-alpha-200 transition-colors shrink-0"
647
+ aria-label="Close span details"
648
+ aria-keyshortcuts="Escape"
649
+ className="p-1 rounded text-gray-1000 hover:bg-gray-alpha-100 transition-colors"
623
650
  onClick={clearActiveSpan}
624
651
  >
625
652
  <X className="w-4 h-4" />