@workflow/web-shared 5.0.0-beta.7 → 5.0.0-beta.9
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.
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +12 -0
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +26 -13
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -1
- package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
- package/dist/components/new-trace-viewer/components/event-list.d.ts +3 -1
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/event-list.js +8 -7
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +1 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +1 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +1 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +1 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +1 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts +4 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/timeline.js +6 -5
- package/dist/components/new-trace-viewer/context.js +1 -1
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/detail-panel.js +3 -2
- package/dist/components/new-trace-viewer/icons.js +1 -1
- package/dist/components/new-trace-viewer/search.d.ts +19 -0
- package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/search.js +134 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +62 -35
- package/dist/components/new-trace-viewer/types.js +1 -1
- package/dist/components/new-trace-viewer/util/constants.js +1 -1
- package/dist/components/new-trace-viewer/utils.js +1 -1
- package/dist/components/run-trace-view.js +1 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +99 -73
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +16 -15
- package/dist/components/sidebar/detail-card.d.ts +5 -6
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +32 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +6 -3
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +21 -15
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.js +1 -1
- package/dist/components/stream-viewer.js +1 -1
- package/dist/components/trace-viewer/components/map.js +1 -1
- package/dist/components/trace-viewer/components/markers.js +1 -1
- package/dist/components/trace-viewer/components/node.js +1 -1
- package/dist/components/trace-viewer/components/search-input.js +1 -1
- package/dist/components/trace-viewer/components/search.js +1 -1
- package/dist/components/trace-viewer/components/span-content.js +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
- package/dist/components/trace-viewer/components/span-segments.js +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js +1 -1
- package/dist/components/trace-viewer/components/ui.js +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
- package/dist/components/trace-viewer/context.js +1 -1
- package/dist/components/trace-viewer/index.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/constants.js +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
- package/dist/components/trace-viewer/util/timing.js +1 -1
- package/dist/components/trace-viewer/util/tree.js +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
- package/dist/components/trace-viewer/worker.js +1 -1
- package/dist/components/trace-viewer-new.js +1 -1
- package/dist/components/ui/alert.js +1 -1
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/data-inspector.d.ts +1 -0
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +4 -9
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +1 -1
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +4 -18
- package/dist/components/ui/icon-button.d.ts +13 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/inspector-theme.js +1 -1
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.js +1 -1
- package/dist/components/workflow-trace-view.js +1 -1
- package/dist/components/workflow-traces/event-colors.js +1 -1
- package/dist/components/workflow-traces/trace-colors.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +1 -1
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-reduced-motion.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/event-analysis.js +1 -1
- package/dist/lib/event-materialization.js +1 -1
- package/dist/lib/hydration.js +1 -1
- package/dist/lib/stream-display.js +1 -1
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/styles.css +5 -0
- package/package.json +5 -5
- package/src/components/event-list-view.tsx +29 -13
- package/src/components/index.ts +1 -0
- package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
- package/src/components/new-trace-viewer/components/event-list.tsx +17 -6
- package/src/components/new-trace-viewer/components/timeline.tsx +11 -2
- package/src/components/new-trace-viewer/detail-panel.tsx +3 -6
- package/src/components/new-trace-viewer/search.ts +178 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +123 -89
- package/src/components/sidebar/attribute-panel.tsx +212 -235
- package/src/components/sidebar/copyable-data-block.tsx +49 -27
- package/src/components/sidebar/detail-card.tsx +119 -41
- package/src/components/sidebar/entity-detail-panel.tsx +28 -28
- package/src/components/sidebar/events-list.tsx +51 -79
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/data-inspector.tsx +9 -18
- package/src/components/ui/error-stack-block.tsx +7 -26
- package/src/components/ui/icon-button.tsx +57 -0
- package/src/styles.css +5 -0
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
- package/dist/components/new-trace-viewer/context.js.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
- package/dist/components/new-trace-viewer/icons.js.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/new-trace-viewer/types.js.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
- package/dist/components/new-trace-viewer/utils.js.map +0 -1
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/trace-viewer-new.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/hooks/use-reduced-motion.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/stream-display.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- 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/dist/styles.css
CHANGED
|
@@ -36,6 +36,9 @@
|
|
|
36
36
|
--ds-gray-alpha-700: hsla(0, 0%, 0%, 0.44);
|
|
37
37
|
--ds-gray-alpha-1000: hsla(0, 0%, 0%, 0.91);
|
|
38
38
|
|
|
39
|
+
/* Focus */
|
|
40
|
+
--ds-focus-color: var(--ds-blue-700);
|
|
41
|
+
|
|
39
42
|
/* Blue */
|
|
40
43
|
--ds-blue-100: hsl(212, 100%, 97%);
|
|
41
44
|
--ds-blue-200: hsl(210, 100%, 96%);
|
|
@@ -126,6 +129,8 @@
|
|
|
126
129
|
--ds-gray-alpha-700: rgba(255, 255, 255, 0.45);
|
|
127
130
|
--ds-gray-alpha-1000: rgba(255, 255, 255, 0.92);
|
|
128
131
|
|
|
132
|
+
--ds-focus-color: var(--ds-blue-900);
|
|
133
|
+
|
|
129
134
|
--ds-blue-100: hsl(216, 50%, 12%);
|
|
130
135
|
--ds-blue-200: hsl(214, 59%, 15%);
|
|
131
136
|
--ds-blue-300: hsl(213, 71%, 20%);
|
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.
|
|
4
|
+
"version": "5.0.0-beta.9",
|
|
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.
|
|
57
|
-
"@workflow/utils": "5.0.0-beta.
|
|
58
|
-
"@workflow/world": "5.0.0-beta.
|
|
56
|
+
"@workflow/core": "5.0.0-beta.9",
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
//
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
package/src/components/index.ts
CHANGED
|
@@ -32,6 +32,7 @@ export {
|
|
|
32
32
|
type DecryptClickContextValue,
|
|
33
33
|
} from './ui/data-inspector';
|
|
34
34
|
export { DecryptButton } from './ui/decrypt-button';
|
|
35
|
+
export { IconButton } from './ui/icon-button';
|
|
35
36
|
export { LoadMoreButton } from './ui/load-more-button';
|
|
36
37
|
export { MenuDropdown, type MenuDropdownOption } from './ui/menu-dropdown';
|
|
37
38
|
export { Spinner } from './ui/spinner';
|
|
@@ -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-
|
|
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) => {
|
|
@@ -3,11 +3,12 @@ import { cn } from '../../../lib/utils';
|
|
|
3
3
|
import type { Span } from '../../trace-viewer/types';
|
|
4
4
|
import { formatDuration } from '../../trace-viewer/util/timing';
|
|
5
5
|
import {
|
|
6
|
-
WorkflowIcon,
|
|
7
|
-
WebhookIcon,
|
|
8
6
|
SleepIcon,
|
|
9
7
|
StepForwardIcon,
|
|
8
|
+
WebhookIcon,
|
|
9
|
+
WorkflowIcon,
|
|
10
10
|
} from '../icons';
|
|
11
|
+
import { isSpanDimmedBySearch, type SpanSearchResult } from '../search';
|
|
11
12
|
import { getSpanDurationMs } from '../utils';
|
|
12
13
|
import { MiddleTruncate } from './middle-truncate/middle-truncate';
|
|
13
14
|
|
|
@@ -41,10 +42,12 @@ function getEventStyle(resource: string, isErrored: boolean): EventStyle {
|
|
|
41
42
|
const EventRow = ({
|
|
42
43
|
span,
|
|
43
44
|
isSelected,
|
|
45
|
+
isDimmed,
|
|
44
46
|
onSelectSpan,
|
|
45
47
|
}: {
|
|
46
48
|
span: Span;
|
|
47
49
|
isSelected: boolean;
|
|
50
|
+
isDimmed?: boolean;
|
|
48
51
|
onSelectSpan: (spanId: string) => void;
|
|
49
52
|
}) => {
|
|
50
53
|
const durationMs = getSpanDurationMs(span);
|
|
@@ -58,8 +61,9 @@ const EventRow = ({
|
|
|
58
61
|
return (
|
|
59
62
|
<li
|
|
60
63
|
className={cn(
|
|
61
|
-
'relative overflow-clip group
|
|
62
|
-
ROW_HEIGHT_CLASS
|
|
64
|
+
'relative overflow-clip group transition-opacity',
|
|
65
|
+
ROW_HEIGHT_CLASS,
|
|
66
|
+
isDimmed && 'opacity-35'
|
|
63
67
|
)}
|
|
64
68
|
role="treeitem"
|
|
65
69
|
aria-selected={isSelected}
|
|
@@ -68,7 +72,7 @@ const EventRow = ({
|
|
|
68
72
|
onClick={() => onSelectSpan(span.spanId)}
|
|
69
73
|
>
|
|
70
74
|
<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
|
|
75
|
+
<div className="flex h-full min-w-0 items-center pl-4 pr-2">
|
|
72
76
|
<div className="flex min-w-0 flex-1 items-center gap-2">
|
|
73
77
|
<span className={cn('shrink-0', tagClassName)}>
|
|
74
78
|
<Icon className="w-4 h-4" />
|
|
@@ -91,20 +95,27 @@ const EventRow = ({
|
|
|
91
95
|
const EventList = ({
|
|
92
96
|
spans,
|
|
93
97
|
activeSpanId,
|
|
98
|
+
searchResult,
|
|
94
99
|
onSelectSpan,
|
|
95
100
|
}: {
|
|
96
101
|
spans: Span[];
|
|
97
102
|
activeSpanId: string | null;
|
|
103
|
+
searchResult: SpanSearchResult;
|
|
98
104
|
onSelectSpan: (spanId: string) => void;
|
|
99
105
|
}) => {
|
|
100
106
|
return (
|
|
101
|
-
<ul
|
|
107
|
+
<ul
|
|
108
|
+
id="event-list"
|
|
109
|
+
role="tree"
|
|
110
|
+
className="block min-h-0 overflow-visible divide-y divide-gray-alpha-400 border-b border-gray-alpha-400"
|
|
111
|
+
>
|
|
102
112
|
{spans.map((span) => {
|
|
103
113
|
return (
|
|
104
114
|
<EventRow
|
|
105
115
|
key={span.spanId}
|
|
106
116
|
span={span}
|
|
107
117
|
isSelected={span.spanId === activeSpanId}
|
|
118
|
+
isDimmed={isSpanDimmedBySearch(span.spanId, searchResult)}
|
|
108
119
|
onSelectSpan={onSelectSpan}
|
|
109
120
|
/>
|
|
110
121
|
);
|
|
@@ -7,6 +7,7 @@ import { cn } from '../../../lib/utils';
|
|
|
7
7
|
import type { Span } from '../../trace-viewer/types';
|
|
8
8
|
import { formatDuration, getHighResInMs } from '../../trace-viewer/util/timing';
|
|
9
9
|
import type { Segment, SegmentStatus, TimeMarker } from '../utils';
|
|
10
|
+
import { isSpanDimmedBySearch, type SpanSearchResult } from '../search';
|
|
10
11
|
import {
|
|
11
12
|
computeSpanGaps,
|
|
12
13
|
computeSpanSegments,
|
|
@@ -264,6 +265,7 @@ const TimelineBar = memo(function TimelineBar({
|
|
|
264
265
|
viewDuration,
|
|
265
266
|
containerWidth,
|
|
266
267
|
isSelected,
|
|
268
|
+
isDimmed,
|
|
267
269
|
onSelect,
|
|
268
270
|
}: {
|
|
269
271
|
span: Span;
|
|
@@ -271,6 +273,7 @@ const TimelineBar = memo(function TimelineBar({
|
|
|
271
273
|
viewDuration: number;
|
|
272
274
|
containerWidth: number;
|
|
273
275
|
isSelected: boolean;
|
|
276
|
+
isDimmed?: boolean;
|
|
274
277
|
onSelect: (spanId: string) => void;
|
|
275
278
|
}): ReactNode {
|
|
276
279
|
const startMs = getHighResInMs(span.startTime);
|
|
@@ -323,12 +326,15 @@ const TimelineBar = memo(function TimelineBar({
|
|
|
323
326
|
aria-selected={isSelected}
|
|
324
327
|
aria-expanded={isSelected}
|
|
325
328
|
aria-level={1}
|
|
326
|
-
className=
|
|
329
|
+
className={cn(
|
|
330
|
+
'group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity',
|
|
331
|
+
isDimmed && 'opacity-35'
|
|
332
|
+
)}
|
|
327
333
|
onClick={handleClick}
|
|
328
334
|
>
|
|
329
335
|
<div className="absolute inset-y-0" style={TIMELINE_INSET_STYLE}>
|
|
330
336
|
<div
|
|
331
|
-
className="absolute top-1/2 h-6 -translate-y-1/2"
|
|
337
|
+
className="absolute top-1/2 h-6 -translate-y-1/2 rounded-[0.25rem]"
|
|
332
338
|
style={getBarPositionStyle(geometry)}
|
|
333
339
|
>
|
|
334
340
|
{geometry.mode.kind === 'arrow' ? (
|
|
@@ -448,6 +454,7 @@ export function Timeline({
|
|
|
448
454
|
viewEnd,
|
|
449
455
|
markers,
|
|
450
456
|
selectedId,
|
|
457
|
+
searchResult,
|
|
451
458
|
onSelect,
|
|
452
459
|
hoverFraction,
|
|
453
460
|
altHeld = false,
|
|
@@ -457,6 +464,7 @@ export function Timeline({
|
|
|
457
464
|
viewEnd: number;
|
|
458
465
|
markers: TimeMarker[];
|
|
459
466
|
selectedId: string | null;
|
|
467
|
+
searchResult: SpanSearchResult;
|
|
460
468
|
onSelect: (spanId: string) => void;
|
|
461
469
|
hoverFraction?: number | null;
|
|
462
470
|
altHeld?: boolean;
|
|
@@ -518,6 +526,7 @@ export function Timeline({
|
|
|
518
526
|
viewDuration={viewDuration}
|
|
519
527
|
containerWidth={timelineWidth}
|
|
520
528
|
isSelected={selectedId === span.spanId}
|
|
529
|
+
isDimmed={isSpanDimmedBySearch(span.spanId, searchResult)}
|
|
521
530
|
onSelect={onSelect}
|
|
522
531
|
/>
|
|
523
532
|
))}
|
|
@@ -4,6 +4,7 @@ import { X } from 'lucide-react';
|
|
|
4
4
|
import type { ReactNode } from 'react';
|
|
5
5
|
import type { Span } from '../trace-viewer/types';
|
|
6
6
|
import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
|
|
7
|
+
import { IconButton } from '../ui/icon-button';
|
|
7
8
|
import { getSpanDurationMs } from './utils';
|
|
8
9
|
|
|
9
10
|
interface DetailPanelProps {
|
|
@@ -27,13 +28,9 @@ export function DetailPanel({
|
|
|
27
28
|
<span className="text-sm font-medium text-gray-1000 truncate">
|
|
28
29
|
{span.name}
|
|
29
30
|
</span>
|
|
30
|
-
<
|
|
31
|
-
type="button"
|
|
32
|
-
className="p-1 rounded-md text-gray-900 hover:text-gray-1000 hover:bg-gray-alpha-200 transition-colors"
|
|
33
|
-
onClick={onClose}
|
|
34
|
-
>
|
|
31
|
+
<IconButton aria-label="Close span details" onClick={onClose}>
|
|
35
32
|
<X className="w-4 h-4" />
|
|
36
|
-
</
|
|
33
|
+
</IconButton>
|
|
37
34
|
</div>
|
|
38
35
|
<div className="overflow-y-auto p-3 space-y-3">
|
|
39
36
|
<dl className="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5 text-sm">
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { Span } from '../trace-viewer/types';
|
|
2
|
+
|
|
3
|
+
const ATTR_FILTER_REGEX = /(?:^|\s)(?<pair>(?<key>[\w.]+):(?<value>\S*))/g;
|
|
4
|
+
|
|
5
|
+
export interface SpanAttributeFilter {
|
|
6
|
+
key: string;
|
|
7
|
+
value: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ParsedSpanSearchQuery {
|
|
11
|
+
text: string;
|
|
12
|
+
attributes: SpanAttributeFilter[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface SpanSearchResult {
|
|
16
|
+
isActive: boolean;
|
|
17
|
+
matchedSpanIds: Set<string>;
|
|
18
|
+
matchingSpans: Span[];
|
|
19
|
+
query: ParsedSpanSearchQuery;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function parseSpanSearchQuery(rawQuery: string): ParsedSpanSearchQuery {
|
|
23
|
+
const attributes: SpanAttributeFilter[] = [];
|
|
24
|
+
for (const match of rawQuery.matchAll(ATTR_FILTER_REGEX)) {
|
|
25
|
+
const key = match.groups?.key?.trim();
|
|
26
|
+
if (!key) continue;
|
|
27
|
+
attributes.push({
|
|
28
|
+
key,
|
|
29
|
+
value: (match.groups?.value ?? '').toLocaleLowerCase(),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const text = rawQuery
|
|
34
|
+
.replace(ATTR_FILTER_REGEX, ' ')
|
|
35
|
+
.replace(/\s{2,}/g, ' ')
|
|
36
|
+
.trim()
|
|
37
|
+
.toLocaleLowerCase();
|
|
38
|
+
|
|
39
|
+
return { text, attributes };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function isSpanDimmedBySearch(
|
|
43
|
+
spanId: string,
|
|
44
|
+
result: SpanSearchResult
|
|
45
|
+
): boolean {
|
|
46
|
+
return result.isActive && !result.matchedSpanIds.has(spanId);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function searchSpans(spans: Span[], rawQuery: string): SpanSearchResult {
|
|
50
|
+
const query = parseSpanSearchQuery(rawQuery);
|
|
51
|
+
const isActive = Boolean(query.text || query.attributes.length);
|
|
52
|
+
const matchingSpans = isActive
|
|
53
|
+
? spans.filter((span) => spanMatchesQuery(span, query))
|
|
54
|
+
: spans;
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
isActive,
|
|
58
|
+
matchedSpanIds: new Set(matchingSpans.map((span) => span.spanId)),
|
|
59
|
+
matchingSpans,
|
|
60
|
+
query,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function spanMatchesQuery(span: Span, query: ParsedSpanSearchQuery): boolean {
|
|
65
|
+
if (query.text && !spanMatchesText(span, query.text)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return query.attributes.every(({ key, value }) =>
|
|
70
|
+
spanMatchesAttribute(span, key, value)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function spanMatchesText(span: Span, text: string): boolean {
|
|
75
|
+
return [
|
|
76
|
+
span.name,
|
|
77
|
+
span.spanId,
|
|
78
|
+
span.resource,
|
|
79
|
+
span.library.name,
|
|
80
|
+
span.library.version,
|
|
81
|
+
]
|
|
82
|
+
.filter((value): value is string => typeof value === 'string')
|
|
83
|
+
.some((value) => value.toLocaleLowerCase().includes(text));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function spanMatchesAttribute(
|
|
87
|
+
span: Span,
|
|
88
|
+
key: string,
|
|
89
|
+
expectedValue: string
|
|
90
|
+
): boolean {
|
|
91
|
+
const candidates = getSearchValues(span, key);
|
|
92
|
+
if (!candidates.length) return false;
|
|
93
|
+
|
|
94
|
+
if (!expectedValue) {
|
|
95
|
+
return candidates.some((value) => value != null);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return candidates.some((value) =>
|
|
99
|
+
valueToSearchString(value).toLocaleLowerCase().includes(expectedValue)
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function getSearchValues(span: Span, key: string): unknown[] {
|
|
104
|
+
const candidates: unknown[] = [];
|
|
105
|
+
const normalizedKey = key.toLocaleLowerCase();
|
|
106
|
+
|
|
107
|
+
switch (normalizedKey) {
|
|
108
|
+
case 'id':
|
|
109
|
+
case 'spanid':
|
|
110
|
+
case 'span.id':
|
|
111
|
+
candidates.push(span.spanId);
|
|
112
|
+
break;
|
|
113
|
+
case 'name':
|
|
114
|
+
candidates.push(span.name);
|
|
115
|
+
break;
|
|
116
|
+
case 'resource':
|
|
117
|
+
candidates.push(span.resource);
|
|
118
|
+
break;
|
|
119
|
+
case 'library':
|
|
120
|
+
case 'library.name':
|
|
121
|
+
candidates.push(span.library.name);
|
|
122
|
+
break;
|
|
123
|
+
case 'library.version':
|
|
124
|
+
candidates.push(span.library.version);
|
|
125
|
+
break;
|
|
126
|
+
case 'status':
|
|
127
|
+
case 'status.code':
|
|
128
|
+
candidates.push(span.status.code);
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
candidates.push(getOwnProperty(span.attributes, key));
|
|
133
|
+
candidates.push(getPathValue(span.attributes, key));
|
|
134
|
+
|
|
135
|
+
if (!normalizedKey.startsWith('data.')) {
|
|
136
|
+
candidates.push(getPathValue(span.attributes.data, key));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return candidates.filter((value) => value !== undefined);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function getOwnProperty(source: unknown, key: string): unknown {
|
|
143
|
+
if (!source || typeof source !== 'object') return undefined;
|
|
144
|
+
if (!Object.hasOwn(source, key)) return undefined;
|
|
145
|
+
return (source as Record<string, unknown>)[key];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function getPathValue(source: unknown, path: string): unknown {
|
|
149
|
+
if (!source || typeof source !== 'object') return undefined;
|
|
150
|
+
|
|
151
|
+
let current: unknown = source;
|
|
152
|
+
for (const segment of path.split('.')) {
|
|
153
|
+
if (!segment) return undefined;
|
|
154
|
+
current = getOwnProperty(current, segment);
|
|
155
|
+
if (current === undefined) return undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return current;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function valueToSearchString(value: unknown): string {
|
|
162
|
+
if (value instanceof Date) return value.toISOString();
|
|
163
|
+
if (typeof value === 'string') return value;
|
|
164
|
+
if (
|
|
165
|
+
value == null ||
|
|
166
|
+
typeof value === 'number' ||
|
|
167
|
+
typeof value === 'boolean' ||
|
|
168
|
+
typeof value === 'bigint'
|
|
169
|
+
) {
|
|
170
|
+
return String(value);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
return JSON.stringify(value);
|
|
175
|
+
} catch {
|
|
176
|
+
return String(value);
|
|
177
|
+
}
|
|
178
|
+
}
|