@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
|
|
6
|
-
import
|
|
7
|
-
|
|
6
|
+
import {
|
|
7
|
+
type Event,
|
|
8
|
+
isTerminalStepEventType,
|
|
9
|
+
type WorkflowRun,
|
|
10
|
+
} from '@workflow/world';
|
|
11
|
+
import type { Span, SpanEvent } from '../../lib/trace-types';
|
|
8
12
|
import { shouldShowVerticalLine } from './event-colors';
|
|
9
13
|
import { calculateDuration, dateToOtelTime } from './trace-time-utils';
|
|
10
14
|
|
|
@@ -26,15 +30,27 @@ const MARKER_EVENT_TYPES: Set<Event['eventType']> = new Set([
|
|
|
26
30
|
'run_failed',
|
|
27
31
|
'wait_created',
|
|
28
32
|
'wait_completed',
|
|
33
|
+
'attr_set',
|
|
29
34
|
]);
|
|
30
35
|
|
|
36
|
+
export const getEventTimestamp = (
|
|
37
|
+
event: Event | undefined
|
|
38
|
+
): Date | undefined => {
|
|
39
|
+
const value = event?.occurredAt ?? event?.createdAt;
|
|
40
|
+
if (!value) return undefined;
|
|
41
|
+
|
|
42
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
43
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
44
|
+
};
|
|
45
|
+
|
|
31
46
|
/**
|
|
32
47
|
* Convert workflow events to span events
|
|
33
48
|
* Only includes events that should be displayed as markers
|
|
34
49
|
*/
|
|
35
50
|
export function convertEventsToSpanEvents(
|
|
36
51
|
events: Event[],
|
|
37
|
-
filterTypes = true
|
|
52
|
+
filterTypes = true,
|
|
53
|
+
options: { preferOccurredAt?: boolean } = {}
|
|
38
54
|
): SpanEvent[] {
|
|
39
55
|
return events
|
|
40
56
|
.filter((event) =>
|
|
@@ -42,7 +58,11 @@ export function convertEventsToSpanEvents(
|
|
|
42
58
|
)
|
|
43
59
|
.map((event) => ({
|
|
44
60
|
name: event.eventType,
|
|
45
|
-
timestamp: dateToOtelTime(
|
|
61
|
+
timestamp: dateToOtelTime(
|
|
62
|
+
options.preferOccurredAt
|
|
63
|
+
? (getEventTimestamp(event) ?? event.createdAt)
|
|
64
|
+
: event.createdAt
|
|
65
|
+
),
|
|
46
66
|
attributes: {
|
|
47
67
|
eventId: event.eventId,
|
|
48
68
|
correlationId: event.correlationId,
|
|
@@ -72,11 +92,11 @@ export const waitEventsToWaitEntity = (
|
|
|
72
92
|
return {
|
|
73
93
|
waitId: startEvent.correlationId,
|
|
74
94
|
runId: startEvent.runId,
|
|
75
|
-
createdAt: startEvent.createdAt,
|
|
95
|
+
createdAt: getEventTimestamp(startEvent) ?? startEvent.createdAt,
|
|
76
96
|
resumeAt: startEvent.eventData?.resumeAt
|
|
77
97
|
? new Date(startEvent.eventData.resumeAt)
|
|
78
98
|
: undefined,
|
|
79
|
-
completedAt: completedEvent
|
|
99
|
+
completedAt: getEventTimestamp(completedEvent),
|
|
80
100
|
};
|
|
81
101
|
};
|
|
82
102
|
|
|
@@ -168,16 +188,16 @@ export const stepEventsToStepEntity = (
|
|
|
168
188
|
case 'step_started':
|
|
169
189
|
status = 'running';
|
|
170
190
|
attempt += 1;
|
|
171
|
-
if (!startedAt) startedAt = e.createdAt;
|
|
191
|
+
if (!startedAt) startedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
172
192
|
completedAt = undefined;
|
|
173
193
|
break;
|
|
174
194
|
case 'step_completed':
|
|
175
195
|
status = 'completed';
|
|
176
|
-
completedAt = e.createdAt;
|
|
196
|
+
completedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
177
197
|
break;
|
|
178
198
|
case 'step_failed':
|
|
179
199
|
status = 'failed';
|
|
180
|
-
completedAt = e.createdAt;
|
|
200
|
+
completedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
181
201
|
break;
|
|
182
202
|
case 'step_retrying':
|
|
183
203
|
status = 'pending';
|
|
@@ -190,14 +210,18 @@ export const stepEventsToStepEntity = (
|
|
|
190
210
|
if (attempt === 0) attempt = 1;
|
|
191
211
|
|
|
192
212
|
const lastEvent = events[events.length - 1];
|
|
213
|
+
|
|
193
214
|
return {
|
|
194
215
|
stepId: anchorEvent.correlationId ?? '',
|
|
195
216
|
runId: anchorEvent.runId,
|
|
196
217
|
stepName: createdEvent?.eventData?.stepName ?? '',
|
|
197
218
|
status,
|
|
198
219
|
attempt,
|
|
199
|
-
createdAt: anchorEvent.createdAt,
|
|
200
|
-
updatedAt:
|
|
220
|
+
createdAt: getEventTimestamp(anchorEvent) ?? anchorEvent.createdAt,
|
|
221
|
+
updatedAt:
|
|
222
|
+
getEventTimestamp(lastEvent) ??
|
|
223
|
+
lastEvent?.createdAt ??
|
|
224
|
+
anchorEvent.createdAt,
|
|
201
225
|
startedAt,
|
|
202
226
|
completedAt,
|
|
203
227
|
specVersion: anchorEvent.specVersion,
|
|
@@ -220,25 +244,37 @@ export function stepToSpan(stepEvents: Event[], maxEndTime: Date): Span | null {
|
|
|
220
244
|
};
|
|
221
245
|
|
|
222
246
|
const resource = 'step';
|
|
223
|
-
const endTime = new Date(step.completedAt ?? maxEndTime);
|
|
224
247
|
|
|
225
248
|
// Include ALL correlated events on the span so the sidebar detail view
|
|
226
249
|
// can display them. The timeline uses the `showVerticalLine` flag to
|
|
227
250
|
// determine which events appear as markers.
|
|
228
|
-
const events = convertEventsToSpanEvents(stepEvents, false
|
|
251
|
+
const events = convertEventsToSpanEvents(stepEvents, false, {
|
|
252
|
+
preferOccurredAt: true,
|
|
253
|
+
});
|
|
229
254
|
|
|
230
|
-
// Use
|
|
231
|
-
//
|
|
232
|
-
const
|
|
255
|
+
// Use the event occurrence timestamp for step spans when it is available,
|
|
256
|
+
// falling back to the ingest timestamp used by older event streams.
|
|
257
|
+
const spanStartEvent =
|
|
258
|
+
stepEvents.find((event) => event.eventType === 'step_created') ??
|
|
259
|
+
stepEvents[0];
|
|
260
|
+
const spanStartTime =
|
|
261
|
+
getEventTimestamp(spanStartEvent) ?? new Date(step.createdAt);
|
|
233
262
|
let activeStartTime = step.startedAt ? new Date(step.startedAt) : undefined;
|
|
234
263
|
const firstStartEvent = stepEvents.find(
|
|
235
264
|
(event) => event.eventType === 'step_started'
|
|
236
265
|
);
|
|
237
266
|
if (firstStartEvent) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
267
|
+
activeStartTime =
|
|
268
|
+
getEventTimestamp(firstStartEvent) ?? new Date(firstStartEvent.createdAt);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
let endTime = new Date(maxEndTime);
|
|
272
|
+
if (step.completedAt) {
|
|
273
|
+
const completedEvent = stepEvents
|
|
274
|
+
.slice()
|
|
275
|
+
.reverse()
|
|
276
|
+
.find((event) => isTerminalStepEventType(event.eventType));
|
|
277
|
+
endTime = getEventTimestamp(completedEvent) ?? new Date(step.completedAt);
|
|
242
278
|
}
|
|
243
279
|
|
|
244
280
|
return {
|
|
@@ -291,10 +327,10 @@ export const hookEventsToHookEntity = (
|
|
|
291
327
|
hookId: createdEvent.correlationId,
|
|
292
328
|
runId: createdEvent.runId,
|
|
293
329
|
token: createdEvent.eventData?.token,
|
|
294
|
-
createdAt: createdEvent.createdAt,
|
|
330
|
+
createdAt: getEventTimestamp(createdEvent) ?? createdEvent.createdAt,
|
|
295
331
|
receivedCount: receivedEvents.length,
|
|
296
|
-
lastReceivedAt: lastReceivedEvent
|
|
297
|
-
disposedAt: disposedEvents.at(-1)
|
|
332
|
+
lastReceivedAt: getEventTimestamp(lastReceivedEvent),
|
|
333
|
+
disposedAt: getEventTimestamp(disposedEvents.at(-1)),
|
|
298
334
|
};
|
|
299
335
|
};
|
|
300
336
|
|
|
@@ -314,7 +350,7 @@ export function hookToSpan(hookEvents: Event[], maxEndTime: Date): Span | null {
|
|
|
314
350
|
|
|
315
351
|
return {
|
|
316
352
|
spanId: String(hook.hookId),
|
|
317
|
-
name: String(hook.hookId),
|
|
353
|
+
name: hook.token ?? String(hook.hookId),
|
|
318
354
|
kind: 1, // INTERNAL span kind
|
|
319
355
|
resource: 'hook',
|
|
320
356
|
library: WORKFLOW_LIBRARY,
|
|
@@ -342,21 +378,50 @@ export function runToSpan(
|
|
|
342
378
|
): Span {
|
|
343
379
|
const now = nowTime ?? new Date();
|
|
344
380
|
|
|
381
|
+
// Prefer the event occurrence timestamp when available so the root span
|
|
382
|
+
// lines up with child spans that already use event occurrence time.
|
|
383
|
+
const runCreatedEvent = runEvents.find(
|
|
384
|
+
(event) => event.eventType === 'run_created'
|
|
385
|
+
);
|
|
386
|
+
const runStartedEvent = runEvents.find(
|
|
387
|
+
(event) => event.eventType === 'run_started'
|
|
388
|
+
);
|
|
389
|
+
const terminalEvent = runEvents
|
|
390
|
+
.slice()
|
|
391
|
+
.reverse()
|
|
392
|
+
.find(
|
|
393
|
+
(event) =>
|
|
394
|
+
event.eventType === 'run_completed' ||
|
|
395
|
+
event.eventType === 'run_failed' ||
|
|
396
|
+
event.eventType === 'run_cancelled'
|
|
397
|
+
);
|
|
398
|
+
const spanStartTime =
|
|
399
|
+
getEventTimestamp(runCreatedEvent) ?? new Date(run.createdAt);
|
|
400
|
+
const activeStartTime =
|
|
401
|
+
getEventTimestamp(runStartedEvent) ??
|
|
402
|
+
(run.startedAt ? new Date(run.startedAt) : undefined);
|
|
403
|
+
const completedAt =
|
|
404
|
+
getEventTimestamp(terminalEvent) ?? run.completedAt ?? undefined;
|
|
405
|
+
const endTime = completedAt ?? now;
|
|
406
|
+
|
|
345
407
|
// Only embed identification fields — not the full object with
|
|
346
|
-
// input/output/error which may contain non-cloneable types.
|
|
408
|
+
// input/output/error which may contain non-cloneable types. Lifecycle
|
|
409
|
+
// timestamps are event-derived so detail rows align with the span timeline.
|
|
347
410
|
const { input: _i, output: _o, error: _e, ...runIdentity } = run;
|
|
348
411
|
const attributes = {
|
|
349
412
|
resource: 'run' as const,
|
|
350
|
-
data:
|
|
413
|
+
data: {
|
|
414
|
+
...runIdentity,
|
|
415
|
+
createdAt: spanStartTime,
|
|
416
|
+
startedAt: activeStartTime,
|
|
417
|
+
completedAt,
|
|
418
|
+
},
|
|
351
419
|
};
|
|
352
420
|
|
|
353
|
-
// Use createdAt as span start time, with activeStartTime for when execution began
|
|
354
|
-
const spanStartTime = new Date(run.createdAt);
|
|
355
|
-
const activeStartTime = run.startedAt ? new Date(run.startedAt) : undefined;
|
|
356
|
-
const endTime = run.completedAt ?? now;
|
|
357
|
-
|
|
358
421
|
// Convert run-level events to span events
|
|
359
|
-
const events = convertEventsToSpanEvents(runEvents, false
|
|
422
|
+
const events = convertEventsToSpanEvents(runEvents, false, {
|
|
423
|
+
preferOccurredAt: true,
|
|
424
|
+
});
|
|
360
425
|
|
|
361
426
|
return {
|
|
362
427
|
spanId: String(run.runId),
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import type { RefObject } from 'react';
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
5
|
+
|
|
6
|
+
interface UseIntersectionObserverArgs
|
|
7
|
+
extends Omit<IntersectionObserverInit, 'root'> {
|
|
8
|
+
/**
|
|
9
|
+
* Scroll container the target is observed within. Defaults to the viewport.
|
|
10
|
+
* Passed as a ref so it resolves after commit (when the node exists).
|
|
11
|
+
*/
|
|
12
|
+
rootRef?: RefObject<Element | null>;
|
|
13
|
+
freezeOnceVisible?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Returns the latest IntersectionObserverEntry for `elementRef`.
|
|
18
|
+
* Ported from vercel/front's `@vercel/hooks` `useIntersectionObserver`, with
|
|
19
|
+
* `root` threaded as a ref so we can observe inside a custom scroll container.
|
|
20
|
+
*/
|
|
21
|
+
export function useIntersectionObserver(
|
|
22
|
+
elementRef: RefObject<Element | null>,
|
|
23
|
+
{
|
|
24
|
+
threshold = 0,
|
|
25
|
+
rootRef,
|
|
26
|
+
rootMargin = '0%',
|
|
27
|
+
freezeOnceVisible = false,
|
|
28
|
+
}: UseIntersectionObserverArgs = {}
|
|
29
|
+
): IntersectionObserverEntry | undefined {
|
|
30
|
+
const [entry, setEntry] = useState<IntersectionObserverEntry>();
|
|
31
|
+
|
|
32
|
+
const frozen = entry?.isIntersecting && freezeOnceVisible;
|
|
33
|
+
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
const node = elementRef?.current;
|
|
36
|
+
|
|
37
|
+
const hasIOSupport = !!window.IntersectionObserver;
|
|
38
|
+
|
|
39
|
+
if (!hasIOSupport || frozen || !node) return;
|
|
40
|
+
|
|
41
|
+
const updateEntry = ([entry]: IntersectionObserverEntry[]): void => {
|
|
42
|
+
setEntry(entry);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const observer = new IntersectionObserver(updateEntry, {
|
|
46
|
+
threshold,
|
|
47
|
+
root: rootRef?.current ?? null,
|
|
48
|
+
rootMargin,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
observer.observe(node);
|
|
52
|
+
|
|
53
|
+
return () => observer.disconnect();
|
|
54
|
+
}, [elementRef, threshold, rootRef, rootMargin, frozen]);
|
|
55
|
+
|
|
56
|
+
return entry;
|
|
57
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import type { RefObject } from 'react';
|
|
4
|
+
import { useEffect, useRef } from 'react';
|
|
5
|
+
import { useIntersectionObserver } from './use-intersection-observer';
|
|
6
|
+
|
|
7
|
+
interface UseLoadMoreOnScrollOptions {
|
|
8
|
+
hasMore: boolean;
|
|
9
|
+
isLoadingMore: boolean;
|
|
10
|
+
/** Scroll container the sentinel lives in. Defaults to the viewport. */
|
|
11
|
+
rootRef?: RefObject<Element | null>;
|
|
12
|
+
rootMargin?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Triggers `loadMore` when a sentinel element scrolls into view.
|
|
17
|
+
* Returns a ref to attach to an invisible sentinel `<div>` placed after the
|
|
18
|
+
* list content. Ported from vercel/front's `@vercel/hooks`
|
|
19
|
+
* `useLoadMoreOnScroll`.
|
|
20
|
+
*
|
|
21
|
+
* Because it keys off `isIntersecting`/`isLoadingMore`, it self-continues:
|
|
22
|
+
* if the sentinel is still in view once a page finishes loading, the next
|
|
23
|
+
* page is requested automatically.
|
|
24
|
+
*/
|
|
25
|
+
export function useLoadMoreOnScroll(
|
|
26
|
+
loadMore: () => void,
|
|
27
|
+
{
|
|
28
|
+
hasMore,
|
|
29
|
+
isLoadingMore,
|
|
30
|
+
rootRef,
|
|
31
|
+
rootMargin = '400px',
|
|
32
|
+
}: UseLoadMoreOnScrollOptions
|
|
33
|
+
) {
|
|
34
|
+
const sentinelRef = useRef<HTMLDivElement>(null);
|
|
35
|
+
const entry = useIntersectionObserver(sentinelRef, { rootRef, rootMargin });
|
|
36
|
+
|
|
37
|
+
const loadMoreRef = useRef(loadMore);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
loadMoreRef.current = loadMore;
|
|
40
|
+
}, [loadMore]);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (entry?.isIntersecting && hasMore && !isLoadingMore) {
|
|
44
|
+
loadMoreRef.current();
|
|
45
|
+
}
|
|
46
|
+
}, [entry?.isIntersecting, hasMore, isLoadingMore]);
|
|
47
|
+
|
|
48
|
+
return sentinelRef;
|
|
49
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
const QUERY = '(prefers-reduced-motion: reduce)';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Hook that detects whether the user has requested reduced motion and reacts
|
|
9
|
+
* to changes. Mirrors the `prefers-reduced-motion: reduce` media query so
|
|
10
|
+
* components can skip or shorten animations for users with motion
|
|
11
|
+
* sensitivities (e.g. vestibular disorders).
|
|
12
|
+
*
|
|
13
|
+
* @returns `true` if the user prefers reduced motion, `false` otherwise
|
|
14
|
+
*/
|
|
15
|
+
export const useReducedMotion = (): boolean => {
|
|
16
|
+
const [reduced, setReduced] = useState(() => {
|
|
17
|
+
if (typeof window === 'undefined' || !window.matchMedia) return false;
|
|
18
|
+
return window.matchMedia(QUERY).matches;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (typeof window === 'undefined' || !window.matchMedia) return;
|
|
23
|
+
|
|
24
|
+
const media = window.matchMedia(QUERY);
|
|
25
|
+
const onChange = (): void => setReduced(media.matches);
|
|
26
|
+
|
|
27
|
+
media.addEventListener('change', onChange);
|
|
28
|
+
onChange();
|
|
29
|
+
|
|
30
|
+
return () => media.removeEventListener('change', onChange);
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
return reduced;
|
|
34
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
HealthCheckEndpoint,
|
|
3
|
-
HealthCheckResult,
|
|
4
|
-
} from '@workflow/core/runtime';
|
|
1
|
+
export type { HealthCheckResult } from '@workflow/core/runtime';
|
|
5
2
|
export {
|
|
6
3
|
parseStepName,
|
|
7
4
|
parseWorkflowName,
|
|
@@ -33,6 +30,13 @@ export {
|
|
|
33
30
|
materializeSteps,
|
|
34
31
|
materializeWaits,
|
|
35
32
|
} from './lib/event-materialization';
|
|
33
|
+
export {
|
|
34
|
+
type ExactIdSearchResult,
|
|
35
|
+
type ExactWorkflowSearchId,
|
|
36
|
+
type ExactWorkflowSearchIdKind,
|
|
37
|
+
looksLikeWorkflowIdSearchInput,
|
|
38
|
+
parseExactWorkflowSearchId,
|
|
39
|
+
} from './lib/exact-event-search-id';
|
|
36
40
|
export type { Revivers, StreamRef } from './lib/hydration';
|
|
37
41
|
export {
|
|
38
42
|
CLASS_INSTANCE_REF_TYPE,
|
|
@@ -42,6 +46,7 @@ export {
|
|
|
42
46
|
getWebRevivers,
|
|
43
47
|
hasEncryptedFields,
|
|
44
48
|
hydrateResourceIO,
|
|
49
|
+
hydrateResourceIOAsync,
|
|
45
50
|
hydrateResourceIOWithKey,
|
|
46
51
|
isClassInstanceRef,
|
|
47
52
|
isEncryptedMarker,
|
|
@@ -57,6 +62,7 @@ export type { StreamStep } from './lib/utils';
|
|
|
57
62
|
export {
|
|
58
63
|
extractConversation,
|
|
59
64
|
formatDuration,
|
|
65
|
+
formatDurationPrecise,
|
|
60
66
|
identifyStreamSteps,
|
|
61
67
|
isDoStreamStep,
|
|
62
68
|
} from './lib/utils';
|
package/src/lib/cn.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type ClassValue, clsx } from 'clsx';
|
|
2
|
+
import { extendTailwindMerge } from 'tailwind-merge';
|
|
3
|
+
|
|
4
|
+
const twMergeConfig = {
|
|
5
|
+
extend: {
|
|
6
|
+
classGroups: {
|
|
7
|
+
'text-heading': [
|
|
8
|
+
{
|
|
9
|
+
'text-heading': [
|
|
10
|
+
'72',
|
|
11
|
+
'64',
|
|
12
|
+
'56',
|
|
13
|
+
'48',
|
|
14
|
+
'40',
|
|
15
|
+
'32',
|
|
16
|
+
'24',
|
|
17
|
+
'20',
|
|
18
|
+
'16',
|
|
19
|
+
'14',
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
'text-button': [
|
|
24
|
+
{
|
|
25
|
+
'text-button': ['16', '14', '12'],
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
'text-label': [
|
|
29
|
+
{
|
|
30
|
+
'text-label': [
|
|
31
|
+
'20',
|
|
32
|
+
'18',
|
|
33
|
+
'16',
|
|
34
|
+
'14',
|
|
35
|
+
'14-mono',
|
|
36
|
+
'13',
|
|
37
|
+
'13-mono',
|
|
38
|
+
'12',
|
|
39
|
+
'12-mono',
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
'text-copy': [
|
|
44
|
+
{
|
|
45
|
+
'text-copy': ['24', '20', '18', '16', '14', '13', '13-mono'],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
material: [
|
|
49
|
+
{
|
|
50
|
+
material: [
|
|
51
|
+
'base',
|
|
52
|
+
'small',
|
|
53
|
+
'medium',
|
|
54
|
+
'large',
|
|
55
|
+
'tooltip',
|
|
56
|
+
'menu',
|
|
57
|
+
'modal',
|
|
58
|
+
'fullscreen',
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
// Make each category conflict with itself, so e.g. text-heading-32 overrides text-heading-24
|
|
64
|
+
conflictingClassGroups: {
|
|
65
|
+
'text-heading': ['text-heading'],
|
|
66
|
+
'text-button': ['text-button'],
|
|
67
|
+
'text-label': ['text-label'],
|
|
68
|
+
'text-copy': ['text-copy'],
|
|
69
|
+
material: ['material'],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
} as const;
|
|
73
|
+
|
|
74
|
+
type CustomClassGroupIds =
|
|
75
|
+
| 'text-heading'
|
|
76
|
+
| 'text-button'
|
|
77
|
+
| 'text-label'
|
|
78
|
+
| 'text-copy'
|
|
79
|
+
| 'material';
|
|
80
|
+
|
|
81
|
+
const customTwMerge = extendTailwindMerge<CustomClassGroupIds>(twMergeConfig);
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Merges Tailwind class names and resolves any conflicts using `clsx` with `tailwind-merge`.
|
|
85
|
+
*
|
|
86
|
+
* @param inputs - An array of class names to merge.
|
|
87
|
+
* @returns A string of merged and optimized class names.
|
|
88
|
+
*/
|
|
89
|
+
function cn(...classes: ClassValue[]) {
|
|
90
|
+
return customTwMerge(clsx(...classes));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { cn };
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
* Used by run-actions and trace viewer components.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import {
|
|
7
|
+
type Event,
|
|
8
|
+
isTerminalWorkflowRunStatus,
|
|
9
|
+
type WorkflowRunStatus,
|
|
10
|
+
} from '@workflow/world';
|
|
7
11
|
|
|
8
12
|
// Time thresholds for Re-enqueue button visibility
|
|
9
13
|
const STEP_ACTIVITY_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
@@ -140,9 +144,7 @@ export function analyzeEvents(events: Event[] | undefined): EventAnalysis {
|
|
|
140
144
|
export function isTerminalStatus(
|
|
141
145
|
status: WorkflowRunStatus | undefined
|
|
142
146
|
): boolean {
|
|
143
|
-
return (
|
|
144
|
-
status === 'completed' || status === 'failed' || status === 'cancelled'
|
|
145
|
-
);
|
|
147
|
+
return status ? isTerminalWorkflowRunStatus(status) : false;
|
|
146
148
|
}
|
|
147
149
|
|
|
148
150
|
/**
|
|
@@ -10,7 +10,13 @@
|
|
|
10
10
|
* of making separate API calls for each entity type.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import
|
|
13
|
+
import {
|
|
14
|
+
type Event,
|
|
15
|
+
isHookLifecycleEventType,
|
|
16
|
+
isStepEventType,
|
|
17
|
+
isWaitEventType,
|
|
18
|
+
type StepStatus,
|
|
19
|
+
} from '@workflow/world';
|
|
14
20
|
|
|
15
21
|
// ---------------------------------------------------------------------------
|
|
16
22
|
// Materialized entity types
|
|
@@ -60,18 +66,18 @@ export interface MaterializedEntities {
|
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
// ---------------------------------------------------------------------------
|
|
63
|
-
// Helper: group events by correlationId
|
|
69
|
+
// Helper: group events by correlationId
|
|
64
70
|
// ---------------------------------------------------------------------------
|
|
65
71
|
|
|
66
72
|
function groupByCorrelationId(
|
|
67
73
|
events: Event[],
|
|
68
|
-
|
|
74
|
+
matchesEventType: (eventType: string) => boolean
|
|
69
75
|
): Map<string, Event[]> {
|
|
70
76
|
const groups = new Map<string, Event[]>();
|
|
71
77
|
for (const event of events) {
|
|
72
78
|
const cid = event.correlationId;
|
|
73
79
|
if (!cid) continue;
|
|
74
|
-
if (!
|
|
80
|
+
if (!matchesEventType(event.eventType)) continue;
|
|
75
81
|
const existing = groups.get(cid);
|
|
76
82
|
if (existing) {
|
|
77
83
|
existing.push(event);
|
|
@@ -82,6 +88,14 @@ function groupByCorrelationId(
|
|
|
82
88
|
return groups;
|
|
83
89
|
}
|
|
84
90
|
|
|
91
|
+
function getEventTimestamp(event: Event | undefined): Date | undefined {
|
|
92
|
+
const value = event?.occurredAt ?? event?.createdAt;
|
|
93
|
+
if (!value) return undefined;
|
|
94
|
+
|
|
95
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
96
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
97
|
+
}
|
|
98
|
+
|
|
85
99
|
// ---------------------------------------------------------------------------
|
|
86
100
|
// materializeSteps
|
|
87
101
|
// ---------------------------------------------------------------------------
|
|
@@ -93,7 +107,7 @@ function groupByCorrelationId(
|
|
|
93
107
|
* step_created event with no completion yet.
|
|
94
108
|
*/
|
|
95
109
|
export function materializeSteps(events: Event[]): MaterializedStep[] {
|
|
96
|
-
const groups = groupByCorrelationId(events,
|
|
110
|
+
const groups = groupByCorrelationId(events, isStepEventType);
|
|
97
111
|
const steps: MaterializedStep[] = [];
|
|
98
112
|
|
|
99
113
|
for (const [correlationId, stepEvents] of groups) {
|
|
@@ -104,31 +118,31 @@ export function materializeSteps(events: Event[]): MaterializedStep[] {
|
|
|
104
118
|
let attempt = 0;
|
|
105
119
|
let startedAt: Date | undefined;
|
|
106
120
|
let completedAt: Date | undefined;
|
|
107
|
-
let updatedAt = created.createdAt;
|
|
121
|
+
let updatedAt = getEventTimestamp(created) ?? created.createdAt;
|
|
108
122
|
|
|
109
123
|
for (const e of stepEvents) {
|
|
110
124
|
switch (e.eventType) {
|
|
111
125
|
case 'step_started':
|
|
112
126
|
status = 'running';
|
|
113
127
|
attempt += 1;
|
|
114
|
-
if (!startedAt) startedAt = e.createdAt;
|
|
128
|
+
if (!startedAt) startedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
115
129
|
completedAt = undefined;
|
|
116
|
-
updatedAt = e.createdAt;
|
|
130
|
+
updatedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
117
131
|
break;
|
|
118
132
|
case 'step_completed':
|
|
119
133
|
status = 'completed';
|
|
120
|
-
completedAt = e.createdAt;
|
|
121
|
-
updatedAt = e.createdAt;
|
|
134
|
+
completedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
135
|
+
updatedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
122
136
|
break;
|
|
123
137
|
case 'step_failed':
|
|
124
138
|
status = 'failed';
|
|
125
|
-
completedAt = e.createdAt;
|
|
126
|
-
updatedAt = e.createdAt;
|
|
139
|
+
completedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
140
|
+
updatedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
127
141
|
break;
|
|
128
142
|
case 'step_retrying':
|
|
129
143
|
status = 'pending';
|
|
130
144
|
completedAt = undefined;
|
|
131
|
-
updatedAt = e.createdAt;
|
|
145
|
+
updatedAt = getEventTimestamp(e) ?? e.createdAt;
|
|
132
146
|
break;
|
|
133
147
|
}
|
|
134
148
|
}
|
|
@@ -142,7 +156,7 @@ export function materializeSteps(events: Event[]): MaterializedStep[] {
|
|
|
142
156
|
: correlationId,
|
|
143
157
|
status,
|
|
144
158
|
attempt,
|
|
145
|
-
createdAt: created.createdAt,
|
|
159
|
+
createdAt: getEventTimestamp(created) ?? created.createdAt,
|
|
146
160
|
startedAt,
|
|
147
161
|
completedAt,
|
|
148
162
|
updatedAt,
|
|
@@ -161,7 +175,7 @@ export function materializeSteps(events: Event[]): MaterializedStep[] {
|
|
|
161
175
|
* Group hook_* events by correlationId and build Hook-like entities.
|
|
162
176
|
*/
|
|
163
177
|
export function materializeHooks(events: Event[]): MaterializedHook[] {
|
|
164
|
-
const groups = groupByCorrelationId(events,
|
|
178
|
+
const groups = groupByCorrelationId(events, isHookLifecycleEventType);
|
|
165
179
|
const hooks: MaterializedHook[] = [];
|
|
166
180
|
|
|
167
181
|
for (const [correlationId, hookEvents] of groups) {
|
|
@@ -181,10 +195,10 @@ export function materializeHooks(events: Event[]): MaterializedHook[] {
|
|
|
181
195
|
created.eventType === 'hook_created'
|
|
182
196
|
? created.eventData?.token
|
|
183
197
|
: undefined,
|
|
184
|
-
createdAt: created.createdAt,
|
|
198
|
+
createdAt: getEventTimestamp(created) ?? created.createdAt,
|
|
185
199
|
receivedCount: receivedEvents.length,
|
|
186
|
-
lastReceivedAt: lastReceived
|
|
187
|
-
disposedAt: disposed
|
|
200
|
+
lastReceivedAt: getEventTimestamp(lastReceived),
|
|
201
|
+
disposedAt: getEventTimestamp(disposed),
|
|
188
202
|
events: hookEvents,
|
|
189
203
|
});
|
|
190
204
|
}
|
|
@@ -200,7 +214,7 @@ export function materializeHooks(events: Event[]): MaterializedHook[] {
|
|
|
200
214
|
* Group wait_* events by correlationId and build Wait-like entities.
|
|
201
215
|
*/
|
|
202
216
|
export function materializeWaits(events: Event[]): MaterializedWait[] {
|
|
203
|
-
const groups = groupByCorrelationId(events,
|
|
217
|
+
const groups = groupByCorrelationId(events, isWaitEventType);
|
|
204
218
|
const waits: MaterializedWait[] = [];
|
|
205
219
|
|
|
206
220
|
for (const [correlationId, waitEvents] of groups) {
|
|
@@ -213,12 +227,12 @@ export function materializeWaits(events: Event[]): MaterializedWait[] {
|
|
|
213
227
|
waitId: correlationId,
|
|
214
228
|
runId: created.runId,
|
|
215
229
|
status: completed ? 'completed' : 'waiting',
|
|
216
|
-
createdAt: created.createdAt,
|
|
230
|
+
createdAt: getEventTimestamp(created) ?? created.createdAt,
|
|
217
231
|
resumeAt:
|
|
218
232
|
created.eventType === 'wait_created'
|
|
219
233
|
? created.eventData?.resumeAt
|
|
220
234
|
: undefined,
|
|
221
|
-
completedAt: completed
|
|
235
|
+
completedAt: getEventTimestamp(completed),
|
|
222
236
|
events: waitEvents,
|
|
223
237
|
});
|
|
224
238
|
}
|