@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -13
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +46 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +235 -97
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +8 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -4
- package/dist/components/sidebar/attribute-panel.d.ts +4 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +173 -119
- package/dist/components/sidebar/attributes-block.d.ts +40 -0
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
- package/dist/components/sidebar/attributes-block.js +140 -0
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +17 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +37 -71
- package/dist/components/sidebar/events-list.d.ts +6 -2
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +77 -63
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
- package/dist/components/sidebar/sidebar-data-context.js +1 -1
- package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
- package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
- package/dist/components/sidebar/span-detail-merge.js +92 -0
- package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
- package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
- package/dist/components/sidebar/use-selected-span-detail.js +93 -0
- package/dist/components/stream-viewer-skeleton.d.ts +2 -0
- package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/stream-viewer-skeleton.js +12 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +9 -26
- package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/copy-button.js +27 -0
- package/dist/components/trace-viewer/components/detail-panel-width.d.ts +34 -0
- package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
- package/dist/components/trace-viewer/components/detail-panel.d.ts +14 -0
- package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel.js +122 -0
- package/dist/components/trace-viewer/components/draggable-border.d.ts +31 -0
- package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/draggable-border.js +140 -0
- package/dist/components/trace-viewer/components/event-list.d.ts +10 -0
- package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/event-list.js +47 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
- package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/trace-viewer/components/minimap.d.ts +14 -0
- package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/minimap.js +337 -0
- package/dist/components/trace-viewer/components/pane-constants.d.ts +14 -0
- package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/pane-constants.js +16 -0
- package/dist/components/trace-viewer/components/span-markers.d.ts +46 -0
- package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/span-markers.js +85 -0
- package/dist/components/trace-viewer/components/split-pane.d.ts +10 -0
- package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/split-pane.js +41 -0
- package/dist/components/trace-viewer/components/timeline.d.ts +42 -0
- package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/timeline.js +321 -0
- package/dist/components/trace-viewer/components/timeline.module.css +46 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
- package/dist/components/trace-viewer/components/use-element-width.d.ts +8 -0
- package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-element-width.js +25 -0
- package/dist/components/trace-viewer/components/use-row-window.d.ts +34 -0
- package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-row-window.js +107 -0
- package/dist/components/trace-viewer/context.d.ts +14 -182
- package/dist/components/trace-viewer/context.d.ts.map +1 -1
- package/dist/components/trace-viewer/context.js +44 -351
- package/dist/components/trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/trace-viewer/icons.js +15 -0
- package/dist/components/trace-viewer/search.d.ts +19 -0
- package/dist/components/trace-viewer/search.d.ts.map +1 -0
- package/dist/components/trace-viewer/search.js +134 -0
- package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
- package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +306 -356
- package/dist/components/trace-viewer/types.d.ts +2 -211
- package/dist/components/trace-viewer/types.d.ts.map +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts +2 -2
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +3 -3
- package/dist/components/trace-viewer/utils.d.ts +111 -0
- package/dist/components/trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/trace-viewer/utils.js +430 -0
- package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +7 -3
- package/dist/components/trace-viewer.d.ts.map +1 -0
- package/dist/components/trace-viewer.js +21 -0
- package/dist/components/ui/alert.js +3 -3
- 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.d.ts.map +1 -1
- package/dist/components/ui/card.js +4 -4
- package/dist/components/ui/collapsible.d.ts +46 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +66 -0
- package/dist/components/ui/context-card.d.ts +47 -0
- package/dist/components/ui/context-card.d.ts.map +1 -0
- package/dist/components/ui/context-card.js +471 -0
- package/dist/components/ui/data-inspector.d.ts +7 -6
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +232 -99
- package/dist/components/ui/data-inspector.styles.d.ts +29 -0
- package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
- package/dist/components/ui/data-inspector.styles.js +95 -0
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +3 -3
- package/dist/components/ui/error-stack-block.d.ts +17 -10
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +49 -30
- package/dist/components/ui/icon-button.d.ts +19 -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/kbd.d.ts +10 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +25 -0
- 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 +2 -2
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
- package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
- package/dist/components/ui/timestamp-tooltip.js +80 -132
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +12 -0
- package/dist/components/workflow-traces/event-colors.d.ts +2 -1
- package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
- package/dist/components/workflow-traces/event-colors.js +15 -7
- package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +71 -30
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-intersection-observer.d.ts +17 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.js +29 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
- package/dist/hooks/use-load-more-on-scroll.js +28 -0
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/lib/cn.d.ts +10 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +83 -0
- package/dist/lib/event-analysis.d.ts +1 -1
- package/dist/lib/event-analysis.d.ts.map +1 -1
- package/dist/lib/event-analysis.js +3 -2
- package/dist/lib/event-materialization.d.ts +1 -1
- package/dist/lib/event-materialization.d.ts.map +1 -1
- package/dist/lib/event-materialization.js +29 -21
- package/dist/lib/exact-event-search-id.d.ts +25 -0
- package/dist/lib/exact-event-search-id.d.ts.map +1 -0
- package/dist/lib/exact-event-search-id.js +39 -0
- package/dist/lib/hydration.d.ts +17 -2
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +194 -23
- package/dist/lib/stream-display.js +1 -1
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts +17 -5
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +32 -14
- package/dist/lib/trace-types.d.ts +54 -0
- package/dist/lib/trace-types.d.ts.map +1 -0
- package/dist/lib/trace-types.js +2 -0
- package/dist/lib/utils.d.ts +14 -2
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +46 -6
- package/dist/lib/zstd-browser-decoder.d.ts +7 -0
- package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
- package/dist/lib/zstd-browser-decoder.js +41 -0
- package/dist/styles.css +210 -139
- package/package.json +11 -8
- package/src/components/event-list-view.tsx +385 -123
- package/src/components/index.ts +14 -8
- package/src/components/sidebar/attribute-panel.tsx +331 -282
- package/src/components/sidebar/attributes-block.tsx +326 -0
- package/src/components/sidebar/copyable-data-block.tsx +50 -28
- package/src/components/sidebar/entity-detail-panel.tsx +92 -126
- package/src/components/sidebar/events-list.tsx +197 -179
- package/src/components/sidebar/sidebar-data-context.tsx +11 -11
- package/src/components/sidebar/span-detail-merge.ts +134 -0
- package/src/components/sidebar/use-selected-span-detail.ts +146 -0
- package/src/components/stream-viewer-skeleton.tsx +34 -0
- package/src/components/stream-viewer.tsx +34 -106
- package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +2 -2
- package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
- package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
- package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
- package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
- package/src/components/trace-viewer/components/event-list.tsx +144 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
- package/src/components/trace-viewer/components/minimap.tsx +556 -0
- package/src/components/trace-viewer/components/pane-constants.ts +19 -0
- package/src/components/trace-viewer/components/span-markers.tsx +173 -0
- package/src/components/trace-viewer/components/split-pane.tsx +141 -0
- package/src/components/trace-viewer/components/timeline.module.css +46 -0
- package/src/components/trace-viewer/components/timeline.tsx +850 -0
- package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
- package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
- package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
- package/src/components/trace-viewer/components/use-element-width.ts +29 -0
- package/src/components/trace-viewer/components/use-row-window.ts +140 -0
- package/src/components/trace-viewer/context.tsx +63 -656
- package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
- package/src/components/trace-viewer/search.ts +178 -0
- package/src/components/trace-viewer/trace-viewer.tsx +563 -531
- package/src/components/trace-viewer/types.ts +2 -234
- package/src/components/trace-viewer/util/timing.ts +2 -2
- package/src/components/trace-viewer/utils.test.ts +458 -0
- package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
- package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
- package/src/components/ui/alert.tsx +2 -2
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/card.tsx +3 -10
- package/src/components/ui/collapsible.tsx +219 -0
- package/src/components/ui/context-card.tsx +784 -0
- package/src/components/ui/data-inspector.styles.ts +96 -0
- package/src/components/ui/data-inspector.tsx +501 -204
- package/src/components/ui/error-card.tsx +4 -4
- package/src/components/ui/error-stack-block.tsx +84 -55
- package/src/components/ui/icon-button.tsx +53 -0
- package/src/components/ui/kbd.tsx +43 -0
- package/src/components/ui/skeleton.tsx +1 -1
- package/src/components/ui/timestamp-tooltip.tsx +132 -194
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-traces/event-colors.ts +15 -11
- package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
- package/src/components/workflow-traces/trace-span-construction.ts +97 -32
- package/src/hooks/use-intersection-observer.ts +57 -0
- package/src/hooks/use-load-more-on-scroll.ts +49 -0
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +10 -4
- package/src/lib/cn.ts +93 -0
- package/src/lib/event-analysis.ts +6 -4
- package/src/lib/event-materialization.ts +35 -21
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +210 -30
- package/src/lib/trace-builder.ts +43 -19
- package/src/lib/trace-types.ts +56 -0
- package/src/lib/utils.test.ts +33 -0
- package/src/lib/utils.ts +53 -6
- package/src/lib/zstd-browser-decoder.ts +42 -0
- package/src/styles.css +210 -139
- 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.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
- package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.js +0 -38
- package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
- 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.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
- 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.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
- 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.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
- 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.d.ts +0 -14
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +0 -99
- package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js +0 -138
- package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
- package/dist/components/new-trace-viewer/context.d.ts +0 -15
- package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/context.js +0 -47
- package/dist/components/new-trace-viewer/context.js.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.js +0 -12
- package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
- package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/icons.js +0 -15
- package/dist/components/new-trace-viewer/icons.js.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
- package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/new-trace-viewer/types.d.ts +0 -1
- package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/types.js +0 -2
- package/dist/components/new-trace-viewer/types.js.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
- package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.js +0 -2
- package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
- package/dist/components/new-trace-viewer/utils.d.ts +0 -42
- package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/utils.js +0 -305
- package/dist/components/new-trace-viewer/utils.js.map +0 -1
- package/dist/components/run-trace-view.d.ts +0 -25
- package/dist/components/run-trace-view.d.ts.map +0 -1
- package/dist/components/run-trace-view.js +0 -11
- 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.d.ts +0 -14
- package/dist/components/sidebar/detail-card.d.ts.map +0 -1
- package/dist/components/sidebar/detail-card.js +0 -20
- 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.d.ts +0 -8
- package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/map.js +0 -162
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.d.ts +0 -23
- package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/markers.js +0 -416
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.d.ts +0 -35
- package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/node.js +0 -285
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
- package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js +0 -9
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.d.ts +0 -3
- package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search.js +0 -25
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
- package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js +0 -137
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
- package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js +0 -445
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
- package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js +0 -108
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.d.ts +0 -28
- package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/ui.js +0 -39
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
- package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js +0 -29
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
- package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
- 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.d.ts +0 -5
- package/dist/components/trace-viewer/index.d.ts.map +0 -1
- package/dist/components/trace-viewer/index.js +0 -4
- 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/trace-viewer.module.css +0 -1465
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.d.ts +0 -9
- package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/constants.js +0 -9
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
- 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.d.ts +0 -13
- package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/tree.js +0 -227
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.d.ts +0 -2
- package/dist/components/trace-viewer/worker.d.ts.map +0 -1
- package/dist/components/trace-viewer/worker.js +0 -109
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/trace-viewer-new.d.ts.map +0 -1
- package/dist/components/trace-viewer-new.js +0 -23
- 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.d.ts +0 -95
- package/dist/components/ui/inspector-theme.d.ts.map +0 -1
- package/dist/components/ui/inspector-theme.js +0 -82
- 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.d.ts +0 -40
- package/dist/components/workflow-trace-view.d.ts.map +0 -1
- package/dist/components/workflow-trace-view.js +0 -695
- 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.d.ts +0 -15
- package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js +0 -87
- 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/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
- package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
- package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
- package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
- package/src/components/new-trace-viewer/context.tsx +0 -92
- package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
- package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
- package/src/components/new-trace-viewer/types.ts +0 -0
- package/src/components/new-trace-viewer/util/constants.ts +0 -0
- package/src/components/run-trace-view.tsx +0 -84
- package/src/components/sidebar/detail-card.tsx +0 -65
- package/src/components/trace-viewer/components/map.tsx +0 -226
- package/src/components/trace-viewer/components/markers.tsx +0 -612
- package/src/components/trace-viewer/components/node.tsx +0 -505
- package/src/components/trace-viewer/components/search-input.tsx +0 -52
- package/src/components/trace-viewer/components/search.tsx +0 -47
- package/src/components/trace-viewer/components/span-content.tsx +0 -247
- package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
- package/src/components/trace-viewer/components/span-segments.ts +0 -585
- package/src/components/trace-viewer/components/span-strategies.ts +0 -205
- package/src/components/trace-viewer/components/ui.tsx +0 -156
- package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
- package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
- package/src/components/trace-viewer/index.tsx +0 -4
- package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/src/components/trace-viewer/util/constants.ts +0 -8
- package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
- package/src/components/trace-viewer/util/tree.ts +0 -277
- package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
- package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
- package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
- package/src/components/trace-viewer/worker.ts +0 -131
- package/src/components/ui/inspector-theme.ts +0 -110
- package/src/components/workflow-trace-view.tsx +0 -1171
- package/src/components/workflow-traces/trace-colors.ts +0 -112
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
- /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { formatDuration, formatDurationPrecise, getHighResInMs, } from './util/timing';
|
|
2
|
+
export function computeRootBounds(spans) {
|
|
3
|
+
let minStart = Number.POSITIVE_INFINITY;
|
|
4
|
+
let maxEnd = Number.NEGATIVE_INFINITY;
|
|
5
|
+
for (const span of spans) {
|
|
6
|
+
const s = getHighResInMs(span.startTime);
|
|
7
|
+
const e = getHighResInMs(span.endTime);
|
|
8
|
+
if (s < minStart)
|
|
9
|
+
minStart = s;
|
|
10
|
+
if (e > maxEnd)
|
|
11
|
+
maxEnd = e;
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isFinite(minStart) || !Number.isFinite(maxEnd)) {
|
|
14
|
+
return { startTime: 0, endTime: 1, duration: 1 };
|
|
15
|
+
}
|
|
16
|
+
const duration = Math.max(maxEnd - minStart, 1);
|
|
17
|
+
return { startTime: minStart, endTime: maxEnd, duration };
|
|
18
|
+
}
|
|
19
|
+
export function getSpanDurationMs(span) {
|
|
20
|
+
return Math.max(0, getHighResInMs(span.endTime) - getHighResInMs(span.startTime));
|
|
21
|
+
}
|
|
22
|
+
export function isSpanErrored(span) {
|
|
23
|
+
const workflowStatus = span.attributes.data
|
|
24
|
+
?.status;
|
|
25
|
+
return span.status.code === 2 || workflowStatus === 'failed';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clamp a candidate viewport to the root extent. The requested duration is
|
|
29
|
+
* preserved where possible (clamped to [minDurationMs, root duration]), then
|
|
30
|
+
* the window is shifted back inside the root bounds.
|
|
31
|
+
*/
|
|
32
|
+
export function clampViewportToRoot(next, rootStart, rootEnd, minDurationMs) {
|
|
33
|
+
const rootDuration = Math.max(rootEnd - rootStart, minDurationMs);
|
|
34
|
+
const duration = Math.min(rootDuration, Math.max(minDurationMs, next.end - next.start));
|
|
35
|
+
const maxStart = rootEnd - duration;
|
|
36
|
+
const start = Math.min(Math.max(next.start, rootStart), maxStart);
|
|
37
|
+
return { start, end: start + duration };
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Wheel gestures — shared between the timeline and the minimap
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/** Convert a wheel delta to pixel units (line-mode deltas arrive in lines). */
|
|
43
|
+
export function wheelDeltaToPixels(delta, deltaMode) {
|
|
44
|
+
return deltaMode === 1 ? delta * 16 : delta;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Exponential zoom factor for a wheel gesture. Coarse mouse-wheel steps are
|
|
48
|
+
* damped harder than trackpad pinches so both feel similar.
|
|
49
|
+
*/
|
|
50
|
+
export function wheelZoomScaleFactor(event) {
|
|
51
|
+
const dy = wheelDeltaToPixels(event.deltaY, event.deltaMode);
|
|
52
|
+
const isMouseWheel = event.deltaMode === 1 || Math.abs(event.deltaY) >= 50;
|
|
53
|
+
return 2 ** (dy / (isMouseWheel ? 200 : 60));
|
|
54
|
+
}
|
|
55
|
+
const NICE_INTERVALS = [
|
|
56
|
+
1, 2, 5, 10, 20, 50, 100, 200, 500, 1_000, 2_000, 5_000, 10_000, 20_000,
|
|
57
|
+
50_000, 100_000, 200_000, 500_000, 1_000_000, 2_000_000, 5_000_000,
|
|
58
|
+
10_000_000, 20_000_000, 50_000_000, 100_000_000, 200_000_000, 500_000_000,
|
|
59
|
+
1_000_000_000, 2_000_000_000, 5_000_000_000,
|
|
60
|
+
];
|
|
61
|
+
const MAX_MARKERS = 8;
|
|
62
|
+
const MS_IN_SECOND = 1000;
|
|
63
|
+
function pickInterval(viewDuration, maxTicks) {
|
|
64
|
+
for (const interval of NICE_INTERVALS) {
|
|
65
|
+
if (viewDuration / interval <= maxTicks)
|
|
66
|
+
return interval;
|
|
67
|
+
}
|
|
68
|
+
return NICE_INTERVALS[NICE_INTERVALS.length - 1];
|
|
69
|
+
}
|
|
70
|
+
export function computeTimeMarkers(viewDuration, offset) {
|
|
71
|
+
if (viewDuration <= 0)
|
|
72
|
+
return [];
|
|
73
|
+
const maxTicks = 6;
|
|
74
|
+
const interval = pickInterval(viewDuration, maxTicks);
|
|
75
|
+
// Sub-second steps need fractional labels, or ticks past 1s collide as
|
|
76
|
+
// duplicate whole seconds ("…1s, 2s, 2s, 3s"). Scale decimals to the step.
|
|
77
|
+
const fractionDigits = interval >= MS_IN_SECOND
|
|
78
|
+
? 0
|
|
79
|
+
: Math.ceil(-Math.log10(interval / MS_IN_SECOND));
|
|
80
|
+
const firstTick = Math.ceil(offset / interval) * interval;
|
|
81
|
+
const markers = [];
|
|
82
|
+
for (let t = firstTick; t <= offset + viewDuration; t += interval) {
|
|
83
|
+
const position = (t - offset) / viewDuration;
|
|
84
|
+
if (position < -0.01 || position > 1.01)
|
|
85
|
+
continue;
|
|
86
|
+
markers.push({
|
|
87
|
+
position: Math.min(Math.max(position, 0), 1),
|
|
88
|
+
label: fractionDigits === 0
|
|
89
|
+
? formatDuration(Math.abs(t), true)
|
|
90
|
+
: formatDurationPrecise(Math.abs(t), fractionDigits),
|
|
91
|
+
value: t,
|
|
92
|
+
});
|
|
93
|
+
if (markers.length >= MAX_MARKERS)
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
return markers;
|
|
97
|
+
}
|
|
98
|
+
/** Project an absolute time onto the viewport as a clamped [0, 1] fraction. */
|
|
99
|
+
function toViewportFrac(ms, viewStart, range) {
|
|
100
|
+
return Math.min(Math.max((ms - viewStart) / range, 0), 1);
|
|
101
|
+
}
|
|
102
|
+
export function computeSpanGaps(spans, viewStart, viewEnd) {
|
|
103
|
+
const range = viewEnd - viewStart;
|
|
104
|
+
if (range <= 0)
|
|
105
|
+
return [];
|
|
106
|
+
const gaps = [];
|
|
107
|
+
for (let i = 0; i < spans.length - 1; i++) {
|
|
108
|
+
const endTime = getHighResInMs(spans[i].endTime);
|
|
109
|
+
const startTime = getHighResInMs(spans[i + 1].startTime);
|
|
110
|
+
const gapMs = startTime - endTime;
|
|
111
|
+
if (gapMs <= 0)
|
|
112
|
+
continue;
|
|
113
|
+
const leftFrac = toViewportFrac(endTime, viewStart, range);
|
|
114
|
+
const rightFrac = toViewportFrac(startTime, viewStart, range);
|
|
115
|
+
if (rightFrac - leftFrac < 0.001)
|
|
116
|
+
continue;
|
|
117
|
+
gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });
|
|
118
|
+
}
|
|
119
|
+
return gaps;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Measure the temporal delta between an anchor (selected) span and a hovered
|
|
123
|
+
* span for the Alt+hover measurement overlay. Ordering the two spans by start
|
|
124
|
+
* time (E = earlier-starting, L = later-starting), the measurement runs to
|
|
125
|
+
* L's start from E's end when the spans are disjoint ("how long after E ended
|
|
126
|
+
* did L start"), or from E's start when they overlap ("how long after E
|
|
127
|
+
* started did L start"). Fractions are clamped to the viewport like
|
|
128
|
+
* `computeSpanGaps`; `deltaMs` is always the true duration. Returns null when
|
|
129
|
+
* the measurement lies entirely outside the viewport.
|
|
130
|
+
*/
|
|
131
|
+
export function computeSpanDelta(anchor, hovered, viewStart, viewEnd) {
|
|
132
|
+
const range = viewEnd - viewStart;
|
|
133
|
+
if (range <= 0)
|
|
134
|
+
return null;
|
|
135
|
+
const anchorStart = getHighResInMs(anchor.startTime);
|
|
136
|
+
const hoveredStart = getHighResInMs(hovered.startTime);
|
|
137
|
+
const anchorIsEarlier = anchorStart <= hoveredStart;
|
|
138
|
+
const earlierStart = anchorIsEarlier ? anchorStart : hoveredStart;
|
|
139
|
+
const earlierEnd = getHighResInMs(anchorIsEarlier ? anchor.endTime : hovered.endTime);
|
|
140
|
+
const laterStart = anchorIsEarlier ? hoveredStart : anchorStart;
|
|
141
|
+
const originMs = earlierEnd <= laterStart ? earlierEnd : earlierStart;
|
|
142
|
+
const deltaMs = laterStart - originMs;
|
|
143
|
+
// Entirely outside the viewport. Compared in time-space (not clamped
|
|
144
|
+
// fractions) so a zero-delta point sitting exactly on a viewport edge —
|
|
145
|
+
// e.g. the root span selected at default zoom — still renders.
|
|
146
|
+
if (laterStart < viewStart || originMs > viewEnd) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const originFrac = toViewportFrac(originMs, viewStart, range);
|
|
150
|
+
const laterFrac = toViewportFrac(laterStart, viewStart, range);
|
|
151
|
+
const hoveredEnd = getHighResInMs(hovered.endTime);
|
|
152
|
+
return {
|
|
153
|
+
deltaMs,
|
|
154
|
+
anchorFrac: anchorIsEarlier ? originFrac : laterFrac,
|
|
155
|
+
hoveredFrac: anchorIsEarlier ? laterFrac : originFrac,
|
|
156
|
+
anchorEdge: anchorIsEarlier && earlierEnd <= laterStart ? 'end' : 'start',
|
|
157
|
+
hoveredOffscreen: hoveredStart > viewEnd ? 'right' : hoveredEnd < viewStart ? 'left' : null,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Resource colors
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
export const RESOURCE_COLORS = {
|
|
164
|
+
run: {
|
|
165
|
+
bg: 'var(--ds-blue-200)',
|
|
166
|
+
border: 'var(--ds-blue-500)',
|
|
167
|
+
errorBg: 'var(--ds-red-200)',
|
|
168
|
+
errorBorder: 'var(--ds-red-500)',
|
|
169
|
+
},
|
|
170
|
+
step: {
|
|
171
|
+
bg: 'var(--ds-green-200)',
|
|
172
|
+
border: 'var(--ds-green-500)',
|
|
173
|
+
errorBg: 'var(--ds-red-200)',
|
|
174
|
+
errorBorder: 'var(--ds-red-500)',
|
|
175
|
+
},
|
|
176
|
+
// Passive spans (hooks) stay gray — matches event-list icons and the minimap.
|
|
177
|
+
hook: {
|
|
178
|
+
bg: 'var(--ds-gray-200)',
|
|
179
|
+
border: 'var(--ds-gray-500)',
|
|
180
|
+
errorBg: 'var(--ds-red-200)',
|
|
181
|
+
errorBorder: 'var(--ds-red-500)',
|
|
182
|
+
},
|
|
183
|
+
sleep: {
|
|
184
|
+
bg: 'var(--ds-purple-200)',
|
|
185
|
+
border: 'var(--ds-purple-500)',
|
|
186
|
+
errorBg: 'var(--ds-red-200)',
|
|
187
|
+
errorBorder: 'var(--ds-red-500)',
|
|
188
|
+
},
|
|
189
|
+
default: {
|
|
190
|
+
bg: 'var(--ds-gray-200)',
|
|
191
|
+
border: 'var(--ds-gray-500)',
|
|
192
|
+
errorBg: 'var(--ds-red-200)',
|
|
193
|
+
errorBorder: 'var(--ds-red-500)',
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
export function getResourceColor(resource) {
|
|
197
|
+
return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;
|
|
198
|
+
}
|
|
199
|
+
function clampFraction(value) {
|
|
200
|
+
return Math.max(0, Math.min(1, value));
|
|
201
|
+
}
|
|
202
|
+
function timeToFraction(time, spanStart, spanDuration) {
|
|
203
|
+
if (spanDuration <= 0)
|
|
204
|
+
return 0;
|
|
205
|
+
return clampFraction((time - spanStart) / spanDuration);
|
|
206
|
+
}
|
|
207
|
+
function sortedEventMarks(events, relevantNames) {
|
|
208
|
+
return events
|
|
209
|
+
.filter((e) => relevantNames.includes(e.name))
|
|
210
|
+
.map((e) => ({ time: getHighResInMs(e.timestamp), type: e.name }))
|
|
211
|
+
.sort((a, b) => a.time - b.time);
|
|
212
|
+
}
|
|
213
|
+
function computeStepSegmentsFromSpan(startMs, duration, events) {
|
|
214
|
+
const segments = [];
|
|
215
|
+
if (duration <= 0)
|
|
216
|
+
return segments;
|
|
217
|
+
const marks = sortedEventMarks(events, [
|
|
218
|
+
'step_started',
|
|
219
|
+
'step_retrying',
|
|
220
|
+
'step_failed',
|
|
221
|
+
'step_completed',
|
|
222
|
+
]);
|
|
223
|
+
if (marks.length === 0) {
|
|
224
|
+
segments.push({ startFraction: 0, endFraction: 1, status: 'queued' });
|
|
225
|
+
return segments;
|
|
226
|
+
}
|
|
227
|
+
const firstFraction = timeToFraction(marks[0].time, startMs, duration);
|
|
228
|
+
if (firstFraction > 0.001) {
|
|
229
|
+
segments.push({
|
|
230
|
+
startFraction: 0,
|
|
231
|
+
endFraction: firstFraction,
|
|
232
|
+
status: 'queued',
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
for (let i = 0; i < marks.length; i++) {
|
|
236
|
+
const mark = marks[i];
|
|
237
|
+
const markFrac = timeToFraction(mark.time, startMs, duration);
|
|
238
|
+
const nextMark = marks[i + 1];
|
|
239
|
+
const nextFrac = nextMark
|
|
240
|
+
? timeToFraction(nextMark.time, startMs, duration)
|
|
241
|
+
: 1;
|
|
242
|
+
if (mark.type === 'step_started') {
|
|
243
|
+
if (i === marks.length - 1) {
|
|
244
|
+
segments.push({
|
|
245
|
+
startFraction: markFrac,
|
|
246
|
+
endFraction: 1,
|
|
247
|
+
status: 'succeeded',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
const nextType = nextMark.type;
|
|
252
|
+
const attemptStatus = nextType === 'step_retrying' || nextType === 'step_failed'
|
|
253
|
+
? 'failed'
|
|
254
|
+
: nextType === 'step_completed'
|
|
255
|
+
? 'succeeded'
|
|
256
|
+
: 'retrying';
|
|
257
|
+
segments.push({
|
|
258
|
+
startFraction: markFrac,
|
|
259
|
+
endFraction: nextFrac,
|
|
260
|
+
status: attemptStatus,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else if (mark.type === 'step_retrying') {
|
|
265
|
+
segments.push({
|
|
266
|
+
startFraction: markFrac,
|
|
267
|
+
endFraction: nextFrac,
|
|
268
|
+
status: 'retrying',
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else if (mark.type === 'step_failed') {
|
|
272
|
+
if (markFrac < 0.999) {
|
|
273
|
+
segments.push({
|
|
274
|
+
startFraction: markFrac,
|
|
275
|
+
endFraction: 1,
|
|
276
|
+
status: 'failed',
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return segments;
|
|
282
|
+
}
|
|
283
|
+
function computeHookSegmentsFromSpan(startMs, duration, events) {
|
|
284
|
+
const segments = [];
|
|
285
|
+
if (duration <= 0)
|
|
286
|
+
return segments;
|
|
287
|
+
const disposed = sortedEventMarks(events, ['hook_disposed'])[0];
|
|
288
|
+
const disposedFrac = disposed
|
|
289
|
+
? timeToFraction(disposed.time, startMs, duration)
|
|
290
|
+
: null;
|
|
291
|
+
const waitingEnd = disposedFrac ?? 1;
|
|
292
|
+
if (waitingEnd > 0.001) {
|
|
293
|
+
segments.push({
|
|
294
|
+
startFraction: 0,
|
|
295
|
+
endFraction: waitingEnd,
|
|
296
|
+
status: 'waiting',
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
if (disposedFrac !== null && disposedFrac < 0.999) {
|
|
300
|
+
segments.push({
|
|
301
|
+
startFraction: disposedFrac,
|
|
302
|
+
endFraction: 1,
|
|
303
|
+
status: 'succeeded',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return segments;
|
|
307
|
+
}
|
|
308
|
+
function computeSleepSegmentsFromSpan(_startMs, duration, _events) {
|
|
309
|
+
if (duration <= 0)
|
|
310
|
+
return [];
|
|
311
|
+
return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];
|
|
312
|
+
}
|
|
313
|
+
function runSegmentStatus(runStatus) {
|
|
314
|
+
if (runStatus === 'failed')
|
|
315
|
+
return 'failed';
|
|
316
|
+
if (runStatus === 'pending')
|
|
317
|
+
return 'pending';
|
|
318
|
+
if (runStatus === 'running')
|
|
319
|
+
return 'running';
|
|
320
|
+
return 'completed';
|
|
321
|
+
}
|
|
322
|
+
function computeRunSegmentsFromSpan(startMs, duration, activeStartMs, events, attributes) {
|
|
323
|
+
const segments = [];
|
|
324
|
+
if (duration <= 0)
|
|
325
|
+
return segments;
|
|
326
|
+
const sorted = [...events]
|
|
327
|
+
.map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))
|
|
328
|
+
.sort((a, b) => a.time - b.time);
|
|
329
|
+
const runData = attributes?.data;
|
|
330
|
+
const runStatus = runData?.status;
|
|
331
|
+
const hasRunCreated = sorted.some((e) => e.name === 'run_created');
|
|
332
|
+
if (!hasRunCreated) {
|
|
333
|
+
return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);
|
|
334
|
+
}
|
|
335
|
+
const failedEvent = sorted.find((e) => e.name === 'run_failed');
|
|
336
|
+
let cursor = 0;
|
|
337
|
+
if (activeStartMs !== undefined && activeStartMs > startMs) {
|
|
338
|
+
const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
|
|
339
|
+
if (queuedFrac > 0.001) {
|
|
340
|
+
segments.push({
|
|
341
|
+
startFraction: 0,
|
|
342
|
+
endFraction: queuedFrac,
|
|
343
|
+
status: 'queued',
|
|
344
|
+
});
|
|
345
|
+
cursor = queuedFrac;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
segments.push({
|
|
349
|
+
startFraction: cursor,
|
|
350
|
+
endFraction: 1,
|
|
351
|
+
status: failedEvent ? 'failed' : runSegmentStatus(runStatus),
|
|
352
|
+
});
|
|
353
|
+
return segments;
|
|
354
|
+
}
|
|
355
|
+
function computeV1RunSegments(startMs, duration, activeStartMs, runStatus) {
|
|
356
|
+
const segments = [];
|
|
357
|
+
let cursor = 0;
|
|
358
|
+
if (activeStartMs !== undefined && activeStartMs > startMs) {
|
|
359
|
+
const queuedFrac = timeToFraction(activeStartMs, startMs, duration);
|
|
360
|
+
if (queuedFrac > 0.001) {
|
|
361
|
+
segments.push({
|
|
362
|
+
startFraction: 0,
|
|
363
|
+
endFraction: queuedFrac,
|
|
364
|
+
status: 'queued',
|
|
365
|
+
});
|
|
366
|
+
cursor = queuedFrac;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
segments.push({
|
|
370
|
+
startFraction: cursor,
|
|
371
|
+
endFraction: 1,
|
|
372
|
+
status: runSegmentStatus(runStatus),
|
|
373
|
+
});
|
|
374
|
+
return segments;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Compute event-based segments for a span. Dispatches on `span.resource`
|
|
378
|
+
* to the appropriate resource-type-specific segment builder.
|
|
379
|
+
* Returns an empty array for generic (non-workflow) spans.
|
|
380
|
+
*/
|
|
381
|
+
export function computeSpanSegments(span) {
|
|
382
|
+
const startMs = getHighResInMs(span.startTime);
|
|
383
|
+
const duration = getSpanDurationMs(span);
|
|
384
|
+
const activeStartMs = span.activeStartTime
|
|
385
|
+
? getHighResInMs(span.activeStartTime)
|
|
386
|
+
: undefined;
|
|
387
|
+
switch (span.resource) {
|
|
388
|
+
case 'step':
|
|
389
|
+
return computeStepSegmentsFromSpan(startMs, duration, span.events);
|
|
390
|
+
case 'hook':
|
|
391
|
+
return computeHookSegmentsFromSpan(startMs, duration, span.events);
|
|
392
|
+
case 'sleep':
|
|
393
|
+
return computeSleepSegmentsFromSpan(startMs, duration, span.events);
|
|
394
|
+
case 'run':
|
|
395
|
+
return computeRunSegmentsFromSpan(startMs, duration, activeStartMs, span.events, span.attributes);
|
|
396
|
+
default:
|
|
397
|
+
return [];
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// `hook_received` = a resumption; `attr_set` = attributes written mid-span.
|
|
401
|
+
const MARKER_EVENT_NAMES = ['hook_received', 'attr_set'];
|
|
402
|
+
export function computeSpanMarkers(span) {
|
|
403
|
+
return sortedEventMarks(span.events, MARKER_EVENT_NAMES).map((mark) => ({
|
|
404
|
+
timeMs: mark.time,
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
407
|
+
/** Partition markers outside `[visibleStartMs, visibleEndMs]` by side. */
|
|
408
|
+
export function computeOffscreenMarkers(markers, visibleStartMs, visibleEndMs) {
|
|
409
|
+
let leftCount = 0;
|
|
410
|
+
let rightCount = 0;
|
|
411
|
+
let nearestLeft = Number.NEGATIVE_INFINITY;
|
|
412
|
+
let nearestRight = Number.POSITIVE_INFINITY;
|
|
413
|
+
for (const { timeMs } of markers) {
|
|
414
|
+
if (timeMs < visibleStartMs) {
|
|
415
|
+
leftCount++;
|
|
416
|
+
if (timeMs > nearestLeft)
|
|
417
|
+
nearestLeft = timeMs;
|
|
418
|
+
}
|
|
419
|
+
else if (timeMs > visibleEndMs) {
|
|
420
|
+
rightCount++;
|
|
421
|
+
if (timeMs < nearestRight)
|
|
422
|
+
nearestRight = timeMs;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
left: leftCount > 0 ? { count: leftCount, nearestMs: nearestLeft } : null,
|
|
427
|
+
right: rightCount > 0 ? { count: rightCount, nearestMs: nearestRight } : null,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy90cmFjZS12aWV3ZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsY0FBYyxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBWXZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUN4QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFFdEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsUUFBUTtZQUFFLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsTUFBTTtZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFR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QUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN6RSxLQUFLLEVBQ0gsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtLQUN6RSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhbiwgU3BhbkV2ZW50IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBmb3JtYXREdXJhdGlvbixcbiAgZm9ybWF0RHVyYXRpb25QcmVjaXNlLFxuICBnZXRIaWdoUmVzSW5Ncyxcbn0gZnJvbSAnLi91dGlsL3RpbWluZyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUm9vdCBib3VuZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RCb3VuZHMge1xuICBzdGFydFRpbWU6IG51bWJlcjtcbiAgZW5kVGltZTogbnVtYmVyO1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJvb3RCb3VuZHMoc3BhbnM6IFNwYW5bXSk6IFJvb3RCb3VuZHMge1xuICBsZXQgbWluU3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGxldCBtYXhFbmQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgZm9yIChjb25zdCBzcGFuIG9mIHNwYW5zKSB7XG4gICAgY29uc3QgcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKTtcbiAgICBjb25zdCBlID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5lbmRUaW1lKTtcbiAgICBpZiAocyA8IG1pblN0YXJ0KSBtaW5TdGFydCA9IHM7XG4gICAgaWYgKGUgPiBtYXhFbmQpIG1heEVuZCA9IGU7XG4gIH1cblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShtaW5TdGFydCkgfHwgIU51bWJlci5pc0Zpbml0ZShtYXhFbmQpKSB7XG4gICAgcmV0dXJuIHsgc3RhcnRUaW1lOiAwLCBlbmRUaW1lOiAxLCBkdXJhdGlvbjogMSB9O1xuICB9XG5cbiAgY29uc3QgZHVyYXRpb24gPSBNYXRoLm1heChtYXhFbmQgLSBtaW5TdGFydCwgMSk7XG4gIHJldHVybiB7IHN0YXJ0VGltZTogbWluU3RhcnQsIGVuZFRpbWU6IG1heEVuZCwgZHVyYXRpb24gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYW5EdXJhdGlvbk1zKHNwYW46IFNwYW4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoXG4gICAgMCxcbiAgICBnZXRIaWdoUmVzSW5NcyhzcGFuLmVuZFRpbWUpIC0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NwYW5FcnJvcmVkKHNwYW46IFNwYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgd29ya2Zsb3dTdGF0dXMgPSAoc3Bhbi5hdHRyaWJ1dGVzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgPy5zdGF0dXMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gc3Bhbi5zdGF0dXMuY29kZSA9PT0gMiB8fCB3b3JrZmxvd1N0YXR1cyA9PT0gJ2ZhaWxlZCc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVmlld3BvcnRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdwb3J0UmFuZ2Uge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDbGFtcCBhIGNhbmRpZGF0ZSB2aWV3cG9ydCB0byB0aGUgcm9vdCBleHRlbnQuIFRoZSByZXF1ZXN0ZWQgZHVyYXRpb24gaXNcbiAqIHByZXNlcnZlZCB3aGVyZSBwb3NzaWJsZSAoY2xhbXBlZCB0byBbbWluRHVyYXRpb25Ncywgcm9vdCBkdXJhdGlvbl0pLCB0aGVuXG4gKiB0aGUgd2luZG93IGlzIHNoaWZ0ZWQgYmFjayBpbnNpZGUgdGhlIHJvb3QgYm91bmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXBWaWV3cG9ydFRvUm9vdChcbiAgbmV4dDogVmlld3BvcnRSYW5nZSxcbiAgcm9vdFN0YXJ0OiBudW1iZXIsXG4gIHJvb3RFbmQ6IG51bWJlcixcbiAgbWluRHVyYXRpb25NczogbnVtYmVyXG4pOiBWaWV3cG9ydFJhbmdlIHtcbiAgY29uc3Qgcm9vdER1cmF0aW9uID0gTWF0aC5tYXgocm9vdEVuZCAtIHJvb3RTdGFydCwgbWluRHVyYXRpb25Ncyk7XG4gIGNvbnN0IGR1cmF0aW9uID0gTWF0aC5taW4oXG4gICAgcm9vdER1cmF0aW9uLFxuICAgIE1hdGgubWF4KG1pbkR1cmF0aW9uTXMsIG5leHQuZW5kIC0gbmV4dC5zdGFydClcbiAgKTtcbiAgY29uc3QgbWF4U3RhcnQgPSByb290RW5kIC0gZHVyYXRpb247XG4gIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oTWF0aC5tYXgobmV4dC5zdGFydCwgcm9vdFN0YXJ0KSwgbWF4U3RhcnQpO1xuICByZXR1cm4geyBzdGFydCwgZW5kOiBzdGFydCArIGR1cmF0aW9uIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2hlZWwgZ2VzdHVyZXMg4oCUIHNoYXJlZCBiZXR3ZWVuIHRoZSB0aW1lbGluZSBhbmQgdGhlIG1pbmltYXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ29udmVydCBhIHdoZWVsIGRlbHRhIHRvIHBpeGVsIHVuaXRzIChsaW5lLW1vZGUgZGVsdGFzIGFycml2ZSBpbiBsaW5lcykuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlZWxEZWx0YVRvUGl4ZWxzKGRlbHRhOiBudW1iZXIsIGRlbHRhTW9kZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGRlbHRhTW9kZSA9PT0gMSA/IGRlbHRhICogMTYgOiBkZWx0YTtcbn1cblxuLyoqXG4gKiBFeHBvbmVudGlhbCB6b29tIGZhY3RvciBmb3IgYSB3aGVlbCBnZXN0dXJlLiBDb2Fyc2UgbW91c2Utd2hlZWwgc3RlcHMgYXJlXG4gKiBkYW1wZWQgaGFyZGVyIHRoYW4gdHJhY2twYWQgcGluY2hlcyBzbyBib3RoIGZlZWwgc2ltaWxhci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdoZWVsWm9vbVNjYWxlRmFjdG9yKGV2ZW50OiB7XG4gIGRlbHRhWTogbnVtYmVyO1xuICBkZWx0YU1vZGU6IG51bWJlcjtcbn0pOiBudW1iZXIge1xuICBjb25zdCBkeSA9IHdoZWVsRGVsdGFUb1BpeGVscyhldmVudC5kZWx0YVksIGV2ZW50LmRlbHRhTW9kZSk7XG4gIGNvbnN0IGlzTW91c2VXaGVlbCA9IGV2ZW50LmRlbHRhTW9kZSA9PT0gMSB8fCBNYXRoLmFicyhldmVudC5kZWx0YVkpID49IDUwO1xuICByZXR1cm4gMiAqKiAoZHkgLyAoaXNNb3VzZVdoZWVsID8gMjAwIDogNjApKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lIG1hcmtlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVNYXJrZXIge1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG5jb25zdCBOSUNFX0lOVEVSVkFMUyA9IFtcbiAgMSwgMiwgNSwgMTAsIDIwLCA1MCwgMTAwLCAyMDAsIDUwMCwgMV8wMDAsIDJfMDAwLCA1XzAwMCwgMTBfMDAwLCAyMF8wMDAsXG4gIDUwXzAwMCwgMTAwXzAwMCwgMjAwXzAwMCwgNTAwXzAwMCwgMV8wMDBfMDAwLCAyXzAwMF8wMDAsIDVfMDAwXzAwMCxcbiAgMTBfMDAwXzAwMCwgMjBfMDAwXzAwMCwgNTBfMDAwXzAwMCwgMTAwXzAwMF8wMDAsIDIwMF8wMDBfMDAwLCA1MDBfMDAwXzAwMCxcbiAgMV8wMDBfMDAwXzAwMCwgMl8wMDBfMDAwXzAwMCwgNV8wMDBfMDAwXzAwMCxcbl07XG5cbmNvbnN0IE1BWF9NQVJLRVJTID0gODtcblxuY29uc3QgTVNfSU5fU0VDT05EID0gMTAwMDtcblxuZnVuY3Rpb24gcGlja0ludGVydmFsKHZpZXdEdXJhdGlvbjogbnVtYmVyLCBtYXhUaWNrczogbnVtYmVyKTogbnVtYmVyIHtcbiAgZm9yIChjb25zdCBpbnRlcnZhbCBvZiBOSUNFX0lOVEVSVkFMUykge1xuICAgIGlmICh2aWV3RHVyYXRpb24gLyBpbnRlcnZhbCA8PSBtYXhUaWNrcykgcmV0dXJuIGludGVydmFsO1xuICB9XG4gIHJldHVybiBOSUNFX0lOVEVSVkFMU1tOSUNFX0lOVEVSVkFMUy5sZW5ndGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVUaW1lTWFya2VycyhcbiAgdmlld0R1cmF0aW9uOiBudW1iZXIsXG4gIG9mZnNldDogbnVtYmVyXG4pOiBUaW1lTWFya2VyW10ge1xuICBpZiAodmlld0R1cmF0aW9uIDw9IDApIHJldHVybiBbXTtcblxuICBjb25zdCBtYXhUaWNrcyA9IDY7XG4gIGNvbnN0IGludGVydmFsID0gcGlja0ludGVydmFsKHZpZXdEdXJhdGlvbiwgbWF4VGlja3MpO1xuXG4gIC8vIFN1Yi1zZWNvbmQgc3RlcHMgbmVlZCBmcmFjdGlvbmFsIGxhYmVscywgb3IgdGlja3MgcGFzdCAxcyBjb2xsaWRlIGFzXG4gIC8vIGR1cGxpY2F0ZSB3aG9sZSBzZWNvbmRzIChcIuKApjFzLCAycywgMnMsIDNzXCIpLiBTY2FsZSBkZWNpbWFscyB0byB0aGUgc3RlcC5cbiAgY29uc3QgZnJhY3Rpb25EaWdpdHMgPVxuICAgIGludGVydmFsID49IE1TX0lOX1NFQ09ORFxuICAgICAgPyAwXG4gICAgICA6IE1hdGguY2VpbCgtTWF0aC5sb2cxMChpbnRlcnZhbCAvIE1TX0lOX1NFQ09ORCkpO1xuXG4gIGNvbnN0IGZpcnN0VGljayA9IE1hdGguY2VpbChvZmZzZXQgLyBpbnRlcnZhbCkgKiBpbnRlcnZhbDtcbiAgY29uc3QgbWFya2VyczogVGltZU1hcmtlcltdID0gW107XG5cbiAgZm9yIChsZXQgdCA9IGZpcnN0VGljazsgdCA8PSBvZmZzZXQgKyB2aWV3RHVyYXRpb247IHQgKz0gaW50ZXJ2YWwpIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9ICh0IC0gb2Zmc2V0KSAvIHZpZXdEdXJhdGlvbjtcbiAgICBpZiAocG9zaXRpb24gPCAtMC4wMSB8fCBwb3NpdGlvbiA+IDEuMDEpIGNvbnRpbnVlO1xuICAgIG1hcmtlcnMucHVzaCh7XG4gICAgICBwb3NpdGlvbjogTWF0aC5taW4oTWF0aC5tYXgocG9zaXRpb24sIDApLCAxKSxcbiAgICAgIGxhYmVsOlxuICAgICAgICBmcmFjdGlvbkRpZ2l0cyA9PT0gMFxuICAgICAgICAgID8gZm9ybWF0RHVyYXRpb24oTWF0aC5hYnModCksIHRydWUpXG4gICAgICAgICAgOiBmb3JtYXREdXJhdGlvblByZWNpc2UoTWF0aC5hYnModCksIGZyYWN0aW9uRGlnaXRzKSxcbiAgICAgIHZhbHVlOiB0LFxuICAgIH0pO1xuICAgIGlmIChtYXJrZXJzLmxlbmd0aCA+PSBNQVhfTUFSS0VSUykgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbWFya2Vycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTcGFuIGdhcHMg4oCUIHRpbWUgZGVsdGFzIGJldHdlZW4gY29uc2VjdXRpdmUgc3BhbnMgKEFsdC1rZXkgb3ZlcmxheSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYW5HYXAge1xuICBnYXBNczogbnVtYmVyO1xuICBsZWZ0RnJhYzogbnVtYmVyO1xuICByaWdodEZyYWM6IG51bWJlcjtcbiAgcm93SW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIFByb2plY3QgYW4gYWJzb2x1dGUgdGltZSBvbnRvIHRoZSB2aWV3cG9ydCBhcyBhIGNsYW1wZWQgWzAsIDFdIGZyYWN0aW9uLiAqL1xuZnVuY3Rpb24gdG9WaWV3cG9ydEZyYWMobXM6IG51bWJlciwgdmlld1N0YXJ0OiBudW1iZXIsIHJhbmdlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoKG1zIC0gdmlld1N0YXJ0KSAvIHJhbmdlLCAwKSwgMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3BhbkdhcHMoXG4gIHNwYW5zOiBTcGFuW10sXG4gIHZpZXdTdGFydDogbnVtYmVyLFxuICB2aWV3RW5kOiBudW1iZXJcbik6IFNwYW5HYXBbXSB7XG4gIGNvbnN0IHJhbmdlID0gdmlld0VuZCAtIHZpZXdTdGFydDtcbiAgaWYgKHJhbmdlIDw9IDApIHJldHVybiBbXTtcblxuICBjb25zdCBnYXBzOiBTcGFuR2FwW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBlbmRUaW1lID0gZ2V0SGlnaFJlc0luTXMoc3BhbnNbaV0uZW5kVGltZSk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gZ2V0SGlnaFJlc0luTXMoc3BhbnNbaSArIDFdLnN0YXJ0VGltZSk7XG4gICAgY29uc3QgZ2FwTXMgPSBzdGFydFRpbWUgLSBlbmRUaW1lO1xuICAgIGlmIChnYXBNcyA8PSAwKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGxlZnRGcmFjID0gdG9WaWV3cG9ydEZyYWMoZW5kVGltZSwgdmlld1N0YXJ0LCByYW5nZSk7XG4gICAgY29uc3QgcmlnaHRGcmFjID0gdG9WaWV3cG9ydEZyYWMoc3RhcnRUaW1lLCB2aWV3U3RhcnQsIHJhbmdlKTtcbiAgICBpZiAocmlnaHRGcmFjIC0gbGVmdEZyYWMgPCAwLjAwMSkgY29udGludWU7XG5cbiAgICBnYXBzLnB1c2goeyBnYXBNcywgbGVmdEZyYWMsIHJpZ2h0RnJhYywgcm93SW5kZXg6IGkgfSk7XG4gIH1cbiAgcmV0dXJuIGdhcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BhbkRlbHRhIHtcbiAgLyoqIFRydWUgbWVhc3VyZWQgdGltZSBiZXR3ZWVuIHRoZSB0d28gc3BhbnMsIHVuYWZmZWN0ZWQgYnkgY2xhbXBpbmcuICovXG4gIGRlbHRhTXM6IG51bWJlcjtcbiAgLyoqIFZpZXdwb3J0LWNsYW1wZWQgZnJhY3Rpb24gb2YgdGhlIGFuY2hvciBzcGFuJ3MgbWVhc3VyZWQgZWRnZS4gKi9cbiAgYW5jaG9yRnJhYzogbnVtYmVyO1xuICAvKiogVmlld3BvcnQtY2xhbXBlZCBmcmFjdGlvbiBvZiB0aGUgaG92ZXJlZCBzcGFuJ3MgbWVhc3VyZWQgZWRnZS4gKi9cbiAgaG92ZXJlZEZyYWM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoaWNoIGVkZ2Ugb2YgdGhlIGFuY2hvciBzcGFuIHRoZSBtZWFzdXJlbWVudCBydW5zIGZyb206IGl0cyBlbmQgd2hlbiB0aGVcbiAgICogc3BhbnMgYXJlIGRpc2pvaW50IGFuZCB0aGUgYW5jaG9yIGNvbWVzIGZpcnN0LCBvdGhlcndpc2UgaXRzIHN0YXJ0LlxuICAgKi9cbiAgYW5jaG9yRWRnZTogJ3N0YXJ0JyB8ICdlbmQnO1xuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIGhvdmVyZWQgc3BhbiBsaWVzIGVudGlyZWx5IG91dHNpZGUgdGhlIHZpZXdwb3J0IG9uIG9uZSBzaWRlLFxuICAgKiBpLmUuIGl0cyByb3cgcmVuZGVycyBhbiBvZmYtc2NyZWVuIGFycm93IHRoZSBsaW5lIHNob3VsZCBzdG9wIHNob3J0IG9mLlxuICAgKi9cbiAgaG92ZXJlZE9mZnNjcmVlbjogJ2xlZnQnIHwgJ3JpZ2h0JyB8IG51bGw7XG59XG5cbi8qKlxuICogTWVhc3VyZSB0aGUgdGVtcG9yYWwgZGVsdGEgYmV0d2VlbiBhbiBhbmNob3IgKHNlbGVjdGVkKSBzcGFuIGFuZCBhIGhvdmVyZWRcbiAqIHNwYW4gZm9yIHRoZSBBbHQraG92ZXIgbWVhc3VyZW1lbnQgb3ZlcmxheS4gT3JkZXJpbmcgdGhlIHR3byBzcGFucyBieSBzdGFydFxuICogdGltZSAoRSA9IGVhcmxpZXItc3RhcnRpbmcsIEwgPSBsYXRlci1zdGFydGluZyksIHRoZSBtZWFzdXJlbWVudCBydW5zIHRvXG4gKiBMJ3Mgc3RhcnQgZnJvbSBFJ3MgZW5kIHdoZW4gdGhlIHNwYW5zIGFyZSBkaXNqb2ludCAoXCJob3cgbG9uZyBhZnRlciBFIGVuZGVkXG4gKiBkaWQgTCBzdGFydFwiKSwgb3IgZnJvbSBFJ3Mgc3RhcnQgd2hlbiB0aGV5IG92ZXJsYXAgKFwiaG93IGxvbmcgYWZ0ZXIgRVxuICogc3RhcnRlZCBkaWQgTCBzdGFydFwiKS4gRnJhY3Rpb25zIGFyZSBjbGFtcGVkIHRvIHRoZSB2aWV3cG9ydCBsaWtlXG4gKiBgY29tcHV0ZVNwYW5HYXBzYDsgYGRlbHRhTXNgIGlzIGFsd2F5cyB0aGUgdHJ1ZSBkdXJhdGlvbi4gUmV0dXJucyBudWxsIHdoZW5cbiAqIHRoZSBtZWFzdXJlbWVudCBsaWVzIGVudGlyZWx5IG91dHNpZGUgdGhlIHZpZXdwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNwYW5EZWx0YShcbiAgYW5jaG9yOiBTcGFuLFxuICBob3ZlcmVkOiBTcGFuLFxuICB2aWV3U3RhcnQ6IG51bWJlcixcbiAgdmlld0VuZDogbnVtYmVyXG4pOiBTcGFuRGVsdGEgfCBudWxsIHtcbiAgY29uc3QgcmFuZ2UgPSB2aWV3RW5kIC0gdmlld1N0YXJ0O1xuICBpZiAocmFuZ2UgPD0gMCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgYW5jaG9yU3RhcnQgPSBnZXRIaWdoUmVzSW5NcyhhbmNob3Iuc3RhcnRUaW1lKTtcbiAgY29uc3QgaG92ZXJlZFN0YXJ0ID0gZ2V0SGlnaFJlc0luTXMoaG92ZXJlZC5zdGFydFRpbWUpO1xuICBjb25zdCBhbmNob3JJc0VhcmxpZXIgPSBhbmNob3JTdGFydCA8PSBob3ZlcmVkU3RhcnQ7XG4gIGNvbnN0IGVhcmxpZXJTdGFydCA9IGFuY2hvcklzRWFybGllciA/IGFuY2hvclN0YXJ0IDogaG92ZXJlZFN0YXJ0O1xuICBjb25zdCBlYXJsaWVyRW5kID0gZ2V0SGlnaFJlc0luTXMoXG4gICAgYW5jaG9ySXNFYXJsaWVyID8gYW5jaG9yLmVuZFRpbWUgOiBob3ZlcmVkLmVuZFRpbWVcbiAgKTtcbiAgY29uc3QgbGF0ZXJTdGFydCA9IGFuY2hvcklzRWFybGllciA/IGhvdmVyZWRTdGFydCA6IGFuY2hvclN0YXJ0O1xuXG4gIGNvbnN0IG9yaWdpbk1zID0gZWFybGllckVuZCA8PSBsYXRlclN0YXJ0ID8gZWFybGllckVuZCA6IGVhcmxpZXJTdGFydDtcbiAgY29uc3QgZGVsdGFNcyA9IGxhdGVyU3RhcnQgLSBvcmlnaW5NcztcblxuICAvLyBFbnRpcmVseSBvdXRzaWRlIHRoZSB2aWV3cG9ydC4gQ29tcGFyZWQgaW4gdGltZS1zcGFjZSAobm90IGNsYW1wZWRcbiAgLy8gZnJhY3Rpb25zKSBzbyBhIHplcm8tZGVsdGEgcG9pbnQgc2l0dGluZyBleGFjdGx5IG9uIGEgdmlld3BvcnQgZWRnZSDigJRcbiAgLy8gZS5nLiB0aGUgcm9vdCBzcGFuIHNlbGVjdGVkIGF0IGRlZmF1bHQgem9vbSDigJQgc3RpbGwgcmVuZGVycy5cbiAgaWYgKGxhdGVyU3RhcnQgPCB2aWV3U3RhcnQgfHwgb3JpZ2luTXMgPiB2aWV3RW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvcmlnaW5GcmFjID0gdG9WaWV3cG9ydEZyYWMob3JpZ2luTXMsIHZpZXdTdGFydCwgcmFuZ2UpO1xuICBjb25zdCBsYXRlckZyYWMgPSB0b1ZpZXdwb3J0RnJhYyhsYXRlclN0YXJ0LCB2aWV3U3RhcnQsIHJhbmdlKTtcblxuICBjb25zdCBob3ZlcmVkRW5kID0gZ2V0SGlnaFJlc0luTXMoaG92ZXJlZC5lbmRUaW1lKTtcblxuICByZXR1cm4ge1xuICAgIGRlbHRhTXMsXG4gICAgYW5jaG9yRnJhYzogYW5jaG9ySXNFYXJsaWVyID8gb3JpZ2luRnJhYyA6IGxhdGVyRnJhYyxcbiAgICBob3ZlcmVkRnJhYzogYW5jaG9ySXNFYXJsaWVyID8gbGF0ZXJGcmFjIDogb3JpZ2luRnJhYyxcbiAgICBhbmNob3JFZGdlOiBhbmNob3JJc0VhcmxpZXIgJiYgZWFybGllckVuZCA8PSBsYXRlclN0YXJ0ID8gJ2VuZCcgOiAnc3RhcnQnLFxuICAgIGhvdmVyZWRPZmZzY3JlZW46XG4gICAgICBob3ZlcmVkU3RhcnQgPiB2aWV3RW5kID8gJ3JpZ2h0JyA6IGhvdmVyZWRFbmQgPCB2aWV3U3RhcnQgPyAnbGVmdCcgOiBudWxsLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc291cmNlIGNvbG9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBSRVNPVVJDRV9DT0xPUlM6IFJlY29yZDxcbiAgc3RyaW5nLFxuICB7XG4gICAgYmc6IHN0cmluZztcbiAgICBib3JkZXI6IHN0cmluZztcbiAgICBlcnJvckJnPzogc3RyaW5nO1xuICAgIGVycm9yQm9yZGVyPzogc3RyaW5nO1xuICB9XG4+ID0ge1xuICBydW46IHtcbiAgICBiZzogJ3ZhcigtLWRzLWJsdWUtMjAwKScsXG4gICAgYm9yZGVyOiAndmFyKC0tZHMtYmx1ZS01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICBzdGVwOiB7XG4gICAgYmc6ICd2YXIoLS1kcy1ncmVlbi0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1ncmVlbi01MDApJyxcbiAgICBlcnJvckJnOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgIGVycm9yQm9yZGVyOiAndmFyKC0tZHMtcmVkLTUwMCknLFxuICB9LFxuICAvLyBQYXNzaXZlIHNwYW5zIChob29rcykgc3RheSBncmF5IOKAlCBtYXRjaGVzIGV2ZW50LWxpc3QgaWNvbnMgYW5kIHRoZSBtaW5pbWFwLlxuICBob29rOiB7XG4gICAgYmc6ICd2YXIoLS1kcy1ncmF5LTIwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyYXktNTAwKScsXG4gICAgZXJyb3JCZzogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICBlcnJvckJvcmRlcjogJ3ZhcigtLWRzLXJlZC01MDApJyxcbiAgfSxcbiAgc2xlZXA6IHtcbiAgICBiZzogJ3ZhcigtLWRzLXB1cnBsZS0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1wdXJwbGUtNTAwKScsXG4gICAgZXJyb3JCZzogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICBlcnJvckJvcmRlcjogJ3ZhcigtLWRzLXJlZC01MDApJyxcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIGJnOiAndmFyKC0tZHMtZ3JheS0yMDApJyxcbiAgICBib3JkZXI6ICd2YXIoLS1kcy1ncmF5LTUwMCknLFxuICAgIGVycm9yQmc6ICd2YXIoLS1kcy1yZWQtMjAwKScsXG4gICAgZXJyb3JCb3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzb3VyY2VDb2xvcihyZXNvdXJjZTogc3RyaW5nKToge1xuICBiZzogc3RyaW5nO1xuICBib3JkZXI6IHN0cmluZztcbiAgZXJyb3JCZz86IHN0cmluZztcbiAgZXJyb3JCb3JkZXI/OiBzdHJpbmc7XG59IHtcbiAgcmV0dXJuIFJFU09VUkNFX0NPTE9SU1tyZXNvdXJjZV0gPz8gUkVTT1VSQ0VfQ09MT1JTLmRlZmF1bHQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3BhbiBzZWdtZW50cyDigJQgc3BsaXQgYSB0aW1lbGluZSBiYXIgaW50byBjb2xvcmVkIHNlY3Rpb25zIGJ5IGV2ZW50IHN0YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFN0YXR1cyA9XG4gIHwgJ3F1ZXVlZCdcbiAgfCAncGVuZGluZydcbiAgfCAncnVubmluZydcbiAgfCAnY29tcGxldGVkJ1xuICB8ICdmYWlsZWQnXG4gIHwgJ3JldHJ5aW5nJ1xuICB8ICdzdWNjZWVkZWQnXG4gIHwgJ3dhaXRpbmcnXG4gIHwgJ3NsZWVwaW5nJ1xuICB8ICdyZWNlaXZlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudCB7XG4gIHN0YXJ0RnJhY3Rpb246IG51bWJlcjtcbiAgZW5kRnJhY3Rpb246IG51bWJlcjtcbiAgc3RhdHVzOiBTZWdtZW50U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBjbGFtcEZyYWN0aW9uKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gdGltZVRvRnJhY3Rpb24oXG4gIHRpbWU6IG51bWJlcixcbiAgc3BhblN0YXJ0OiBudW1iZXIsXG4gIHNwYW5EdXJhdGlvbjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBpZiAoc3BhbkR1cmF0aW9uIDw9IDApIHJldHVybiAwO1xuICByZXR1cm4gY2xhbXBGcmFjdGlvbigodGltZSAtIHNwYW5TdGFydCkgLyBzcGFuRHVyYXRpb24pO1xufVxuXG5pbnRlcmZhY2UgRXZlbnRNYXJrIHtcbiAgdGltZTogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHNvcnRlZEV2ZW50TWFya3MoXG4gIGV2ZW50czogU3BhbkV2ZW50W10sXG4gIHJlbGV2YW50TmFtZXM6IHN0cmluZ1tdXG4pOiBFdmVudE1hcmtbXSB7XG4gIHJldHVybiBldmVudHNcbiAgICAuZmlsdGVyKChlKSA9PiByZWxldmFudE5hbWVzLmluY2x1ZGVzKGUubmFtZSkpXG4gICAgLm1hcCgoZSkgPT4gKHsgdGltZTogZ2V0SGlnaFJlc0luTXMoZS50aW1lc3RhbXApLCB0eXBlOiBlLm5hbWUgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEudGltZSAtIGIudGltZSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdGVwU2VnbWVudHNGcm9tU3BhbihcbiAgc3RhcnRNczogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBldmVudHM6IFNwYW5FdmVudFtdXG4pOiBTZWdtZW50W10ge1xuICBjb25zdCBzZWdtZW50czogU2VnbWVudFtdID0gW107XG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gc2VnbWVudHM7XG5cbiAgY29uc3QgbWFya3MgPSBzb3J0ZWRFdmVudE1hcmtzKGV2ZW50cywgW1xuICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gIF0pO1xuXG4gIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICBzZWdtZW50cy5wdXNoKHsgc3RhcnRGcmFjdGlvbjogMCwgZW5kRnJhY3Rpb246IDEsIHN0YXR1czogJ3F1ZXVlZCcgfSk7XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgY29uc3QgZmlyc3RGcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKG1hcmtzWzBdLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKTtcbiAgaWYgKGZpcnN0RnJhY3Rpb24gPiAwLjAwMSkge1xuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgIGVuZEZyYWN0aW9uOiBmaXJzdEZyYWN0aW9uLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtYXJrID0gbWFya3NbaV07XG4gICAgY29uc3QgbWFya0ZyYWMgPSB0aW1lVG9GcmFjdGlvbihtYXJrLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKTtcbiAgICBjb25zdCBuZXh0TWFyayA9IG1hcmtzW2kgKyAxXTtcbiAgICBjb25zdCBuZXh0RnJhYyA9IG5leHRNYXJrXG4gICAgICA/IHRpbWVUb0ZyYWN0aW9uKG5leHRNYXJrLnRpbWUsIHN0YXJ0TXMsIGR1cmF0aW9uKVxuICAgICAgOiAxO1xuXG4gICAgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgIGlmIChpID09PSBtYXJrcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dFR5cGUgPSBuZXh0TWFyay50eXBlO1xuICAgICAgICBjb25zdCBhdHRlbXB0U3RhdHVzOiBTZWdtZW50U3RhdHVzID1cbiAgICAgICAgICBuZXh0VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnIHx8IG5leHRUeXBlID09PSAnc3RlcF9mYWlsZWQnXG4gICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICA6IG5leHRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnXG4gICAgICAgICAgICAgID8gJ3N1Y2NlZWRlZCdcbiAgICAgICAgICAgICAgOiAncmV0cnlpbmcnO1xuICAgICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhYyxcbiAgICAgICAgICBlbmRGcmFjdGlvbjogbmV4dEZyYWMsXG4gICAgICAgICAgc3RhdHVzOiBhdHRlbXB0U3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWMsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBuZXh0RnJhYyxcbiAgICAgICAgc3RhdHVzOiAncmV0cnlpbmcnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXJrLnR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpIHtcbiAgICAgIGlmIChtYXJrRnJhYyA8IDAuOTk5KSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUhvb2tTZWdtZW50c0Zyb21TcGFuKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGV2ZW50czogU3BhbkV2ZW50W11cbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBzZWdtZW50cztcblxuICBjb25zdCBkaXNwb3NlZCA9IHNvcnRlZEV2ZW50TWFya3MoZXZlbnRzLCBbJ2hvb2tfZGlzcG9zZWQnXSlbMF07XG4gIGNvbnN0IGRpc3Bvc2VkRnJhYyA9IGRpc3Bvc2VkXG4gICAgPyB0aW1lVG9GcmFjdGlvbihkaXNwb3NlZC50aW1lLCBzdGFydE1zLCBkdXJhdGlvbilcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qgd2FpdGluZ0VuZCA9IGRpc3Bvc2VkRnJhYyA/PyAxO1xuICBpZiAod2FpdGluZ0VuZCA+IDAuMDAxKSB7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgZW5kRnJhY3Rpb246IHdhaXRpbmdFbmQsXG4gICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkaXNwb3NlZEZyYWMgIT09IG51bGwgJiYgZGlzcG9zZWRGcmFjIDwgMC45OTkpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGRpc3Bvc2VkRnJhYyxcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVNsZWVwU2VnbWVudHNGcm9tU3BhbihcbiAgX3N0YXJ0TXM6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgX2V2ZW50czogU3BhbkV2ZW50W11cbik6IFNlZ21lbnRbXSB7XG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gW107XG4gIHJldHVybiBbeyBzdGFydEZyYWN0aW9uOiAwLCBlbmRGcmFjdGlvbjogMSwgc3RhdHVzOiAnc2xlZXBpbmcnIH1dO1xufVxuXG5mdW5jdGlvbiBydW5TZWdtZW50U3RhdHVzKHJ1blN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkKTogU2VnbWVudFN0YXR1cyB7XG4gIGlmIChydW5TdGF0dXMgPT09ICdmYWlsZWQnKSByZXR1cm4gJ2ZhaWxlZCc7XG4gIGlmIChydW5TdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdwZW5kaW5nJztcbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ3J1bm5pbmcnKSByZXR1cm4gJ3J1bm5pbmcnO1xuICByZXR1cm4gJ2NvbXBsZXRlZCc7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSdW5TZWdtZW50c0Zyb21TcGFuKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGFjdGl2ZVN0YXJ0TXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgZXZlbnRzOiBTcGFuRXZlbnRbXSxcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBzZWdtZW50cztcblxuICBjb25zdCBzb3J0ZWQgPSBbLi4uZXZlbnRzXVxuICAgIC5tYXAoKGUpID0+ICh7IG5hbWU6IGUubmFtZSwgdGltZTogZ2V0SGlnaFJlc0luTXMoZS50aW1lc3RhbXApIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gIGNvbnN0IHJ1bkRhdGEgPSBhdHRyaWJ1dGVzPy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBydW5TdGF0dXMgPSBydW5EYXRhPy5zdGF0dXMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhhc1J1bkNyZWF0ZWQgPSBzb3J0ZWQuc29tZSgoZSkgPT4gZS5uYW1lID09PSAncnVuX2NyZWF0ZWQnKTtcblxuICBpZiAoIWhhc1J1bkNyZWF0ZWQpIHtcbiAgICByZXR1cm4gY29tcHV0ZVYxUnVuU2VnbWVudHMoc3RhcnRNcywgZHVyYXRpb24sIGFjdGl2ZVN0YXJ0TXMsIHJ1blN0YXR1cyk7XG4gIH1cblxuICBjb25zdCBmYWlsZWRFdmVudCA9IHNvcnRlZC5maW5kKChlKSA9PiBlLm5hbWUgPT09ICdydW5fZmFpbGVkJyk7XG5cbiAgbGV0IGN1cnNvciA9IDA7XG4gIGlmIChhY3RpdmVTdGFydE1zICE9PSB1bmRlZmluZWQgJiYgYWN0aXZlU3RhcnRNcyA+IHN0YXJ0TXMpIHtcbiAgICBjb25zdCBxdWV1ZWRGcmFjID0gdGltZVRvRnJhY3Rpb24oYWN0aXZlU3RhcnRNcywgc3RhcnRNcywgZHVyYXRpb24pO1xuICAgIGlmIChxdWV1ZWRGcmFjID4gMC4wMDEpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgICBlbmRGcmFjdGlvbjogcXVldWVkRnJhYyxcbiAgICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIH0pO1xuICAgICAgY3Vyc29yID0gcXVldWVkRnJhYztcbiAgICB9XG4gIH1cblxuICBzZWdtZW50cy5wdXNoKHtcbiAgICBzdGFydEZyYWN0aW9uOiBjdXJzb3IsXG4gICAgZW5kRnJhY3Rpb246IDEsXG4gICAgc3RhdHVzOiBmYWlsZWRFdmVudCA/ICdmYWlsZWQnIDogcnVuU2VnbWVudFN0YXR1cyhydW5TdGF0dXMpLFxuICB9KTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVWMVJ1blNlZ21lbnRzKFxuICBzdGFydE1zOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGFjdGl2ZVN0YXJ0TXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgcnVuU3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcblxuICBsZXQgY3Vyc29yID0gMDtcbiAgaWYgKGFjdGl2ZVN0YXJ0TXMgIT09IHVuZGVmaW5lZCAmJiBhY3RpdmVTdGFydE1zID4gc3RhcnRNcykge1xuICAgIGNvbnN0IHF1ZXVlZEZyYWMgPSB0aW1lVG9GcmFjdGlvbihhY3RpdmVTdGFydE1zLCBzdGFydE1zLCBkdXJhdGlvbik7XG4gICAgaWYgKHF1ZXVlZEZyYWMgPiAwLjAwMSkge1xuICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBxdWV1ZWRGcmFjLFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgfSk7XG4gICAgICBjdXJzb3IgPSBxdWV1ZWRGcmFjO1xuICAgIH1cbiAgfVxuXG4gIHNlZ21lbnRzLnB1c2goe1xuICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICBlbmRGcmFjdGlvbjogMSxcbiAgICBzdGF0dXM6IHJ1blNlZ21lbnRTdGF0dXMocnVuU3RhdHVzKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vKipcbiAqIENvbXB1dGUgZXZlbnQtYmFzZWQgc2VnbWVudHMgZm9yIGEgc3Bhbi4gRGlzcGF0Y2hlcyBvbiBgc3Bhbi5yZXNvdXJjZWBcbiAqIHRvIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZS10eXBlLXNwZWNpZmljIHNlZ21lbnQgYnVpbGRlci5cbiAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGdlbmVyaWMgKG5vbi13b3JrZmxvdykgc3BhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3BhblNlZ21lbnRzKHNwYW46IFNwYW4pOiBTZWdtZW50W10ge1xuICBjb25zdCBzdGFydE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBkdXJhdGlvbiA9IGdldFNwYW5EdXJhdGlvbk1zKHNwYW4pO1xuICBjb25zdCBhY3RpdmVTdGFydE1zID0gc3Bhbi5hY3RpdmVTdGFydFRpbWVcbiAgICA/IGdldEhpZ2hSZXNJbk1zKHNwYW4uYWN0aXZlU3RhcnRUaW1lKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHN3aXRjaCAoc3Bhbi5yZXNvdXJjZSkge1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIGNvbXB1dGVTdGVwU2VnbWVudHNGcm9tU3BhbihzdGFydE1zLCBkdXJhdGlvbiwgc3Bhbi5ldmVudHMpO1xuICAgIGNhc2UgJ2hvb2snOlxuICAgICAgcmV0dXJuIGNvbXB1dGVIb29rU2VnbWVudHNGcm9tU3BhbihzdGFydE1zLCBkdXJhdGlvbiwgc3Bhbi5ldmVudHMpO1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiBjb21wdXRlU2xlZXBTZWdtZW50c0Zyb21TcGFuKHN0YXJ0TXMsIGR1cmF0aW9uLCBzcGFuLmV2ZW50cyk7XG4gICAgY2FzZSAncnVuJzpcbiAgICAgIHJldHVybiBjb21wdXRlUnVuU2VnbWVudHNGcm9tU3BhbihcbiAgICAgICAgc3RhcnRNcyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGFjdGl2ZVN0YXJ0TXMsXG4gICAgICAgIHNwYW4uZXZlbnRzLFxuICAgICAgICBzcGFuLmF0dHJpYnV0ZXNcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNwYW4gbWFya2VycyDigJQgcG9pbnQtaW4tdGltZSBldmVudHMgcmVuZGVyZWQgYXMgdGlja3Mgb24gdG9wIG9mIGEgYmFyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTcGFuTWFya2VyIHtcbiAgdGltZU1zOiBudW1iZXI7XG59XG5cbi8vIGBob29rX3JlY2VpdmVkYCA9IGEgcmVzdW1wdGlvbjsgYGF0dHJfc2V0YCA9IGF0dHJpYnV0ZXMgd3JpdHRlbiBtaWQtc3Bhbi5cbmNvbnN0IE1BUktFUl9FVkVOVF9OQU1FUyA9IFsnaG9va19yZWNlaXZlZCcsICdhdHRyX3NldCddO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNwYW5NYXJrZXJzKHNwYW46IFNwYW4pOiBTcGFuTWFya2VyW10ge1xuICByZXR1cm4gc29ydGVkRXZlbnRNYXJrcyhzcGFuLmV2ZW50cywgTUFSS0VSX0VWRU5UX05BTUVTKS5tYXAoKG1hcmspID0+ICh7XG4gICAgdGltZU1zOiBtYXJrLnRpbWUsXG4gIH0pKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZmZzY3JlZW5TaWRlIHtcbiAgY291bnQ6IG51bWJlcjtcbiAgLyoqIE5lYXJlc3Qgb2ZmLXNjcmVlbiBtYXJrZXIg4oCUIHRoZSBvbmUgYSByZXZlYWwganVtcHMgdG8uICovXG4gIG5lYXJlc3RNczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNjcmVlbk1hcmtlcnMge1xuICBsZWZ0OiBPZmZzY3JlZW5TaWRlIHwgbnVsbDtcbiAgcmlnaHQ6IE9mZnNjcmVlblNpZGUgfCBudWxsO1xufVxuXG4vKiogUGFydGl0aW9uIG1hcmtlcnMgb3V0c2lkZSBgW3Zpc2libGVTdGFydE1zLCB2aXNpYmxlRW5kTXNdYCBieSBzaWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPZmZzY3JlZW5NYXJrZXJzKFxuICBtYXJrZXJzOiBTcGFuTWFya2VyW10sXG4gIHZpc2libGVTdGFydE1zOiBudW1iZXIsXG4gIHZpc2libGVFbmRNczogbnVtYmVyXG4pOiBPZmZzY3JlZW5NYXJrZXJzIHtcbiAgbGV0IGxlZnRDb3VudCA9IDA7XG4gIGxldCByaWdodENvdW50ID0gMDtcbiAgbGV0IG5lYXJlc3RMZWZ0ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICBsZXQgbmVhcmVzdFJpZ2h0ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBmb3IgKGNvbnN0IHsgdGltZU1zIH0gb2YgbWFya2Vycykge1xuICAgIGlmICh0aW1lTXMgPCB2aXNpYmxlU3RhcnRNcykge1xuICAgICAgbGVmdENvdW50Kys7XG4gICAgICBpZiAodGltZU1zID4gbmVhcmVzdExlZnQpIG5lYXJlc3RMZWZ0ID0gdGltZU1zO1xuICAgIH0gZWxzZSBpZiAodGltZU1zID4gdmlzaWJsZUVuZE1zKSB7XG4gICAgICByaWdodENvdW50Kys7XG4gICAgICBpZiAodGltZU1zIDwgbmVhcmVzdFJpZ2h0KSBuZWFyZXN0UmlnaHQgPSB0aW1lTXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgbGVmdDogbGVmdENvdW50ID4gMCA/IHsgY291bnQ6IGxlZnRDb3VudCwgbmVhcmVzdE1zOiBuZWFyZXN0TGVmdCB9IDogbnVsbCxcbiAgICByaWdodDpcbiAgICAgIHJpZ2h0Q291bnQgPiAwID8geyBjb3VudDogcmlnaHRDb3VudCwgbmVhcmVzdE1zOiBuZWFyZXN0UmlnaHQgfSA6IG51bGwsXG4gIH07XG59XG4iXX0=
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { WorkflowRun } from '@workflow/core/runtime';
|
|
2
2
|
import type { Event } from '@workflow/world';
|
|
3
3
|
import { type SidebarDataContextValue } from './sidebar/sidebar-data-context';
|
|
4
|
-
declare const
|
|
4
|
+
declare const TraceViewer: ({ run, events, sidebarData, onLoadMore, hasMore, isLoadingMore, loading, }: {
|
|
5
5
|
run: WorkflowRun;
|
|
6
6
|
events: Event[];
|
|
7
7
|
sidebarData: SidebarDataContextValue;
|
|
8
|
+
onLoadMore?: () => void | Promise<void>;
|
|
9
|
+
hasMore?: boolean;
|
|
10
|
+
isLoadingMore?: boolean;
|
|
11
|
+
loading?: boolean;
|
|
8
12
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
export {
|
|
10
|
-
//# sourceMappingURL=trace-viewer
|
|
13
|
+
export { TraceViewer };
|
|
14
|
+
//# sourceMappingURL=trace-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-viewer.d.ts","sourceRoot":"","sources":["../../src/components/trace-viewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAC;AAIxC,QAAA,MAAM,WAAW,GAAI,4EAQlB;IACD,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,uBAAuB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,4CAyBA,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { buildTrace } from '../lib/trace-builder';
|
|
4
|
+
import { SidebarDataProvider, } from './sidebar/sidebar-data-context';
|
|
5
|
+
import { TraceViewerSkeleton } from './trace-viewer/components/trace-viewer-skeleton';
|
|
6
|
+
import { TraceViewer as TraceViewerComponent } from './trace-viewer/trace-viewer';
|
|
7
|
+
const TraceViewer = ({ run, events, sidebarData, onLoadMore, hasMore, isLoadingMore, loading = false, }) => {
|
|
8
|
+
const trace = useMemo(() => {
|
|
9
|
+
if (!run?.runId) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return buildTrace(run, events, new Date());
|
|
13
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- `new Date()` is intentionally not a dep
|
|
14
|
+
}, [run, events]);
|
|
15
|
+
if (!trace || (loading && events.length === 0)) {
|
|
16
|
+
return _jsx(TraceViewerSkeleton, {});
|
|
17
|
+
}
|
|
18
|
+
return (_jsx(SidebarDataProvider, { value: sidebarData, children: _jsx("div", { className: "relative w-full h-full flex", children: _jsx(TraceViewerComponent, { trace: trace, onLoadMore: onLoadMore, hasMore: hasMore, isLoadingMore: isLoadingMore }) }) }));
|
|
19
|
+
};
|
|
20
|
+
export { TraceViewer };
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utdmlld2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFzQixNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFFTCxtQkFBbUIsR0FDcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUN0RixPQUFPLEVBQUUsV0FBVyxJQUFJLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbEYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUNuQixHQUFHLEVBQ0gsTUFBTSxFQUNOLFdBQVcsRUFDWCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGFBQWEsRUFDYixPQUFPLEdBQUcsS0FBSyxHQVNoQixFQUFFLEVBQUU7SUFDSCxNQUFNLEtBQUssR0FBOEIsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUNwRCxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQyxrR0FBa0c7SUFDcEcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFbEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxLQUFDLG1CQUFtQixLQUFHLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU8sQ0FDTCxLQUFDLG1CQUFtQixJQUFDLEtBQUssRUFBRSxXQUFXLFlBQ3JDLGNBQUssU0FBUyxFQUFDLDZCQUE2QixZQUMxQyxLQUFDLG9CQUFvQixJQUNuQixLQUFLLEVBQUUsS0FBSyxFQUNaLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQ2hCLGFBQWEsRUFBRSxhQUFhLEdBQzVCLEdBQ0UsR0FDYyxDQUN2QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHR5cGUgeyBFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYnVpbGRUcmFjZSwgdHlwZSBUcmFjZVdpdGhNZXRhIH0gZnJvbSAnLi4vbGliL3RyYWNlLWJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgdHlwZSBTaWRlYmFyRGF0YUNvbnRleHRWYWx1ZSxcbiAgU2lkZWJhckRhdGFQcm92aWRlcixcbn0gZnJvbSAnLi9zaWRlYmFyL3NpZGViYXItZGF0YS1jb250ZXh0JztcbmltcG9ydCB7IFRyYWNlVmlld2VyU2tlbGV0b24gfSBmcm9tICcuL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL3RyYWNlLXZpZXdlci1za2VsZXRvbic7XG5pbXBvcnQgeyBUcmFjZVZpZXdlciBhcyBUcmFjZVZpZXdlckNvbXBvbmVudCB9IGZyb20gJy4vdHJhY2Utdmlld2VyL3RyYWNlLXZpZXdlcic7XG5cbmNvbnN0IFRyYWNlVmlld2VyID0gKHtcbiAgcnVuLFxuICBldmVudHMsXG4gIHNpZGViYXJEYXRhLFxuICBvbkxvYWRNb3JlLFxuICBoYXNNb3JlLFxuICBpc0xvYWRpbmdNb3JlLFxuICBsb2FkaW5nID0gZmFsc2UsXG59OiB7XG4gIHJ1bjogV29ya2Zsb3dSdW47XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgc2lkZWJhckRhdGE6IFNpZGViYXJEYXRhQ29udGV4dFZhbHVlO1xuICBvbkxvYWRNb3JlPzogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIGhhc01vcmU/OiBib29sZWFuO1xuICBpc0xvYWRpbmdNb3JlPzogYm9vbGVhbjtcbiAgbG9hZGluZz86IGJvb2xlYW47XG59KSA9PiB7XG4gIGNvbnN0IHRyYWNlOiBUcmFjZVdpdGhNZXRhIHwgdW5kZWZpbmVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFydW4/LnJ1bklkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRUcmFjZShydW4sIGV2ZW50cywgbmV3IERhdGUoKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAtLSBgbmV3IERhdGUoKWAgaXMgaW50ZW50aW9uYWxseSBub3QgYSBkZXBcbiAgfSwgW3J1biwgZXZlbnRzXSk7XG5cbiAgaWYgKCF0cmFjZSB8fCAobG9hZGluZyAmJiBldmVudHMubGVuZ3RoID09PSAwKSkge1xuICAgIHJldHVybiA8VHJhY2VWaWV3ZXJTa2VsZXRvbiAvPjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNpZGViYXJEYXRhUHJvdmlkZXIgdmFsdWU9e3NpZGViYXJEYXRhfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgdy1mdWxsIGgtZnVsbCBmbGV4XCI+XG4gICAgICAgIDxUcmFjZVZpZXdlckNvbXBvbmVudFxuICAgICAgICAgIHRyYWNlPXt0cmFjZX1cbiAgICAgICAgICBvbkxvYWRNb3JlPXtvbkxvYWRNb3JlfVxuICAgICAgICAgIGhhc01vcmU9e2hhc01vcmV9XG4gICAgICAgICAgaXNMb2FkaW5nTW9yZT17aXNMb2FkaW5nTW9yZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvU2lkZWJhckRhdGFQcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCB7IFRyYWNlVmlld2VyIH07XG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { cva } from 'class-variance-authority';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import { cn } from '../../lib/
|
|
4
|
+
import { cn } from '../../lib/cn';
|
|
5
5
|
const alertVariants = cva('relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4', {
|
|
6
6
|
variants: {
|
|
7
7
|
variant: {
|
|
@@ -17,7 +17,7 @@ const Alert = React.forwardRef(({ className, variant, ...props }, ref) => (_jsx(
|
|
|
17
17
|
Alert.displayName = 'Alert';
|
|
18
18
|
const AlertTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx("h5", { ref: ref, className: cn('mb-1 font-medium leading-none tracking-tight', className), ...props })));
|
|
19
19
|
AlertTitle.displayName = 'AlertTitle';
|
|
20
|
-
const AlertDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('text-
|
|
20
|
+
const AlertDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('text-copy-14 [&_p]:leading-relaxed', className), ...props })));
|
|
21
21
|
AlertDescription.displayName = 'AlertDescription';
|
|
22
22
|
export { Alert, AlertTitle, AlertDescription };
|
|
23
|
-
//# sourceMappingURL=
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9hbGVydC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVsQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQ3ZCLG1JQUFtSSxFQUNuSTtJQUNFLFFBQVEsRUFBRTtRQUNSLE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRSxFQUFFO1lBQ1gsV0FBVyxFQUNULHNFQUFzRTtTQUN6RTtLQUNGO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsT0FBTyxFQUFFLFNBQVM7S0FDbkI7Q0FDRixDQUNGLENBQUM7QUFFRixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxDQUc1QixDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FDM0MsY0FDRSxHQUFHLEVBQUUsR0FBRyxFQUNSLElBQUksRUFBQyxPQUFPLEVBQ1osU0FBUyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUNoRCxLQUFLLEdBQ1QsQ0FDSCxDQUFDLENBQUM7QUFDSCxLQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUU1QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUdqQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNsQyxhQUNFLEdBQUcsRUFBRSxHQUFHLEVBQ1IsU0FBUyxFQUFFLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxTQUFTLENBQUMsS0FDcEUsS0FBSyxHQUNULENBQ0gsQ0FBQyxDQUFDO0FBQ0gsVUFBVSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFFdEMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUd2QyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNsQyxjQUNFLEdBQUcsRUFBRSxHQUFHLEVBQ1IsU0FBUyxFQUFFLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxTQUFTLENBQUMsS0FDMUQsS0FBSyxHQUNULENBQ0gsQ0FBQyxDQUFDO0FBQ0gsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0FBRWxELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvY24nO1xuXG5jb25zdCBhbGVydFZhcmlhbnRzID0gY3ZhKFxuICAncmVsYXRpdmUgdy1mdWxsIHJvdW5kZWQtbGcgYm9yZGVyIHAtNCBbJj5zdmd+Kl06cGwtNyBbJj5zdmcrZGl2XTp0cmFuc2xhdGUteS1bLTNweF0gWyY+c3ZnXTphYnNvbHV0ZSBbJj5zdmddOmxlZnQtNCBbJj5zdmddOnRvcC00JyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIGRlZmF1bHQ6ICcnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYm9yZGVyLXJlZC00MDAgdGV4dC1yZWQtOTAwIGRhcms6Ym9yZGVyLXJlZC03MDAgWyY+c3ZnXTp0ZXh0LXJlZC05MDAnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmNvbnN0IEFsZXJ0ID0gUmVhY3QuZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PiAmIFZhcmlhbnRQcm9wczx0eXBlb2YgYWxlcnRWYXJpYW50cz5cbj4oKHsgY2xhc3NOYW1lLCB2YXJpYW50LCAuLi5wcm9wcyB9LCByZWYpID0+IChcbiAgPGRpdlxuICAgIHJlZj17cmVmfVxuICAgIHJvbGU9XCJhbGVydFwiXG4gICAgY2xhc3NOYW1lPXtjbihhbGVydFZhcmlhbnRzKHsgdmFyaWFudCB9KSwgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKTtcbkFsZXJ0LmRpc3BsYXlOYW1lID0gJ0FsZXJ0JztcblxuY29uc3QgQWxlcnRUaXRsZSA9IFJlYWN0LmZvcndhcmRSZWY8XG4gIEhUTUxQYXJhZ3JhcGhFbGVtZW50LFxuICBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MSGVhZGluZ0VsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxoNVxuICAgIHJlZj17cmVmfVxuICAgIGNsYXNzTmFtZT17Y24oJ21iLTEgZm9udC1tZWRpdW0gbGVhZGluZy1ub25lIHRyYWNraW5nLXRpZ2h0JywgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKTtcbkFsZXJ0VGl0bGUuZGlzcGxheU5hbWUgPSAnQWxlcnRUaXRsZSc7XG5cbmNvbnN0IEFsZXJ0RGVzY3JpcHRpb24gPSBSZWFjdC5mb3J3YXJkUmVmPFxuICBIVE1MUGFyYWdyYXBoRWxlbWVudCxcbiAgUmVhY3QuSFRNTEF0dHJpYnV0ZXM8SFRNTFBhcmFncmFwaEVsZW1lbnQ+XG4+KCh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gIDxkaXZcbiAgICByZWY9e3JlZn1cbiAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWNvcHktMTQgWyZfcF06bGVhZGluZy1yZWxheGVkJywgY2xhc3NOYW1lKX1cbiAgICB7Li4ucHJvcHN9XG4gIC8+XG4pKTtcbkFsZXJ0RGVzY3JpcHRpb24uZGlzcGxheU5hbWUgPSAnQWxlcnREZXNjcmlwdGlvbic7XG5cbmV4cG9ydCB7IEFsZXJ0LCBBbGVydFRpdGxlLCBBbGVydERlc2NyaXB0aW9uIH07XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
declare const buttonVariants: (props?: ({
|
|
4
|
+
variant?: "default" | "secondary" | "ghost" | null | undefined;
|
|
5
|
+
size?: "default" | "icon" | "sm" | "xs" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
export type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>;
|
|
8
|
+
export declare function Button({ className, variant, size, type, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export { buttonVariants };
|
|
10
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,QAAA,MAAM,cAAc;;;8EA0CnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GACrE,YAAY,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtC,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAe,EACf,GAAG,KAAK,EACT,EAAE,WAAW,2CAQb;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|