@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +16 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +196 -85
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -1
- package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/event-list.js +46 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +15 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/split-pane.js +105 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts +36 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.js +254 -0
- package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
- package/dist/components/new-trace-viewer/context.d.ts +15 -0
- package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/context.js +47 -0
- package/dist/components/new-trace-viewer/icons.d.ts +6 -0
- package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/icons.js +15 -0
- package/dist/components/new-trace-viewer/search.d.ts +19 -0
- package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/search.js +134 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +11 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.js +462 -0
- package/dist/components/new-trace-viewer/types.d.ts +3 -0
- package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/types.js +2 -0
- package/dist/components/new-trace-viewer/utils.d.ts +61 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/utils.js +345 -0
- package/dist/components/run-trace-view.js +1 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +129 -102
- package/dist/components/sidebar/attributes-block.d.ts +28 -0
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
- package/dist/components/sidebar/attributes-block.js +81 -0
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +16 -15
- package/dist/components/sidebar/detail-card.d.ts +5 -6
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +32 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +17 -35
- package/dist/components/sidebar/events-list.d.ts +3 -1
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +36 -22
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar-data-context.js +19 -0
- package/dist/components/sidebar/span-detail-merge.d.ts +16 -0
- package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
- package/dist/components/sidebar/span-detail-merge.js +53 -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 +3 -27
- package/dist/components/trace-viewer/components/map.js +1 -1
- package/dist/components/trace-viewer/components/markers.js +1 -1
- package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/node.js +2 -1
- package/dist/components/trace-viewer/components/search-input.js +1 -1
- package/dist/components/trace-viewer/components/search.js +1 -1
- package/dist/components/trace-viewer/components/span-content.js +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
- package/dist/components/trace-viewer/components/span-segments.js +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js +1 -1
- package/dist/components/trace-viewer/components/ui.js +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
- package/dist/components/trace-viewer/context.js +1 -1
- package/dist/components/trace-viewer/index.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/constants.js +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts +3 -3
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +8 -11
- package/dist/components/trace-viewer/util/tree.js +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
- package/dist/components/trace-viewer/worker.js +1 -1
- package/dist/components/trace-viewer-new.d.ts +14 -0
- package/dist/components/trace-viewer-new.d.ts.map +1 -0
- package/dist/components/trace-viewer-new.js +21 -0
- package/dist/components/ui/alert.js +1 -1
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/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 +22 -0
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +103 -13
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +1 -1
- package/dist/components/ui/error-stack-block.d.ts +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/inspector-theme.d.ts +9 -10
- package/dist/components/ui/inspector-theme.d.ts.map +1 -1
- package/dist/components/ui/inspector-theme.js +39 -72
- package/dist/components/ui/kbd.d.ts +6 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +6 -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 +1 -1
- 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-trace-view.d.ts +1 -3
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +11 -13
- package/dist/components/workflow-traces/event-colors.d.ts +1 -0
- package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
- package/dist/components/workflow-traces/event-colors.js +12 -1
- package/dist/components/workflow-traces/trace-colors.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +19 -5
- 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 +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/lib/event-analysis.js +1 -1
- package/dist/lib/event-materialization.js +1 -1
- 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 +6 -0
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +154 -2
- package/dist/lib/stream-display.d.ts +18 -0
- package/dist/lib/stream-display.d.ts.map +1 -0
- package/dist/lib/stream-display.js +30 -0
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts +15 -0
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +29 -3
- package/dist/lib/utils.d.ts +20 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +74 -31
- 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 +484 -1
- package/package.json +10 -5
- package/src/components/event-list-view.tsx +279 -104
- package/src/components/index.ts +7 -0
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +136 -0
- package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
- package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
- package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
- package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
- package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
- package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
- package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +744 -0
- package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
- package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
- package/src/components/new-trace-viewer/context.tsx +90 -0
- package/src/components/new-trace-viewer/icons.tsx +79 -0
- package/src/components/new-trace-viewer/search.ts +178 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +843 -0
- package/src/components/new-trace-viewer/types.ts +2 -0
- package/src/components/new-trace-viewer/utils.test.ts +182 -0
- package/src/components/new-trace-viewer/utils.ts +519 -0
- package/src/components/sidebar/attribute-panel.tsx +194 -240
- package/src/components/sidebar/attributes-block.tsx +173 -0
- package/src/components/sidebar/copyable-data-block.tsx +49 -27
- package/src/components/sidebar/detail-card.tsx +119 -59
- package/src/components/sidebar/entity-detail-panel.tsx +55 -111
- package/src/components/sidebar/events-list.tsx +85 -96
- package/src/components/sidebar/sidebar-data-context.tsx +62 -0
- package/src/components/sidebar/span-detail-merge.ts +65 -0
- package/src/components/stream-viewer.tsx +18 -40
- package/src/components/trace-viewer/components/node.tsx +3 -2
- package/src/components/trace-viewer/trace-viewer.module.css +4 -4
- package/src/components/trace-viewer/util/timing.ts +7 -11
- package/src/components/trace-viewer-new.tsx +55 -0
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/context-card.tsx +784 -0
- package/src/components/ui/data-inspector.tsx +244 -22
- package/src/components/ui/error-stack-block.tsx +84 -55
- package/src/components/ui/icon-button.tsx +53 -0
- package/src/components/ui/inspector-theme.ts +39 -81
- package/src/components/ui/kbd.tsx +21 -0
- package/src/components/ui/timestamp-tooltip.tsx +132 -194
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-trace-view.tsx +19 -15
- package/src/components/workflow-traces/event-colors.ts +12 -0
- package/src/components/workflow-traces/trace-span-construction.ts +24 -5
- 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 +9 -0
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +166 -1
- package/src/lib/stream-display.ts +48 -0
- package/src/lib/trace-builder.ts +34 -2
- package/src/lib/utils.ts +83 -31
- package/src/lib/zstd-browser-decoder.ts +42 -0
- package/src/styles.css +484 -1
- 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/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/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/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-trace-view.js","sourceRoot":"","sources":["../../src/components/workflow-trace-view.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport {\n ChevronDown,\n ChevronUp,\n Clock,\n Copy,\n Info,\n Send,\n Type,\n X,\n XCircle,\n} from 'lucide-react';\nimport type { MouseEvent as ReactMouseEvent, ReactNode } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useToast } from '../lib/toast';\nimport { ErrorBoundary } from './error-boundary';\nimport {\n EntityDetailPanel,\n type SelectedSpanInfo,\n type SpanSelectionInfo,\n} from './sidebar/entity-detail-panel';\nimport { ResolveHookModal } from './sidebar/resolve-hook-modal';\nimport {\n TraceViewerContextProvider,\n TraceViewerTimeline,\n useTraceViewer,\n} from './trace-viewer';\nimport type { Span } from './trace-viewer/types';\nimport { Skeleton } from './ui/skeleton';\nimport { Spinner } from './ui/spinner';\nimport {\n getCustomSpanClassName,\n getCustomSpanEventClassName,\n} from './workflow-traces/trace-colors';\nimport { buildTrace, type TraceWithMeta } from '../lib/trace-builder';\n\n/**\n * While a run is live, continuously grow root.duration and rescale so the\n * trace always fits within the viewport. Individual span widths are grown\n * by each SpanComponent's own useEffect (see node.tsx).\n */\nfunction useLiveTick(isLive: boolean): void {\n const { state, dispatch } = useTraceViewer();\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n if (!isLive) return;\n\n // Grow root.duration on every frame so span rAFs see the latest time\n let rafId = 0;\n const tick = (): void => {\n const { root } = stateRef.current;\n if (root.startTime) {\n const nowMs = Date.now();\n if (nowMs > root.endTime) {\n root.endTime = nowMs;\n root.duration = root.endTime - root.startTime;\n }\n }\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n\n // Re-scale smoothly so the trace fits the viewport as it grows.\n // We dispatch detectBaseScale only when the computed baseScale has\n // changed enough to matter visually (>0.1% shift), avoiding\n // unnecessary React re-renders while keeping things smooth.\n let scaleRafId = 0;\n let lastBaseScale = 0;\n const scaleTick = (): void => {\n const s = stateRef.current;\n if (s.root.duration > 0) {\n const newBaseScale = (s.width - s.scrollbarWidth) / s.root.duration;\n const delta = Math.abs(newBaseScale - lastBaseScale);\n if (delta > lastBaseScale * 0.001 || lastBaseScale === 0) {\n lastBaseScale = newBaseScale;\n dispatch({ type: 'detectBaseScale' });\n }\n }\n scaleRafId = requestAnimationFrame(scaleTick);\n };\n scaleRafId = requestAnimationFrame(scaleTick);\n\n return () => {\n cancelAnimationFrame(rafId);\n cancelAnimationFrame(scaleRafId);\n };\n }, [isLive, dispatch]);\n}\n\nconst DEFAULT_PANEL_WIDTH = 450;\nconst MIN_PANEL_WIDTH = 240;\n\n// ──────────────────────────────────────────────────────────────────────────\n// Right-click context menu for spans\n// ──────────────────────────────────────────────────────────────────────────\n\ntype ResourceType = 'sleep' | 'step' | 'hook' | 'run' | 'unknown';\n\ninterface ContextMenuState {\n x: number;\n y: number;\n spanId: string;\n spanName: string;\n resourceType: ResourceType;\n /** Whether the span represents an active/pending resource (not yet completed) */\n isActive: boolean;\n}\n\ninterface ContextMenuItem {\n label: string;\n icon?: ReactNode;\n action: () => void;\n destructive?: boolean;\n disabled?: boolean;\n}\n\nfunction SpanContextMenu({\n menu,\n items,\n onClose,\n}: {\n menu: ContextMenuState;\n items: ContextMenuItem[];\n onClose: () => void;\n}): ReactNode {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent): void => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n const handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n const handleScroll = (): void => {\n onClose();\n };\n // Use a timeout so we don't close immediately from the same event\n const timeout = setTimeout(() => {\n window.addEventListener('mousedown', handleClick);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('scroll', handleScroll, true);\n }, 0);\n return () => {\n clearTimeout(timeout);\n window.removeEventListener('mousedown', handleClick);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [onClose]);\n\n // Adjust position if menu would overflow viewport\n const [adjustedPos, setAdjustedPos] = useState({ x: menu.x, y: menu.y });\n useEffect(() => {\n const el = menuRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n let { x, y } = menu;\n if (rect.right > window.innerWidth) {\n x = window.innerWidth - rect.width - 8;\n }\n if (rect.bottom > window.innerHeight) {\n y = window.innerHeight - rect.height - 8;\n }\n if (x !== menu.x || y !== menu.y) {\n setAdjustedPos({ x, y });\n }\n }, [menu]);\n\n if (items.length === 0) return null;\n\n return createPortal(\n <div\n ref={menuRef}\n style={{\n position: 'fixed',\n left: adjustedPos.x,\n top: adjustedPos.y,\n zIndex: 99999,\n boxShadow: 'var(--ds-shadow-menu)',\n borderRadius: 12,\n background: 'var(--ds-background-100)',\n padding: 'var(--geist-space-gap-quarter, 4px)',\n fontSize: 14,\n minWidth: 180,\n overflowX: 'hidden',\n overflowY: 'auto',\n }}\n >\n <div\n style={{\n display: 'block',\n color: 'var(--ds-gray-900)',\n fontSize: '0.75rem',\n padding: 'var(--geist-gap-quarter, 4px) var(--geist-space-2x, 8px)',\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 240,\n borderBottom: '1px solid var(--ds-gray-alpha-400)',\n marginBottom: 4,\n }}\n >\n {menu.spanName}\n </div>\n {items.map((item) => (\n <button\n key={item.label}\n type=\"button\"\n style={{\n outline: 'none',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '0 var(--geist-space-2x, 8px)',\n height: 40,\n textDecoration: 'none',\n borderRadius: 6,\n color: item.destructive\n ? 'var(--ds-red-900)'\n : 'var(--ds-gray-1000)',\n width: '100%',\n background: 'transparent',\n border: 'none',\n fontSize: 14,\n textAlign: 'left',\n opacity: item.disabled ? 0.4 : 1,\n transition: 'background 0.15s',\n }}\n disabled={item.disabled}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n 'var(--ds-gray-alpha-100)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n 'transparent';\n }}\n onClick={() => {\n item.action();\n onClose();\n }}\n >\n {item.icon ?? null}\n {item.label}\n </button>\n ))}\n </div>,\n document.body\n );\n}\n\n/** Inner wrapper that has access to the TraceViewer context */\nfunction TraceViewerWithContextMenu({\n trace,\n run,\n isLive,\n onWakeUpSleep,\n onCancelRun,\n onResolveHook,\n onLoadMoreSpans,\n hasMoreSpans = false,\n isLoadingMoreSpans = false,\n children,\n}: {\n trace: { spans: Span[] };\n run: WorkflowRun;\n isLive: boolean;\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n onCancelRun?: (runId: string) => Promise<void>;\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n onLoadMoreSpans?: () => void | Promise<void>;\n hasMoreSpans?: boolean;\n isLoadingMoreSpans?: boolean;\n children: ReactNode;\n}): ReactNode {\n const toast = useToast();\n const { state, dispatch } = useTraceViewer();\n\n // Drive active span widths at 60fps without React re-renders\n useLiveTick(isLive);\n const [contextMenu, setContextMenu] = useState<ContextMenuState | null>(null);\n const [resolveHookTarget, setResolveHookTarget] = useState<{\n hookId: string;\n token: string;\n } | null>(null);\n const [resolvingHook, setResolvingHook] = useState(false);\n // Track hooks resolved in this session so the context menu item hides immediately\n const [resolvedHookIds, setResolvedHookIds] = useState<Set<string>>(\n new Set()\n );\n\n // Build a lookup map: spanId -> span\n const spanLookup = useMemo(() => {\n const map = new Map<string, Span>();\n for (const span of trace.spans) {\n map.set(span.spanId, span);\n }\n return map;\n }, [trace.spans]);\n\n const handleResolveHook = useCallback(\n async (payload: unknown) => {\n if (resolvingHook || !resolveHookTarget || !onResolveHook) return;\n if (!resolveHookTarget.token) {\n toast.error('Unable to resolve hook', {\n description:\n 'Missing hook token. Try refreshing the run data and retry.',\n });\n return;\n }\n try {\n setResolvingHook(true);\n await onResolveHook(resolveHookTarget.token, payload);\n toast.success('Hook resolved', {\n description: 'The payload has been sent and the hook resolved.',\n });\n // Mark this hook as resolved locally so the menu item hides immediately\n setResolvedHookIds((prev) =>\n new Set(prev).add(resolveHookTarget.hookId)\n );\n setResolveHookTarget(null);\n } catch (err) {\n console.error('Failed to resolve hook:', err);\n toast.error('Failed to resolve hook', {\n description:\n err instanceof Error ? err.message : 'An unknown error occurred',\n });\n } finally {\n setResolvingHook(false);\n }\n },\n [onResolveHook, resolveHookTarget, resolvingHook]\n );\n\n const handleContextMenu = useCallback(\n (e: ReactMouseEvent | MouseEvent): void => {\n const target = e.target as HTMLElement;\n const $button = target.closest<HTMLButtonElement>('[data-span-id]');\n if (!$button) return;\n\n const spanId = $button.dataset.spanId;\n if (!spanId) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const span = spanLookup.get(spanId);\n if (!span) return;\n\n const resourceType =\n (span.attributes.resource as ResourceType) ?? 'unknown';\n const spanData = span.attributes.data as\n | Record<string, unknown>\n | undefined;\n const isActive = !spanData?.completedAt && !spanData?.disposedAt;\n\n setContextMenu({\n x: e.clientX,\n y: e.clientY,\n spanId,\n spanName: span.name,\n resourceType,\n isActive,\n });\n },\n [spanLookup]\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const $container = containerRef.current;\n if (!$container) return;\n\n const onContextMenu = (event: MouseEvent): void => {\n handleContextMenu(event);\n };\n $container.addEventListener('contextmenu', onContextMenu);\n\n return () => {\n $container.removeEventListener('contextmenu', onContextMenu);\n };\n }, [handleContextMenu]);\n\n const loadingMoreRef = useRef(false);\n useEffect(() => {\n const timeline = state.timelineRef.current;\n if (!timeline || !onLoadMoreSpans || !hasMoreSpans) {\n return;\n }\n\n const thresholdPx = 200;\n const maybeLoadMore = () => {\n if (loadingMoreRef.current || isLoadingMoreSpans || !hasMoreSpans) {\n return;\n }\n const remaining =\n timeline.scrollHeight - timeline.scrollTop - timeline.clientHeight;\n if (remaining > thresholdPx) {\n return;\n }\n\n loadingMoreRef.current = true;\n Promise.resolve(onLoadMoreSpans()).finally(() => {\n loadingMoreRef.current = false;\n });\n };\n\n timeline.addEventListener('scroll', maybeLoadMore);\n maybeLoadMore();\n return () => {\n timeline.removeEventListener('scroll', maybeLoadMore);\n };\n }, [state.timelineRef, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans]);\n\n const closeMenu = useCallback(() => {\n setContextMenu(null);\n }, []);\n\n const getMenuItems = useCallback(\n (menu: ContextMenuState): ContextMenuItem[] => {\n const items: ContextMenuItem[] = [];\n\n // Sleep-specific: Wake Up (only on active runs)\n const isRunActive = !run.completedAt;\n if (\n menu.resourceType === 'sleep' &&\n menu.isActive &&\n isRunActive &&\n onWakeUpSleep\n ) {\n items.push({\n label: 'Wake Up Sleep',\n icon: <Clock className=\"h-3.5 w-3.5\" />,\n action: () => {\n onWakeUpSleep(run.runId, menu.spanId)\n .then((result) => {\n if (result.stoppedCount > 0) {\n toast.success('Sleep woken up', {\n description: `Woke up ${String(result.stoppedCount)} sleep${result.stoppedCount > 1 ? 's' : ''}`,\n });\n } else {\n toast.info('No active sleeps found', {\n description: 'The sleep may have already completed.',\n });\n }\n })\n .catch((err: unknown) => {\n toast.error('Failed to wake up sleep', {\n description:\n err instanceof Error\n ? err.message\n : 'An unknown error occurred',\n });\n });\n },\n });\n }\n\n // Hook-specific: Resolve Hook (only on active, unresolved hooks)\n if (menu.resourceType === 'hook' && isRunActive && onResolveHook) {\n const span = spanLookup.get(menu.spanId);\n const hookData = span?.attributes?.data as\n | { token?: string; disposedAt?: unknown }\n | undefined;\n // Check data-level disposedAt, span events, AND local resolved state\n const isDisposed =\n Boolean(hookData?.disposedAt) ||\n Boolean(span?.events?.some((e) => e.name === 'hook_disposed')) ||\n resolvedHookIds.has(menu.spanId);\n if (hookData?.token && !isDisposed) {\n items.push({\n label: 'Resolve Hook',\n icon: <Send className=\"h-3.5 w-3.5\" />,\n action: () => {\n setResolveHookTarget({\n hookId: menu.spanId,\n token: hookData.token!,\n });\n },\n });\n }\n }\n\n // Run-specific: Cancel (only on active runs)\n if (menu.resourceType === 'run' && isRunActive && onCancelRun) {\n items.push({\n label: 'Cancel Run',\n icon: <XCircle className=\"h-3.5 w-3.5\" />,\n destructive: true,\n action: () => {\n onCancelRun(run.runId).catch((err: unknown) => {\n toast.error('Failed to cancel run', {\n description:\n err instanceof Error\n ? err.message\n : 'An unknown error occurred',\n });\n });\n },\n });\n }\n\n // Common actions\n items.push({\n label: 'View Details',\n icon: <Info className=\"h-3.5 w-3.5\" />,\n action: () => {\n dispatch({ type: 'select', id: menu.spanId });\n },\n });\n\n items.push({\n label: 'Copy Name',\n icon: <Type className=\"h-3.5 w-3.5\" />,\n action: () => {\n navigator.clipboard\n .writeText(menu.spanName)\n .then(() => {\n toast.success('Name copied to clipboard');\n })\n .catch(() => {\n toast.error('Failed to copy name');\n });\n },\n });\n\n items.push({\n label: 'Copy ID',\n icon: <Copy className=\"h-3.5 w-3.5\" />,\n action: () => {\n navigator.clipboard\n .writeText(menu.spanId)\n .then(() => {\n toast.success('ID copied to clipboard');\n })\n .catch(() => {\n toast.error('Failed to copy ID');\n });\n },\n });\n\n return items;\n },\n [\n dispatch,\n onWakeUpSleep,\n onCancelRun,\n onResolveHook,\n spanLookup,\n resolvedHookIds,\n run.runId,\n run.completedAt,\n ]\n );\n\n return (\n <div className=\"relative w-full h-full\" ref={containerRef}>\n {children}\n {contextMenu ? (\n <SpanContextMenu\n menu={contextMenu}\n items={getMenuItems(contextMenu)}\n onClose={closeMenu}\n />\n ) : null}\n <ResolveHookModal\n isOpen={resolveHookTarget !== null}\n onClose={() => setResolveHookTarget(null)}\n onSubmit={handleResolveHook}\n isSubmitting={resolvingHook}\n />\n </div>\n );\n}\n\n/** Re-export SpanSelectionInfo for consumers */\nexport type { SpanSelectionInfo };\n\n// ---------------------------------------------------------------------------\n// Bridge: reads selected span from trace viewer context and notifies parent\n// ---------------------------------------------------------------------------\n\n/**\n * Bridge component that lives INSIDE the TraceViewerContextProvider and\n * reads the selected span info, passing it up to the parent via callback.\n * This allows the parent to render the detail panel OUTSIDE the context.\n */\nfunction SelectionBridge({\n onSelectionChange,\n}: {\n onSelectionChange: (info: SelectedSpanInfo | null) => void;\n}) {\n const { state } = useTraceViewer();\n const { selected } = state;\n const onSelectionChangeRef = useRef(onSelectionChange);\n onSelectionChangeRef.current = onSelectionChange;\n const prevSpanIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n const currentSpanId = selected?.span.spanId;\n if (currentSpanId === prevSpanIdRef.current) return;\n prevSpanIdRef.current = currentSpanId;\n\n if (selected) {\n onSelectionChangeRef.current({\n data: selected.span.attributes?.data,\n resource: selected.span.attributes?.resource as string | undefined,\n spanId: selected.span.spanId,\n });\n } else {\n onSelectionChangeRef.current(null);\n }\n }, [selected]);\n\n return null;\n}\n\n/**\n * Bridge component to deselect from outside the context.\n */\nfunction DeselectBridge({ triggerDeselect }: { triggerDeselect: number }) {\n const { dispatch } = useTraceViewer();\n\n useEffect(() => {\n if (triggerDeselect > 0) {\n dispatch({ type: 'deselect' });\n }\n }, [triggerDeselect, dispatch]);\n\n return null;\n}\n\n/**\n * Bridge component to select a span from outside the context.\n */\nfunction SelectBridge({\n selectRequest,\n}: {\n selectRequest: { id: string; token: number } | null;\n}) {\n const { dispatch } = useTraceViewer();\n\n useEffect(() => {\n if (selectRequest?.id) {\n dispatch({ type: 'select', id: selectRequest.id });\n }\n }, [dispatch, selectRequest]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Panel chrome (header with name/duration, close button)\n// ---------------------------------------------------------------------------\n\nfunction PanelResizeHandle({\n onResize,\n}: {\n onResize: (deltaX: number) => void;\n}) {\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n let lastX = e.clientX;\n const onPointerMove = (moveEvent: PointerEvent) => {\n const deltaX = lastX - moveEvent.clientX;\n lastX = moveEvent.clientX;\n onResize(deltaX);\n };\n const onPointerUp = () => {\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n };\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n },\n [onResize]\n );\n\n return (\n <div\n className=\"absolute left-0 top-0 bottom-0 w-1 cursor-col-resize hover:bg-blue-400/50 z-10\"\n onPointerDown={handlePointerDown}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trace viewer footer — loading / waiting indicator\n// ---------------------------------------------------------------------------\n\nfunction TraceViewerFooter({\n hasMore,\n isLive,\n isInitialLoading,\n}: {\n hasMore: boolean;\n isLive: boolean;\n isInitialLoading: boolean;\n}): ReactNode {\n const style = { color: 'var(--ds-gray-900)' };\n if (hasMore || isInitialLoading) {\n return (\n <div\n className=\"flex items-center justify-center gap-2 py-3 text-xs\"\n style={style}\n >\n <Spinner size={14} />\n Loading more events…\n </div>\n );\n }\n if (isLive) {\n return (\n <div\n className=\"flex items-center justify-center py-3 text-xs\"\n style={style}\n >\n Waiting for more events…\n </div>\n );\n }\n return (\n <div\n className=\"flex items-center justify-center py-3 text-xs\"\n style={style}\n >\n End of run\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport const WorkflowTraceViewer = ({\n run,\n events,\n isLoading,\n error,\n spanDetailData,\n spanDetailLoading,\n spanDetailError,\n onWakeUpSleep,\n onResolveHook,\n onCancelRun,\n onStreamClick,\n onRunClick,\n onSpanSelect,\n onLoadEventData,\n onLoadMoreSpans,\n hasMoreSpans = false,\n isLoadingMoreSpans = false,\n encryptionKey,\n onDecrypt,\n isDecrypting = false,\n hasEncryptedData = false,\n}: {\n run: WorkflowRun;\n events: Event[];\n isLoading?: boolean;\n error?: Error | null;\n spanDetailData?: WorkflowRun | Step | Hook | Event | null;\n spanDetailLoading?: boolean;\n spanDetailError?: Error | null;\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n /** Callback to cancel the current run */\n onCancelRun?: (runId: string) => Promise<void>;\n /** Callback when a stream reference is clicked in the detail panel */\n onStreamClick?: (streamId: string) => void;\n /** Callback when a run reference is clicked in the detail panel */\n onRunClick?: (runId: string) => void;\n /** Callback when a span is selected. */\n onSpanSelect?: (info: SpanSelectionInfo) => void;\n /** Callback to load event data for a specific event (lazy loading in sidebar) */\n onLoadEventData?: (\n correlationId: string,\n eventId: string\n ) => Promise<unknown | null>;\n /** Load next trace page when vertical scroll reaches bottom. */\n onLoadMoreSpans?: () => void | Promise<void>;\n /** Whether trace pagination has more data to load. */\n hasMoreSpans?: boolean;\n /** Whether trace pagination is currently fetching another page. */\n isLoadingMoreSpans?: boolean;\n /** Encryption key (available after Decrypt), threaded to event list for re-loading */\n encryptionKey?: Uint8Array;\n /** Callback to initiate decryption of encrypted run data */\n onDecrypt?: () => void;\n /** Whether the encryption key is currently being fetched */\n isDecrypting?: boolean;\n /** Run-level hint: the run contains encrypted data (from probe). */\n hasEncryptedData?: boolean;\n}) => {\n const toast = useToast();\n const [selectedSpan, setSelectedSpan] = useState<SelectedSpanInfo | null>(\n null\n );\n const [panelWidth, setPanelWidth] = useState(DEFAULT_PANEL_WIDTH);\n const [deselectTrigger, setDeselectTrigger] = useState(0);\n const [selectRequest, setSelectRequest] = useState<{\n id: string;\n token: number;\n } | null>(null);\n\n const isLive = Boolean(run && !run.completedAt);\n\n // Build trace only when actual data changes — no timer-driven rebuilds.\n // Active span widths are animated imperatively by useLiveTick at 60fps.\n const traceWithMeta: TraceWithMeta | undefined = useMemo(() => {\n if (!run?.runId) {\n return undefined;\n }\n return buildTrace(run, events, new Date());\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `new Date()` is intentionally not a dep; useLiveTick handles live growth\n }, [run, events]);\n const trace = traceWithMeta;\n\n useEffect(() => {\n if (error && !isLoading) {\n console.error(error);\n toast.error('Error loading workflow trace data', {\n description: error.message,\n });\n }\n }, [error, isLoading]);\n\n const handleSpanSelect = useCallback(\n (info: SpanSelectionInfo) => {\n onSpanSelect?.(info);\n },\n [onSpanSelect]\n );\n\n const handleSelectionChange = useCallback(\n (info: SelectedSpanInfo | null) => {\n if (info) {\n // Filter raw events by the selected span's correlationId (stepId/hookId)\n // This bypasses the trace worker pipeline entirely.\n const correlationId = info.spanId;\n const rawEvents = correlationId\n ? events.filter((e) => e.correlationId === correlationId)\n : [];\n setSelectedSpan({ ...info, rawEvents });\n } else {\n setSelectedSpan(null);\n }\n },\n [events]\n );\n\n // Keep selected span raw events live as polling updates arrive.\n useEffect(() => {\n const correlationId = selectedSpan?.spanId;\n if (!correlationId) return;\n\n const nextRawEvents = events.filter(\n (e) => e.correlationId === correlationId\n );\n setSelectedSpan((prev) => {\n if (!prev || prev.spanId !== correlationId) {\n return prev;\n }\n\n const prevRawEvents = prev.rawEvents ?? [];\n const isSame =\n prevRawEvents.length === nextRawEvents.length &&\n prevRawEvents.every(\n (event, index) => event.eventId === nextRawEvents[index]?.eventId\n );\n if (isSame) {\n return prev;\n }\n\n return {\n ...prev,\n rawEvents: nextRawEvents,\n };\n });\n }, [events, selectedSpan?.spanId]);\n\n // Reset selected span when navigating to a different run\n useEffect(() => {\n setSelectedSpan(null);\n setDeselectTrigger((n) => n + 1);\n }, [run?.runId]);\n\n const handleClose = useCallback(() => {\n setSelectedSpan(null);\n setDeselectTrigger((n) => n + 1);\n }, []);\n\n const handleResize = useCallback((deltaX: number) => {\n setPanelWidth((w) => Math.max(MIN_PANEL_WIDTH, w + deltaX));\n }, []);\n const selectedSpanIndex = useMemo(() => {\n if (!selectedSpan?.spanId || !trace) return -1;\n return trace.spans.findIndex((span) => span.spanId === selectedSpan.spanId);\n }, [selectedSpan?.spanId, trace]);\n const canSelectPrevSpan = selectedSpanIndex > 0;\n const canSelectNextSpan =\n selectedSpanIndex >= 0 &&\n trace != null &&\n selectedSpanIndex < trace.spans.length - 1;\n const handleSelectPrevSpan = useCallback(() => {\n if (!trace || selectedSpanIndex <= 0) return;\n const targetId = trace.spans[selectedSpanIndex - 1]?.spanId;\n if (!targetId) return;\n setSelectRequest({ id: targetId, token: Date.now() });\n }, [selectedSpanIndex, trace]);\n const handleSelectNextSpan = useCallback(() => {\n if (!trace || selectedSpanIndex < 0) return;\n const targetId = trace.spans[selectedSpanIndex + 1]?.spanId;\n if (!targetId) return;\n setSelectRequest({ id: targetId, token: Date.now() });\n }, [selectedSpanIndex, trace]);\n\n // Get the selected span name for the panel header\n const selectedSpanName = useMemo(() => {\n if (!selectedSpan?.data) return undefined;\n const data = selectedSpan.data as Record<string, unknown>;\n const stepName = data.stepName as string | undefined;\n const workflowName = data.workflowName as string | undefined;\n return (\n (stepName ? parseStepName(stepName)?.shortName : undefined) ??\n (workflowName ? parseWorkflowName(workflowName)?.shortName : undefined) ??\n stepName ??\n workflowName ??\n (data.hookId as string) ??\n 'Details'\n );\n }, [selectedSpan?.data]);\n\n if (!trace) {\n return (\n <div className=\"relative w-full h-full\">\n <div className=\"border-b border-gray-alpha-400 w-full\" />\n <Skeleton className=\"w-full ml-2 mt-1 mb-1 h-[56px]\" />\n <div className=\"p-2 relative w-full\">\n <Skeleton className=\"w-full mt-6 h-[20px]\" />\n <Skeleton className=\"w-[10%] mt-2 ml-6 h-[20px]\" />\n <Skeleton className=\"w-[10%] mt-2 ml-12 h-[20px]\" />\n <Skeleton className=\"w-[20%] mt-2 ml-16 h-[20px]\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"relative w-full h-full flex\">\n {/* Timeline (takes remaining space) */}\n <div className=\"flex-1 min-w-0 relative\">\n <TraceViewerContextProvider\n customSpanClassNameFunc={getCustomSpanClassName}\n customSpanEventClassNameFunc={getCustomSpanEventClassName}\n >\n <SelectionBridge onSelectionChange={handleSelectionChange} />\n <DeselectBridge triggerDeselect={deselectTrigger} />\n <SelectBridge selectRequest={selectRequest} />\n <TraceViewerWithContextMenu\n trace={trace}\n run={run}\n isLive={isLive}\n onWakeUpSleep={onWakeUpSleep}\n onCancelRun={onCancelRun}\n onResolveHook={onResolveHook}\n onLoadMoreSpans={onLoadMoreSpans}\n hasMoreSpans={hasMoreSpans}\n isLoadingMoreSpans={isLoadingMoreSpans}\n >\n <TraceViewerTimeline\n eagerRender\n height=\"100%\"\n isLive={isLive}\n trace={trace}\n knownDurationMs={traceWithMeta?.knownDurationMs}\n hasMoreData={hasMoreSpans || Boolean(isLoading)}\n footer={\n <TraceViewerFooter\n hasMore={hasMoreSpans}\n isLive={isLive}\n isInitialLoading={Boolean(isLoading)}\n />\n }\n />\n </TraceViewerWithContextMenu>\n </TraceViewerContextProvider>\n </div>\n\n {/* Detail panel (rendered outside the context, as a sibling) */}\n {selectedSpan && (\n <div\n className=\"relative border-l flex-shrink-0 flex flex-col\"\n style={{\n width: panelWidth,\n borderColor: 'var(--ds-gray-200)',\n backgroundColor: 'var(--ds-background-100)',\n }}\n >\n <PanelResizeHandle onResize={handleResize} />\n {/* Panel header */}\n <div\n className=\"flex items-center justify-between px-3 py-2 border-y flex-shrink-0\"\n style={{ borderColor: 'var(--ds-gray-200)' }}\n >\n <div className=\"min-w-0 flex-1\">\n <div\n className=\"text-sm font-medium truncate\"\n style={{ color: 'var(--ds-gray-1000)' }}\n title={selectedSpanName}\n >\n {selectedSpanName}\n </div>\n </div>\n <div className=\"flex items-center\">\n <button\n type=\"button\"\n aria-label=\"Previous span\"\n onClick={handleSelectPrevSpan}\n disabled={!canSelectPrevSpan}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 6,\n width: 24,\n height: 24,\n padding: 0,\n borderRadius: 6,\n border: 'none',\n background: 'transparent',\n color: 'var(--ds-gray-700)',\n cursor: canSelectPrevSpan ? 'pointer' : 'not-allowed',\n opacity: canSelectPrevSpan ? 1 : 0.45,\n flexShrink: 0,\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!canSelectPrevSpan) return;\n e.currentTarget.style.background = 'var(--ds-gray-alpha-100)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <ChevronUp size={16} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next span\"\n onClick={handleSelectNextSpan}\n disabled={!canSelectNextSpan}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 2,\n width: 24,\n height: 24,\n padding: 0,\n borderRadius: 6,\n border: 'none',\n background: 'transparent',\n color: 'var(--ds-gray-700)',\n cursor: canSelectNextSpan ? 'pointer' : 'not-allowed',\n opacity: canSelectNextSpan ? 1 : 0.45,\n flexShrink: 0,\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!canSelectNextSpan) return;\n e.currentTarget.style.background = 'var(--ds-gray-alpha-100)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <ChevronDown size={16} />\n </button>\n </div>\n <div\n className=\"flex items-center\"\n style={{\n borderLeft: '1px solid var(--ds-gray-300)',\n marginLeft: 6,\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Close panel\"\n onClick={handleClose}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginLeft: 6,\n width: 24,\n height: 24,\n padding: 0,\n borderRadius: 6,\n border: 'none',\n background: 'transparent',\n color: 'var(--ds-gray-700)',\n cursor: 'pointer',\n flexShrink: 0,\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--ds-gray-alpha-100)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <X size={16} />\n </button>\n </div>\n </div>\n {/* Panel body */}\n <div className=\"flex-1 overflow-y-auto\">\n <ErrorBoundary title=\"Failed to load entity details\">\n <EntityDetailPanel\n run={run}\n onStreamClick={onStreamClick}\n onRunClick={onRunClick}\n spanDetailData={spanDetailData ?? null}\n spanDetailError={spanDetailError}\n spanDetailLoading={spanDetailLoading}\n onSpanSelect={handleSpanSelect}\n onWakeUpSleep={onWakeUpSleep}\n onLoadEventData={onLoadEventData}\n onResolveHook={onResolveHook}\n encryptionKey={encryptionKey}\n onDecrypt={onDecrypt}\n isDecrypting={isDecrypting}\n selectedSpan={selectedSpan}\n hasEncryptedData={hasEncryptedData}\n />\n </ErrorBoundary>\n </div>\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-colors.js","sourceRoot":"","sources":["../../../src/components/workflow-traces/event-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,SAA6B;IAE7B,iBAAiB;IACjB,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC9D,OAAO;YACL,KAAK,EAAE,mBAAmB;YAC1B,UAAU,EAAE,mBAAmB;YAC/B,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,mBAAmB;SAC/B,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,qBAAqB;YAC5B,UAAU,EAAE,qBAAqB;YACjC,MAAM,EAAE,qBAAqB;YAC7B,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,qBAAqB;SACjC,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO;YACL,KAAK,EAAE,sBAAsB;YAC7B,UAAU,EAAE,sBAAsB;YAClC,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,sBAAsB;SAClC,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,OAAO;QACL,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,oBAAoB;QAC5B,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,oBAAoB;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IAClE,8CAA8C;IAC9C,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["/**\n * Color utilities for workflow event markers\n */\n\nimport type { Event } from '@workflow/world';\n\nexport interface EventColorPalette {\n /** Color of the diamond/marker itself */\n color: string;\n /** Background color for hover info popup */\n background: string;\n /** Border color for hover info popup */\n border: string;\n /** Text color for event name in hover popup */\n text: string;\n /** Secondary text color for timestamp in hover popup */\n secondary: string;\n}\n\n/**\n * Get the color palette for an event based on its type\n * - Red for failures (step_failed, run_failed)\n * - Orange/yellow for retries (step_retrying)\n * - Purple for webhook-related events\n * - Blue otherwise (default)\n */\nexport function getEventColor(\n eventType: Event['eventType']\n): EventColorPalette {\n // Failures - Red\n if (eventType === 'step_failed' || eventType === 'run_failed') {\n return {\n color: 'var(--ds-red-600)',\n background: 'var(--ds-red-100)',\n border: 'var(--ds-red-500)',\n text: 'var(--ds-red-900)',\n secondary: 'var(--ds-red-700)',\n };\n }\n\n // Retries - Orange/Yellow\n if (eventType === 'step_retrying') {\n return {\n color: 'var(--ds-amber-600)',\n background: 'var(--ds-amber-100)',\n border: 'var(--ds-amber-500)',\n text: 'var(--ds-amber-900)',\n secondary: 'var(--ds-amber-700)',\n };\n }\n\n // Webhook-related - Purple\n if (\n eventType === 'hook_created' ||\n eventType === 'hook_received' ||\n eventType === 'hook_disposed'\n ) {\n return {\n color: 'var(--ds-purple-600)',\n background: 'var(--ds-purple-100)',\n border: 'var(--ds-purple-500)',\n text: 'var(--ds-purple-900)',\n secondary: 'var(--ds-purple-700)',\n };\n }\n\n // Default - Blue\n return {\n color: 'var(--ds-blue-600)',\n background: 'var(--ds-blue-100)',\n border: 'var(--ds-blue-500)',\n text: 'var(--ds-blue-900)',\n secondary: 'var(--ds-blue-700)',\n };\n}\n\n/**\n * Determine whether to show a vertical line for an event\n * - Show vertical lines for hook-related events\n * - Hide vertical lines for all other workflow events by default\n */\nexport function shouldShowVerticalLine(eventType: Event['eventType']): boolean {\n // Show vertical lines for hook-related events\n if (\n eventType === 'hook_created' ||\n eventType === 'hook_received' ||\n eventType === 'hook_disposed'\n ) {\n return true;\n }\n\n // Hide vertical lines for all other workflow events\n return false;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-colors.js","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,MAAM,MAAM,yCAAyC,CAAC;AAG7D;;GAEG;AACH,SAAS,kBAAkB,CACzB,MAA8C,EAC9C,UAAU,GAAG,KAAK;IAElB,IAAI,UAAU,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,aAAa,CAAC;QAC9B,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,aAAa,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,UAAU,CAAC;QAC3B;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAc,EAAU,EAAE;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,CAAC;IAEtC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAY,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;QAEpC,yCAAyC;QACzC,IAAI,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,SAAS,CAAC;QAC1B,CAAC;QAED,mCAAmC;QACnC,MAAM,UAAU,GAAG,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC;QAClD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAmB,CAAC;QAC/C,OAAO,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,SAAwB,EAChB,EAAE;IACV,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAEvC,uBAAuB;IACvB,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC9D,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,+BAA+B;IAC/B,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,kCAAkC;IAClC,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC,CAAC","sourcesContent":["/**\n * Color utilities for workflow traces\n */\n\nimport type { Step, WorkflowRun } from '@workflow/world';\nimport styles from '../trace-viewer/trace-viewer.module.css';\nimport type { SpanNode, SpanNodeEvent } from '../trace-viewer/types';\n\n/**\n * Get the CSS class name for a workflow entity based on its status\n */\nfunction getStatusClassName(\n status: Step['status'] | WorkflowRun['status'],\n isStripped = false\n): string {\n if (isStripped && status === 'pending') {\n return styles.spanPendingStriped;\n }\n\n switch (status) {\n case 'running':\n return styles.spanRunning;\n case 'pending':\n return styles.spanPending;\n case 'completed':\n return styles.spanCompleted;\n case 'cancelled':\n return styles.spanCancelled;\n case 'failed':\n return styles.spanFailed;\n default:\n return '';\n }\n}\n\n/**\n * Check if a step name indicates it's a sleep step\n */\nfunction isSleepStep(stepName: string): boolean {\n return String(stepName).toLowerCase().endsWith('sleep');\n}\n\n/**\n * Get custom CSS class name for a span based on its attributes\n * This is called dynamically by the trace viewer to style spans\n */\nexport const getCustomSpanClassName = (span: SpanNode): string => {\n const attributes = span.span.attributes;\n const resource = attributes?.resource;\n\n if (resource === 'step') {\n const stepData = attributes.data as Step;\n const stepName = stepData?.stepName;\n\n // DEPRECATED: Check if it's a sleep step\n if (stepName && isSleepStep(stepName)) {\n return styles.spanSleep;\n }\n\n // Regular step - use status colors\n const isStripped = stepData?.status === 'pending';\n return getStatusClassName(stepData?.status, isStripped);\n }\n\n if (resource === 'run') {\n const runData = attributes.data as WorkflowRun;\n return getStatusClassName(runData?.status, false);\n }\n\n if (resource === 'hook') {\n return styles.spanHook;\n }\n\n if (resource === 'sleep') {\n return styles.spanSleep;\n }\n\n // Default: no custom class\n return '';\n};\n\n/**\n * Get custom CSS class name for a span event based on its type\n * This is called dynamically by the trace viewer to style event markers\n */\nexport const getCustomSpanEventClassName = (\n spanEvent: SpanNodeEvent\n): string => {\n const eventName = spanEvent.event.name;\n\n // Failure events - Red\n if (eventName === 'step_failed' || eventName === 'run_failed') {\n return styles.eventFailed;\n }\n\n // Retry events - Orange/Yellow\n if (eventName === 'step_retrying') {\n return styles.eventRetrying;\n }\n\n // Webhook-related events - Purple\n if (\n eventName === 'hook_created' ||\n eventName === 'hook_received' ||\n eventName === 'hook_disposed'\n ) {\n return styles.eventHook;\n }\n\n // Default - Blue\n return styles.eventDefault;\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-span-construction.js","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Functions for constructing OpenTelemetry spans from workflow entities\n */\n\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport type { Event, WorkflowRun } from '@workflow/world';\nimport type { Span, SpanEvent } from '../trace-viewer/types';\nimport { shouldShowVerticalLine } from './event-colors';\nimport { calculateDuration, dateToOtelTime } from './trace-time-utils';\n\nexport const WORKFLOW_LIBRARY = {\n name: 'workflow-development-kit',\n version: '4.0.0',\n};\n\n/**\n * Event types that should be displayed as visual markers in the trace viewer\n */\nconst MARKER_EVENT_TYPES: Set<Event['eventType']> = new Set([\n 'hook_created',\n 'hook_received',\n 'hook_disposed',\n 'step_started',\n 'step_retrying',\n 'step_failed',\n 'run_failed',\n 'wait_created',\n 'wait_completed',\n]);\n\n/**\n * Convert workflow events to span events\n * Only includes events that should be displayed as markers\n */\nexport function convertEventsToSpanEvents(\n events: Event[],\n filterTypes = true\n): SpanEvent[] {\n return events\n .filter((event) =>\n filterTypes ? MARKER_EVENT_TYPES.has(event.eventType) : true\n )\n .map((event) => ({\n name: event.eventType,\n timestamp: dateToOtelTime(event.createdAt),\n attributes: {\n eventId: event.eventId,\n correlationId: event.correlationId,\n eventData: 'eventData' in event ? event.eventData : undefined,\n },\n // Control whether to show vertical line in timeline\n showVerticalLine: shouldShowVerticalLine(event.eventType),\n }));\n}\n\nexport const waitEventsToWaitEntity = (\n events: Event[]\n): {\n waitId: string;\n runId: string;\n createdAt: Date;\n resumeAt: Date;\n completedAt?: Date;\n} | null => {\n const startEvent = events.find((event) => event.eventType === 'wait_created');\n if (!startEvent) {\n return null;\n }\n const completedEvent = events.find(\n (event) => event.eventType === 'wait_completed'\n );\n return {\n waitId: startEvent.correlationId,\n runId: startEvent.runId,\n createdAt: startEvent.createdAt,\n resumeAt: startEvent.eventData?.resumeAt,\n completedAt: completedEvent?.createdAt,\n };\n};\n\n/**\n * Converts a workflow Wait to an OpenTelemetry Span\n */\nexport function waitToSpan(events: Event[], maxEndTime: Date): Span | null {\n const wait = waitEventsToWaitEntity(events);\n if (!wait) {\n return null;\n }\n const startTime = wait.createdAt;\n const endTime = wait.completedAt ?? maxEndTime;\n const start = dateToOtelTime(startTime);\n const end = dateToOtelTime(endTime);\n const duration = calculateDuration(startTime, endTime);\n const spanEvents = convertEventsToSpanEvents(events, false);\n return {\n spanId: wait.waitId,\n name: 'sleep',\n kind: 1, // INTERNAL span kind\n resource: 'sleep',\n library: WORKFLOW_LIBRARY,\n status: { code: 0 },\n traceFlags: 1,\n attributes: {\n resource: 'sleep' as const,\n data: wait, // wait is a plain object built from events, no non-cloneable types\n },\n links: [],\n events: spanEvents,\n duration,\n startTime: start,\n endTime: end,\n };\n}\n\nexport const stepEventsToStepEntity = (\n events: Event[]\n): {\n stepId: string;\n runId: string;\n stepName: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n attempt: number;\n createdAt: Date;\n updatedAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n specVersion?: number;\n} | null => {\n const createdEvent = events.find(\n (event) => event.eventType === 'step_created'\n );\n\n // V1 runs don't emit step_created events. Fall back to the earliest event\n // in the group so we can still build a step span.\n const anchorEvent = createdEvent ?? events[0];\n if (!anchorEvent) {\n return null;\n }\n\n // Walk events in order to derive status, attempt count, and timestamps.\n // Handles both step_retrying and consecutive step_started as retry signals.\n let status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled' =\n 'pending';\n let attempt = 0;\n let startedAt: Date | undefined;\n let completedAt: Date | undefined;\n\n for (const e of events) {\n switch (e.eventType) {\n case 'step_started':\n status = 'running';\n attempt += 1;\n if (!startedAt) startedAt = e.createdAt;\n completedAt = undefined;\n break;\n case 'step_completed':\n status = 'completed';\n completedAt = e.createdAt;\n break;\n case 'step_failed':\n status = 'failed';\n completedAt = e.createdAt;\n break;\n case 'step_retrying':\n status = 'pending';\n completedAt = undefined;\n break;\n }\n }\n\n // Ensure at least attempt 1 if we never saw step_started\n if (attempt === 0) attempt = 1;\n\n const lastEvent = events[events.length - 1];\n return {\n stepId: anchorEvent.correlationId ?? '',\n runId: anchorEvent.runId,\n stepName: createdEvent?.eventData?.stepName ?? '',\n status,\n attempt,\n createdAt: anchorEvent.createdAt,\n updatedAt: lastEvent?.createdAt ?? anchorEvent.createdAt,\n startedAt,\n completedAt,\n specVersion: anchorEvent.specVersion,\n };\n};\n\n/**\n * Converts step events to an OpenTelemetry Span\n */\nexport function stepToSpan(stepEvents: Event[], maxEndTime: Date): Span | null {\n const step = stepEventsToStepEntity(stepEvents);\n if (!step) {\n return null;\n }\n const parsedName = parseStepName(String(step.stepName));\n\n const attributes = {\n resource: 'step' as const,\n data: step,\n };\n\n const resource = 'step';\n const endTime = new Date(step.completedAt ?? maxEndTime);\n\n // Include ALL correlated events on the span so the sidebar detail view\n // can display them. The timeline uses the `showVerticalLine` flag to\n // determine which events appear as markers.\n const events = convertEventsToSpanEvents(stepEvents, false);\n\n // Use createdAt as span start time, with activeStartTime for when execution began\n // This allows visualization of the \"queued\" period before execution\n const spanStartTime = new Date(step.createdAt);\n let activeStartTime = step.startedAt ? new Date(step.startedAt) : undefined;\n const firstStartEvent = stepEvents.find(\n (event) => event.eventType === 'step_started'\n );\n if (firstStartEvent) {\n // `step.startedAt` is the server-side creation timestamp, and `event.createdAt` is\n // the client-side creation timestamp. For now, to align the event marker with the\n // line we show for step.startedAt, we overwrite here to always use client-side time.\n activeStartTime = new Date(firstStartEvent.createdAt);\n }\n\n return {\n spanId: String(step.stepId),\n name: parsedName?.shortName ?? String(step.stepName),\n kind: 1, // INTERNAL span kind\n resource,\n library: WORKFLOW_LIBRARY,\n status: { code: 0 },\n traceFlags: 1,\n attributes,\n links: [],\n events,\n startTime: dateToOtelTime(spanStartTime),\n endTime: dateToOtelTime(endTime),\n duration: calculateDuration(spanStartTime, endTime),\n // Only set activeStartTime if it differs from startTime (i.e., there was a queued period)\n activeStartTime:\n activeStartTime && activeStartTime.getTime() > spanStartTime.getTime()\n ? dateToOtelTime(activeStartTime)\n : undefined,\n };\n}\n\nexport const hookEventsToHookEntity = (\n events: Event[]\n): {\n hookId: string;\n runId: string;\n token?: string;\n createdAt: Date;\n receivedCount: number;\n lastReceivedAt?: Date;\n disposedAt?: Date;\n} | null => {\n const createdEvent = events.find(\n (event) => event.eventType === 'hook_created'\n );\n if (!createdEvent) {\n return null;\n }\n const receivedEvents = events.filter(\n (event) => event.eventType === 'hook_received'\n );\n const disposedEvents = events.filter(\n (event) => event.eventType === 'hook_disposed'\n );\n const lastReceivedEvent = receivedEvents.at(-1);\n return {\n hookId: createdEvent.correlationId,\n runId: createdEvent.runId,\n token: createdEvent.eventData?.token,\n createdAt: createdEvent.createdAt,\n receivedCount: receivedEvents.length,\n lastReceivedAt: lastReceivedEvent?.createdAt || undefined,\n disposedAt: disposedEvents.at(-1)?.createdAt || undefined,\n };\n};\n\n/**\n * Converts a workflow Hook to an OpenTelemetry Span\n */\nexport function hookToSpan(hookEvents: Event[], maxEndTime: Date): Span | null {\n const hook = hookEventsToHookEntity(hookEvents);\n if (!hook) {\n return null;\n }\n\n // Convert hook-related events to span events\n const events = convertEventsToSpanEvents(hookEvents, false);\n\n const endTime = hook.disposedAt || maxEndTime;\n\n return {\n spanId: String(hook.hookId),\n name: String(hook.hookId),\n kind: 1, // INTERNAL span kind\n resource: 'hook',\n library: WORKFLOW_LIBRARY,\n status: { code: 1 },\n traceFlags: 1,\n attributes: {\n resource: 'hook' as const,\n data: hook,\n },\n links: [],\n events,\n startTime: dateToOtelTime(hook.createdAt),\n endTime: dateToOtelTime(endTime),\n duration: calculateDuration(hook.createdAt, endTime),\n };\n}\n\n/**\n * Creates a root span for the workflow run\n */\nexport function runToSpan(\n run: WorkflowRun,\n runEvents: Event[],\n nowTime?: Date\n): Span {\n const now = nowTime ?? new Date();\n\n // Only embed identification fields — not the full object with\n // input/output/error which may contain non-cloneable types.\n const { input: _i, output: _o, error: _e, ...runIdentity } = run;\n const attributes = {\n resource: 'run' as const,\n data: runIdentity,\n };\n\n // Use createdAt as span start time, with activeStartTime for when execution began\n const spanStartTime = new Date(run.createdAt);\n const activeStartTime = run.startedAt ? new Date(run.startedAt) : undefined;\n const endTime = run.completedAt ?? now;\n\n // Convert run-level events to span events\n const events = convertEventsToSpanEvents(runEvents, false);\n\n return {\n spanId: String(run.runId),\n name: String(parseWorkflowName(run.workflowName)?.shortName ?? '?'),\n kind: 1, // INTERNAL span kind\n resource: 'run',\n library: WORKFLOW_LIBRARY,\n status: { code: 0 },\n traceFlags: 1,\n attributes,\n links: [],\n events,\n startTime: dateToOtelTime(spanStartTime),\n endTime: dateToOtelTime(endTime),\n duration: calculateDuration(spanStartTime, endTime),\n // Only set activeStartTime if it differs from startTime (i.e., there was a queued period)\n activeStartTime:\n activeStartTime && activeStartTime.getTime() > spanStartTime.getTime()\n ? dateToOtelTime(activeStartTime)\n : undefined,\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-time-utils.js","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-time-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAA6B;IAE7B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5C,OAAO,WAAW,GAAG,eAAe,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA8B,EAC9B,GAA4B;IAE5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC","sourcesContent":["/**\n * Time conversion utilities for workflow trace construction\n */\n\n/**\n * Converts a Date to OpenTelemetry time format [seconds, nanoseconds]\n */\nexport function dateToOtelTime(\n date: Date | string | unknown\n): [number, number] {\n if (typeof date === 'string') {\n date = new Date(date);\n }\n if (!date || !(date instanceof Date)) {\n return [0, 0];\n }\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\nexport function otelTimeToMs(time: [number, number]): number {\n const secondsToMs = time[0] * 1_000;\n const nanosecondsToMs = time[1] / 1_000_000;\n return secondsToMs + nanosecondsToMs;\n}\n\n/**\n * Calculates duration in [seconds, nanoseconds] format\n */\nexport function calculateDuration(\n start: Date | string | unknown,\n end: Date | string | unknown\n): [number, number] {\n if (typeof start === 'string') {\n start = new Date(start);\n }\n if (typeof end === 'string') {\n end = new Date(end);\n }\n if (!start || !(start instanceof Date)) {\n return [0, 0];\n }\n const endTime = end && end instanceof Date ? end : new Date();\n const durationMs = endTime.getTime() - start.getTime();\n const seconds = Math.floor(durationMs / 1000);\n const nanoseconds = (durationMs % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-dark-mode.js","sourceRoot":"","sources":["../../src/hooks/use-dark-mode.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAY,EAAE;IACvC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QACxC,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAClD,OAAO,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO;QAE5C,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACzC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;YACzC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,OAAO,CAAC;SAC3B,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\n/**\n * Hook that detects if dark mode is active and reacts to theme changes.\n * Observes the 'dark' class on the document element, which is how\n * next-themes and similar libraries apply the theme.\n *\n * @returns `true` if dark mode is active, `false` otherwise\n */\nexport const useDarkMode = (): boolean => {\n const [isDark, setIsDark] = useState(() => {\n if (typeof document === 'undefined') return false;\n return document.documentElement.classList.contains('dark');\n });\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains('dark'));\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n return isDark;\n};\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAE9D,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC","sourcesContent":["export type {\n HealthCheckEndpoint,\n HealthCheckResult,\n} from '@workflow/core/runtime';\nexport {\n parseStepName,\n parseWorkflowName,\n} from '@workflow/utils/parse-name';\nexport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nexport * from './components';\nexport {\n hookEventsToHookEntity,\n stepEventsToStepEntity,\n waitEventsToWaitEntity,\n} from './components/workflow-traces/trace-span-construction';\nexport type { EventAnalysis } from './lib/event-analysis';\nexport {\n analyzeEvents,\n hasPendingHooksFromEvents,\n hasPendingStepsFromEvents,\n isTerminalStatus,\n shouldShowReenqueueButton,\n} from './lib/event-analysis';\nexport type {\n MaterializedEntities,\n MaterializedHook,\n MaterializedStep,\n MaterializedWait,\n} from './lib/event-materialization';\nexport {\n materializeAll,\n materializeHooks,\n materializeSteps,\n materializeWaits,\n} from './lib/event-materialization';\nexport type { Revivers, StreamRef } from './lib/hydration';\nexport {\n CLASS_INSTANCE_REF_TYPE,\n ClassInstanceRef,\n ENCRYPTED_PLACEHOLDER,\n extractStreamIds,\n getWebRevivers,\n hasEncryptedFields,\n hydrateResourceIO,\n hydrateResourceIOWithKey,\n isClassInstanceRef,\n isEncryptedMarker,\n isStreamId,\n isStreamRef,\n STREAM_REF_TYPE,\n truncateId,\n} from './lib/hydration';\nexport type { ToastAdapter } from './lib/toast';\nexport { ToastProvider, useToast } from './lib/toast';\nexport type { StreamStep } from './lib/utils';\nexport {\n extractConversation,\n formatDuration,\n identifyStreamSteps,\n isDoStreamStep,\n} from './lib/utils';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-analysis.js","sourceRoot":"","sources":["../../src/lib/event-analysis.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared utilities for analyzing workflow events.\n * Used by run-actions and trace viewer components.\n */\n\nimport type { Event, WorkflowRunStatus } from '@workflow/world';\n\n// Time thresholds for Re-enqueue button visibility\nconst STEP_ACTIVITY_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\nconst STEP_IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Result of analyzing events for a workflow run\n */\nexport interface EventAnalysis {\n /** Whether there are pending sleep/wait calls */\n hasPendingSleeps: boolean;\n /** Whether there are pending steps (started but not completed/failed) */\n hasPendingSteps: boolean;\n /** Whether there are pending hooks (created but not disposed) */\n hasPendingHooks: boolean;\n /** Correlation IDs of pending sleeps */\n pendingSleepIds: string[];\n /** Correlation IDs of pending steps */\n pendingStepIds: string[];\n /** Correlation IDs of pending hooks */\n pendingHookIds: string[];\n /** Timestamp of the last step_started or step_retrying event */\n lastStepActivityAt: Date | null;\n /** Timestamp of the last step completion (step_completed or step_failed) */\n lastStepCompletionAt: Date | null;\n}\n\n/**\n * Analyze events to determine pending sleeps, steps, and hooks.\n */\nexport function analyzeEvents(events: Event[] | undefined): EventAnalysis {\n if (!events || events.length === 0) {\n return {\n hasPendingSleeps: false,\n hasPendingSteps: false,\n hasPendingHooks: false,\n pendingSleepIds: [],\n pendingStepIds: [],\n pendingHookIds: [],\n lastStepActivityAt: null,\n lastStepCompletionAt: null,\n };\n }\n\n // Group events by correlation ID for each type\n const waitCreated = new Map<string, Event>();\n const waitCompleted = new Set<string>();\n const stepStarted = new Map<string, Event>();\n const stepCompleted = new Set<string>();\n const hookCreated = new Map<string, Event>();\n const hookDisposed = new Set<string>();\n\n let lastStepActivityAt: Date | null = null;\n let lastStepCompletionAt: Date | null = null;\n\n for (const event of events) {\n const correlationId = event.correlationId;\n if (!correlationId) continue;\n\n switch (event.eventType) {\n // Sleeps/Waits\n case 'wait_created':\n waitCreated.set(correlationId, event);\n break;\n case 'wait_completed':\n waitCompleted.add(correlationId);\n break;\n\n // Steps\n case 'step_started':\n stepStarted.set(correlationId, event);\n if (\n !lastStepActivityAt ||\n new Date(event.createdAt) > lastStepActivityAt\n ) {\n lastStepActivityAt = new Date(event.createdAt);\n }\n break;\n case 'step_retrying':\n if (\n !lastStepActivityAt ||\n new Date(event.createdAt) > lastStepActivityAt\n ) {\n lastStepActivityAt = new Date(event.createdAt);\n }\n break;\n case 'step_completed':\n case 'step_failed':\n stepCompleted.add(correlationId);\n if (\n !lastStepCompletionAt ||\n new Date(event.createdAt) > lastStepCompletionAt\n ) {\n lastStepCompletionAt = new Date(event.createdAt);\n }\n break;\n\n // Hooks\n case 'hook_created':\n hookCreated.set(correlationId, event);\n break;\n case 'hook_disposed':\n hookDisposed.add(correlationId);\n break;\n }\n }\n\n // Find pending items (created but not completed)\n const pendingSleepIds = Array.from(waitCreated.keys()).filter(\n (id) => !waitCompleted.has(id)\n );\n const pendingStepIds = Array.from(stepStarted.keys()).filter(\n (id) => !stepCompleted.has(id)\n );\n const pendingHookIds = Array.from(hookCreated.keys()).filter(\n (id) => !hookDisposed.has(id)\n );\n\n return {\n hasPendingSleeps: pendingSleepIds.length > 0,\n hasPendingSteps: pendingStepIds.length > 0,\n hasPendingHooks: pendingHookIds.length > 0,\n pendingSleepIds,\n pendingStepIds,\n pendingHookIds,\n lastStepActivityAt,\n lastStepCompletionAt,\n };\n}\n\n/**\n * Check if a workflow run status is terminal (completed, failed, or cancelled)\n */\nexport function isTerminalStatus(\n status: WorkflowRunStatus | undefined\n): boolean {\n return (\n status === 'completed' || status === 'failed' || status === 'cancelled'\n );\n}\n\n/**\n * Determine if the Re-enqueue button should be shown without the debug flag.\n *\n * The Re-enqueue button is shown when the workflow appears to be stuck:\n * - The workflow is not in a terminal state\n * - There are no pending sleeps (which would show the Wake up button instead)\n * - There are no pending hooks (which are waiting for external input)\n * - Either:\n * - The last step_started or step_retrying event was >30 minutes ago, OR\n * - There have been no pending steps for >5 minutes (all steps completed/failed)\n */\nexport function shouldShowReenqueueButton(\n events: Event[] | undefined,\n status: WorkflowRunStatus | undefined\n): boolean {\n // Never show if in terminal state\n if (isTerminalStatus(status)) {\n return false;\n }\n\n const analysis = analyzeEvents(events);\n\n // Don't show if there are pending sleeps (Wake up button handles this)\n if (analysis.hasPendingSleeps) {\n return false;\n }\n\n // Don't show if there are pending hooks (waiting for external input)\n if (analysis.hasPendingHooks) {\n return false;\n }\n\n const now = Date.now();\n\n // Check if last step activity was >30 minutes ago\n if (analysis.lastStepActivityAt) {\n const timeSinceLastActivity = now - analysis.lastStepActivityAt.getTime();\n if (timeSinceLastActivity > STEP_ACTIVITY_TIMEOUT_MS) {\n return true;\n }\n }\n\n // Check if there are no pending steps and last completion was >5 minutes ago\n if (!analysis.hasPendingSteps && analysis.lastStepCompletionAt) {\n const timeSinceLastCompletion =\n now - analysis.lastStepCompletionAt.getTime();\n if (timeSinceLastCompletion > STEP_IDLE_TIMEOUT_MS) {\n return true;\n }\n }\n\n // If there's no step activity at all but the run is not terminal,\n // and we've been waiting for a while, show the button\n if (\n !analysis.lastStepActivityAt &&\n !analysis.hasPendingSteps &&\n !analysis.hasPendingSleeps &&\n !analysis.hasPendingHooks\n ) {\n // This case handles runs that haven't started any steps yet\n // but aren't in a terminal state - they might be stuck\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if there are pending steps from an events list.\n */\nexport function hasPendingStepsFromEvents(\n events: Event[] | undefined\n): boolean {\n return analyzeEvents(events).hasPendingSteps;\n}\n\n/**\n * Check if there are pending hooks from an events list.\n */\nexport function hasPendingHooksFromEvents(\n events: Event[] | undefined\n): boolean {\n return analyzeEvents(events).hasPendingHooks;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-materialization.js","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Event materialization helpers.\n *\n * These functions convert a flat list of workflow events into entity-like\n * objects (steps, hooks, waits) by grouping events by correlationId and\n * stitching together lifecycle events.\n *\n * This enables a \"top-down\" data fetching pattern where the client fetches\n * all events for a run once, then materializes entities client-side instead\n * of making separate API calls for each entity type.\n */\n\nimport type { Event, StepStatus } from '@workflow/world';\n\n// ---------------------------------------------------------------------------\n// Materialized entity types\n// ---------------------------------------------------------------------------\n\nexport interface MaterializedStep {\n stepId: string;\n runId: string;\n stepName: string;\n status: StepStatus;\n attempt: number;\n createdAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n updatedAt: Date;\n /** All events for this step, in insertion order */\n events: Event[];\n}\n\nexport interface MaterializedHook {\n hookId: string;\n runId: string;\n token?: string;\n createdAt: Date;\n receivedCount: number;\n lastReceivedAt?: Date;\n disposedAt?: Date;\n /** All events for this hook, in insertion order */\n events: Event[];\n}\n\nexport interface MaterializedWait {\n waitId: string;\n runId: string;\n status: 'waiting' | 'completed';\n createdAt: Date;\n resumeAt?: Date;\n completedAt?: Date;\n /** All events for this wait, in insertion order */\n events: Event[];\n}\n\nexport interface MaterializedEntities {\n steps: MaterializedStep[];\n hooks: MaterializedHook[];\n waits: MaterializedWait[];\n}\n\n// ---------------------------------------------------------------------------\n// Helper: group events by correlationId prefix\n// ---------------------------------------------------------------------------\n\nfunction groupByCorrelationId(\n events: Event[],\n prefixes: string[]\n): Map<string, Event[]> {\n const groups = new Map<string, Event[]>();\n for (const event of events) {\n const cid = event.correlationId;\n if (!cid) continue;\n if (!prefixes.some((p) => cid.startsWith(p))) continue;\n const existing = groups.get(cid);\n if (existing) {\n existing.push(event);\n } else {\n groups.set(cid, [event]);\n }\n }\n return groups;\n}\n\n// ---------------------------------------------------------------------------\n// materializeSteps\n// ---------------------------------------------------------------------------\n\n/**\n * Group step_* events by correlationId and build Step-like entities.\n *\n * Handles partial event lists gracefully: a step may only have a\n * step_created event with no completion yet.\n */\nexport function materializeSteps(events: Event[]): MaterializedStep[] {\n const groups = groupByCorrelationId(events, ['step_']);\n const steps: MaterializedStep[] = [];\n\n for (const [correlationId, stepEvents] of groups) {\n const created = stepEvents.find((e) => e.eventType === 'step_created');\n if (!created) continue;\n\n let status: StepStatus = 'pending';\n let attempt = 0;\n let startedAt: Date | undefined;\n let completedAt: Date | undefined;\n let updatedAt = created.createdAt;\n\n for (const e of stepEvents) {\n switch (e.eventType) {\n case 'step_started':\n status = 'running';\n attempt += 1;\n if (!startedAt) startedAt = e.createdAt;\n completedAt = undefined;\n updatedAt = e.createdAt;\n break;\n case 'step_completed':\n status = 'completed';\n completedAt = e.createdAt;\n updatedAt = e.createdAt;\n break;\n case 'step_failed':\n status = 'failed';\n completedAt = e.createdAt;\n updatedAt = e.createdAt;\n break;\n case 'step_retrying':\n status = 'pending';\n completedAt = undefined;\n updatedAt = e.createdAt;\n break;\n }\n }\n\n steps.push({\n stepId: correlationId,\n runId: created.runId,\n stepName:\n created.eventType === 'step_created'\n ? (created.eventData?.stepName ?? correlationId)\n : correlationId,\n status,\n attempt,\n createdAt: created.createdAt,\n startedAt,\n completedAt,\n updatedAt,\n events: stepEvents,\n });\n }\n\n return steps;\n}\n\n// ---------------------------------------------------------------------------\n// materializeHooks\n// ---------------------------------------------------------------------------\n\n/**\n * Group hook_* events by correlationId and build Hook-like entities.\n */\nexport function materializeHooks(events: Event[]): MaterializedHook[] {\n const groups = groupByCorrelationId(events, ['hook_']);\n const hooks: MaterializedHook[] = [];\n\n for (const [correlationId, hookEvents] of groups) {\n const created = hookEvents.find((e) => e.eventType === 'hook_created');\n if (!created) continue;\n\n const receivedEvents = hookEvents.filter(\n (e) => e.eventType === 'hook_received'\n );\n const disposed = hookEvents.find((e) => e.eventType === 'hook_disposed');\n const lastReceived = receivedEvents.at(-1);\n\n hooks.push({\n hookId: correlationId,\n runId: created.runId,\n token:\n created.eventType === 'hook_created'\n ? created.eventData?.token\n : undefined,\n createdAt: created.createdAt,\n receivedCount: receivedEvents.length,\n lastReceivedAt: lastReceived?.createdAt,\n disposedAt: disposed?.createdAt,\n events: hookEvents,\n });\n }\n\n return hooks;\n}\n\n// ---------------------------------------------------------------------------\n// materializeWaits\n// ---------------------------------------------------------------------------\n\n/**\n * Group wait_* events by correlationId and build Wait-like entities.\n */\nexport function materializeWaits(events: Event[]): MaterializedWait[] {\n const groups = groupByCorrelationId(events, ['wait_']);\n const waits: MaterializedWait[] = [];\n\n for (const [correlationId, waitEvents] of groups) {\n const created = waitEvents.find((e) => e.eventType === 'wait_created');\n if (!created) continue;\n\n const completed = waitEvents.find((e) => e.eventType === 'wait_completed');\n\n waits.push({\n waitId: correlationId,\n runId: created.runId,\n status: completed ? 'completed' : 'waiting',\n createdAt: created.createdAt,\n resumeAt:\n created.eventType === 'wait_created'\n ? created.eventData?.resumeAt\n : undefined,\n completedAt: completed?.createdAt,\n events: waitEvents,\n });\n }\n\n return waits;\n}\n\n// ---------------------------------------------------------------------------\n// materializeAll\n// ---------------------------------------------------------------------------\n\n/**\n * Convenience function that materializes all entity types from a flat\n * event list.\n */\nexport function materializeAll(events: Event[]): MaterializedEntities {\n return {\n steps: materializeSteps(events),\n hooks: materializeHooks(events),\n waits: materializeWaits(events),\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../src/lib/hydration.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Web-specific hydration for o11y display.\n *\n * Browser-safe revivers that use `atob()` for base64 decoding (no Node.js\n * `Buffer` dependency). Produces `ClassInstanceRef` objects and `StreamRef`\n * objects for UI rendering.\n */\n\nimport {\n extractClassName,\n hydrateResourceIO as hydrateResourceIOGeneric,\n isEncryptedData,\n isExpiredStub,\n isRunRef,\n observabilityRevivers,\n type Revivers,\n serializedInstanceToRef,\n} from '@workflow/core/serialization-format';\nimport { EVENT_DATA_REF_FIELDS } from '@workflow/world';\n\n// Re-export types and utilities that consumers need\nexport {\n CLASS_INSTANCE_REF_TYPE,\n ClassInstanceRef,\n ENCRYPTED_PLACEHOLDER,\n extractStreamIds,\n isClassInstanceRef,\n isEncryptedData,\n isRunRef,\n isStreamId,\n isStreamRef,\n type Revivers,\n RUN_REF_TYPE,\n type RunRef,\n STREAM_REF_TYPE,\n type StreamRef,\n serializedInstanceToRef,\n truncateId,\n} from '@workflow/core/serialization-format';\n\n// ---------------------------------------------------------------------------\n// Browser-safe base64 decode\n// ---------------------------------------------------------------------------\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n if (base64 === '' || base64 === '.') {\n return new ArrayBuffer(0);\n }\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n// ---------------------------------------------------------------------------\n// Web revivers (browser-safe, no Buffer dependency)\n// ---------------------------------------------------------------------------\n\n/**\n * Get the web-specific revivers for hydrating serialized data.\n *\n * Uses `atob()` for base64 decoding (no Node.js Buffer dependency).\n * All types are revived as real instances (Date, Map, Set, URL,\n * URLSearchParams, Headers, Error, etc.).\n */\nexport function getWebRevivers(): Revivers {\n function reviveArrayBuffer(value: string): ArrayBuffer {\n return base64ToArrayBuffer(value);\n }\n\n return {\n // O11y-specific revivers (streams, step functions → display objects).\n // Spread FIRST so web-specific overrides below take precedence.\n ...observabilityRevivers,\n\n // Binary types\n ArrayBuffer: reviveArrayBuffer,\n BigInt: (value: string) => BigInt(value),\n BigInt64Array: (value: string) =>\n new BigInt64Array(reviveArrayBuffer(value)),\n BigUint64Array: (value: string) =>\n new BigUint64Array(reviveArrayBuffer(value)),\n Date: (value) => new Date(value),\n Error: (value) => {\n const error = new Error(value.message);\n error.name = value.name;\n error.stack = value.stack;\n return error;\n },\n Float32Array: (value: string) => new Float32Array(reviveArrayBuffer(value)),\n Float64Array: (value: string) => new Float64Array(reviveArrayBuffer(value)),\n Int8Array: (value: string) => new Int8Array(reviveArrayBuffer(value)),\n Int16Array: (value: string) => new Int16Array(reviveArrayBuffer(value)),\n Int32Array: (value: string) => new Int32Array(reviveArrayBuffer(value)),\n Map: (value) => new Map(value),\n RegExp: (value) => new RegExp(value.source, value.flags),\n Set: (value) => new Set(value),\n Uint8Array: (value: string) => new Uint8Array(reviveArrayBuffer(value)),\n Uint8ClampedArray: (value: string) =>\n new Uint8ClampedArray(reviveArrayBuffer(value)),\n Uint16Array: (value: string) => new Uint16Array(reviveArrayBuffer(value)),\n Uint32Array: (value: string) => new Uint32Array(reviveArrayBuffer(value)),\n\n Headers: (value) => new Headers(value),\n Request: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Request: function () {} }.Request!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n method: value.method,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n duplex: value.duplex,\n ...(value.responseWritable\n ? { responseWritable: value.responseWritable }\n : {}),\n });\n return obj;\n },\n Response: (value) => {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { Response: function () {} }.Response!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, {\n status: value.status,\n statusText: value.statusText,\n url: value.url,\n headers: new Headers(value.headers),\n body: value.body,\n redirected: value.redirected,\n type: value.type,\n });\n return obj;\n },\n URL: (value) => new URL(value),\n URLSearchParams: (value) => new URLSearchParams(value === '.' ? '' : value),\n\n // Web-specific overrides for class instances.\n // Create objects with a dynamically-named constructor so that\n // react-inspector shows the class name (it reads constructor.name).\n Class: (value) => `<class:${extractClassName(value.classId)}>`,\n Instance: (value) => {\n // Run instances are rendered as clickable RunRef badges\n const runRef = serializedInstanceToRef(value);\n if (isRunRef(runRef)) {\n return runRef;\n }\n const className = extractClassName(value.classId);\n const data = value.data;\n const props =\n data && typeof data === 'object' ? { ...data } : { value: data };\n // Create a constructor with the right name using computed property\n // so react-inspector's `object.constructor.name` shows the class name.\n // Must use `function` (not arrow) because arrow functions have no .prototype.\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { [className]: function () {} }[className]!;\n const obj = Object.create(ctor.prototype);\n Object.assign(obj, props);\n return obj;\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pre-built web revivers (cached for performance)\n// ---------------------------------------------------------------------------\n\nlet cachedRevivers: Revivers | null = null;\n\nfunction getRevivers(): Revivers {\n if (!cachedRevivers) {\n cachedRevivers = getWebRevivers();\n }\n return cachedRevivers;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Hydrate the serialized data fields of a resource for web display.\n *\n * Uses browser-safe revivers (atob for base64, ClassInstanceRef for\n * custom classes, StreamRef for streams). Call this on data received\n * from the server before passing it to UI components.\n */\nexport function hydrateResourceIO<T>(resource: T): T {\n const hydrated = hydrateResourceIOGeneric(\n resource as any,\n getRevivers()\n ) as T;\n return replaceEncryptedAndExpiredWithMarkers(hydrated);\n}\n\n// ---------------------------------------------------------------------------\n// Encrypted data display markers\n// ---------------------------------------------------------------------------\n\nexport const ENCRYPTED_DISPLAY_NAME = 'Encrypted';\n\n/**\n * Create a display-friendly object for encrypted data.\n *\n * Uses the same named-constructor trick as the Instance reviver so that\n * ObjectInspector renders the constructor name (\"🔒 Encrypted\") with no\n * expandable children. The original encrypted bytes are stored in a\n * non-enumerable property for later decryption.\n */\nfunction createEncryptedMarker(data: Uint8Array): object {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { [ENCRYPTED_DISPLAY_NAME]: function () {} }[\n ENCRYPTED_DISPLAY_NAME\n ]!;\n const obj = Object.create(ctor.prototype);\n // Store original bytes for decryption, but non-enumerable so\n // ObjectInspector doesn't show them as children\n Object.defineProperty(obj, '__encryptedData', {\n value: data,\n enumerable: false,\n configurable: false,\n });\n return obj;\n}\n\n/** Check if a value is an encrypted display marker */\nexport function isEncryptedMarker(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n value.constructor?.name === ENCRYPTED_DISPLAY_NAME\n );\n}\n\n// ---------------------------------------------------------------------------\n// Expired data display markers\n// ---------------------------------------------------------------------------\n\nexport const EXPIRED_DISPLAY_NAME = 'Expired Data';\n\n/**\n * Create a display-friendly object for expired data.\n *\n * Uses the same named-constructor trick as the encrypted marker so that\n * ObjectInspector renders the constructor name (\"Expired Data\") with no\n * expandable children.\n */\nfunction createExpiredMarker(): object {\n // biome-ignore lint/complexity/useArrowFunction: arrow functions have no .prototype\n const ctor = { [EXPIRED_DISPLAY_NAME]: function () {} }[\n EXPIRED_DISPLAY_NAME\n ]!;\n return Object.create(ctor.prototype);\n}\n\n/** Check if a value is an expired data display marker */\nexport function isExpiredMarker(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n value.constructor?.name === EXPIRED_DISPLAY_NAME\n );\n}\n\n/** Replace a single field value with a display marker if it's encrypted or expired. */\nfunction toDisplayMarker(value: unknown): unknown {\n if (isEncryptedData(value)) return createEncryptedMarker(value as Uint8Array);\n if (isExpiredStub(value)) return createExpiredMarker();\n return value;\n}\n\n/**\n * Post-process hydrated resource data: replace encrypted Uint8Array values\n * and expired stubs with display-friendly marker objects in known data fields.\n */\nfunction replaceEncryptedAndExpiredWithMarkers<T>(resource: T): T {\n if (!resource || typeof resource !== 'object') return resource;\n const r = resource as Record<string, unknown>;\n const result = { ...r };\n\n for (const key of ['input', 'output', 'metadata', 'error']) {\n result[key] = toDisplayMarker(result[key]);\n }\n\n if (result.eventData && typeof result.eventData === 'object') {\n const eventType =\n typeof result.eventType === 'string' ? result.eventType : '';\n const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];\n const ed = { ...(result.eventData as Record<string, unknown>) };\n for (const key of refKeys) {\n if (key in ed) {\n ed[key] = toDisplayMarker(ed[key]);\n }\n }\n result.eventData = ed;\n }\n\n return result as T;\n}\n\n/**\n * Hydrate resource data with decryption support.\n *\n * When a key is provided, encrypted fields are decrypted before hydration.\n * This is the async version used when the user clicks \"Decrypt\" in the web UI.\n *\n * Handles both top-level fields (input, output, metadata) and nested\n * eventData subfields per `EVENT_DATA_REF_FIELDS` from `@workflow/world` for that event type.\n */\nexport async function hydrateResourceIOWithKey<T>(\n resource: T,\n key: Uint8Array\n): Promise<T> {\n const { hydrateDataWithKey } = await import(\n '@workflow/core/serialization-format'\n );\n const { importKey } = await import('@workflow/core/encryption');\n const cryptoKey = await importKey(key);\n const revivers = getRevivers();\n\n /** Extract original encrypted bytes from a marker or raw Uint8Array, then decrypt + hydrate */\n async function decryptField(\n value: unknown,\n rev: Revivers,\n k: Awaited<ReturnType<typeof importKey>>\n ): Promise<unknown> {\n // Already-hydrated: encrypted marker with stored bytes\n if (isEncryptedMarker(value)) {\n const raw = (value as any).__encryptedData as Uint8Array;\n return hydrateDataWithKey(raw, rev, k);\n }\n // Raw encrypted Uint8Array (not yet hydrated)\n if (value instanceof Uint8Array) {\n return hydrateDataWithKey(value, rev, k);\n }\n // Not encrypted — return as-is\n return value;\n }\n\n const r = resource as Record<string, unknown>;\n const result = { ...r };\n\n // Decrypt + hydrate top-level serialized fields (runs, steps, hooks)\n for (const field of ['input', 'output', 'metadata', 'error']) {\n if (field in result) {\n result[field] = await decryptField(result[field], revivers, cryptoKey);\n }\n }\n\n // Decrypt + hydrate eventData subfields (events)\n if (result.eventData && typeof result.eventData === 'object') {\n const eventType =\n typeof result.eventType === 'string' ? result.eventType : '';\n const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];\n const eventData = { ...(result.eventData as Record<string, unknown>) };\n for (const field of refKeys) {\n if (field in eventData) {\n eventData[field] = await decryptField(\n eventData[field],\n revivers,\n cryptoKey\n );\n }\n }\n result.eventData = eventData;\n }\n\n return result as T;\n}\n\n/**\n * Check whether a hydrated resource (event, step, run, etc.) contains any\n * encrypted display markers. Inspects the standard top-level fields\n * (`input`, `output`, `error`, `metadata`) as well as the event-type-specific\n * `eventData` ref fields.\n */\nexport function hasEncryptedFields(resource: unknown): boolean {\n if (!resource || typeof resource !== 'object') return false;\n const r = resource as Record<string, unknown>;\n\n for (const key of ['input', 'output', 'metadata', 'error']) {\n if (isEncryptedMarker(r[key])) return true;\n }\n\n if (r.eventData && typeof r.eventData === 'object') {\n const eventType = typeof r.eventType === 'string' ? r.eventType : '';\n const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];\n const ed = r.eventData as Record<string, unknown>;\n for (const key of refKeys) {\n if (key in ed && isEncryptedMarker(ed[key])) return true;\n }\n }\n\n return false;\n}\n"]}
|
package/dist/lib/toast.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toast.js","sourceRoot":"","sources":["../../src/lib/toast.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAQ9C,MAAM,cAAc,GAAiB;IACnC,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;IACtD,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;IAClD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,YAAY,GAAG,aAAa,CAAe,cAAc,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAyB,CACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\nimport { toast as sonnerToast } from 'sonner';\n\nexport interface ToastAdapter {\n success: (message: string, opts?: { description?: string }) => void;\n error: (message: string, opts?: { description?: string }) => void;\n info: (message: string, opts?: { description?: string }) => void;\n}\n\nconst defaultAdapter: ToastAdapter = {\n success: (msg, opts) => sonnerToast.success(msg, opts),\n error: (msg, opts) => sonnerToast.error(msg, opts),\n info: (msg, opts) => sonnerToast.info(msg, opts),\n};\n\nconst ToastContext = createContext<ToastAdapter>(defaultAdapter);\n\n/**\n * Provide a custom toast implementation to web-shared components.\n *\n * When not provided, falls back to sonner (works in packages/web).\n * Host apps like vercel-site can supply their own adapter\n * (e.g. Geist useToasts) so toasts render in the host's toast system.\n */\nexport function ToastProvider({\n toast,\n children,\n}: {\n toast: ToastAdapter;\n children: ReactNode;\n}): ReactNode {\n return (\n <ToastContext.Provider value={toast}>{children}</ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastAdapter {\n return useContext(ToastContext);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-builder.js","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Builds a complete trace from a WorkflowRun and its Events.\n *\n * This module groups raw events by correlation ID and entity type,\n * converts each group into an OpenTelemetry-style Span, and returns\n * a fully-formed Trace ready for the trace viewer.\n */\n\nimport type { Event, WorkflowRun } from '@workflow/world';\nimport type { Span } from '../components/trace-viewer/types';\nimport {\n hookToSpan,\n runToSpan,\n stepToSpan,\n waitToSpan,\n WORKFLOW_LIBRARY,\n} from '../components/workflow-traces/trace-span-construction';\nimport { otelTimeToMs } from '../components/workflow-traces/trace-time-utils';\n\n// ---------------------------------------------------------------------------\n// Event type classifiers\n// ---------------------------------------------------------------------------\n\nexport const isStepEvent = (eventType: string) => eventType.startsWith('step_');\n\nexport const isTimerEvent = (eventType: string) =>\n eventType === 'wait_created' || eventType === 'wait_completed';\n\nexport const isHookLifecycleEvent = (eventType: string) =>\n eventType === 'hook_received' ||\n eventType === 'hook_created' ||\n eventType === 'hook_disposed';\n\n// ---------------------------------------------------------------------------\n// Event grouping\n// ---------------------------------------------------------------------------\n\nexport type GroupedEvents = {\n eventsByStepId: Map<string, Event[]>;\n runLevelEvents: Event[];\n timerEvents: Map<string, Event[]>;\n hookEvents: Map<string, Event[]>;\n};\n\nfunction pushEvent(\n map: Map<string, Event[]>,\n correlationId: string,\n event: Event\n) {\n const existing = map.get(correlationId);\n if (existing) {\n existing.push(event);\n return;\n }\n map.set(correlationId, [event]);\n}\n\nexport function groupEventsByCorrelation(events: Event[]): GroupedEvents {\n const eventsByStepId = new Map<string, Event[]>();\n const runLevelEvents: Event[] = [];\n const timerEvents = new Map<string, Event[]>();\n const hookEvents = new Map<string, Event[]>();\n\n for (const event of events) {\n const correlationId = event.correlationId;\n if (!correlationId) {\n runLevelEvents.push(event);\n continue;\n }\n\n if (isTimerEvent(event.eventType)) {\n pushEvent(timerEvents, correlationId, event);\n continue;\n }\n\n if (isHookLifecycleEvent(event.eventType)) {\n pushEvent(hookEvents, correlationId, event);\n continue;\n }\n\n if (isStepEvent(event.eventType)) {\n pushEvent(eventsByStepId, correlationId, event);\n continue;\n }\n\n runLevelEvents.push(event);\n }\n\n return { eventsByStepId, runLevelEvents, timerEvents, hookEvents };\n}\n\n// ---------------------------------------------------------------------------\n// Trace construction\n// ---------------------------------------------------------------------------\n\n/**\n * Computes the latest known event time from the events list.\n * Active (in-progress) child spans are capped at this time instead of `now`,\n * so they only extend as far as our data goes.\n */\nfunction computeLatestKnownTime(events: Event[], run: WorkflowRun): Date {\n let latest = new Date(run.createdAt).getTime();\n for (const event of events) {\n const t = new Date(event.createdAt).getTime();\n if (t > latest) latest = t;\n }\n return new Date(latest);\n}\n\nfunction buildSpans(\n run: WorkflowRun,\n groupedEvents: GroupedEvents,\n now: Date,\n latestKnownTime: Date\n) {\n // Active child spans cap at latestKnownTime so they don't extend into\n // unknown territory. Even when the run is completed, we may not have loaded\n // all events yet, so always use the latest event we've actually seen.\n const childMaxEnd = latestKnownTime;\n\n const stepSpans = Array.from(groupedEvents.eventsByStepId.values())\n .map((events) => stepToSpan(events, childMaxEnd))\n .filter((span): span is Span => span !== null);\n\n const hookSpans = Array.from(groupedEvents.hookEvents.values())\n .map((events) => hookToSpan(events, childMaxEnd))\n .filter((span): span is Span => span !== null);\n\n const waitSpans = Array.from(groupedEvents.timerEvents.values())\n .map((events) => waitToSpan(events, childMaxEnd))\n .filter((span): span is Span => span !== null);\n\n return {\n runSpan: runToSpan(run, groupedEvents.runLevelEvents, now),\n spans: [...stepSpans, ...hookSpans, ...waitSpans],\n };\n}\n\nfunction cascadeSpans(runSpan: Span, spans: Span[]) {\n const sortedSpans = [\n runSpan,\n ...spans.slice().sort((a, b) => {\n const aStart = otelTimeToMs(a.startTime);\n const bStart = otelTimeToMs(b.startTime);\n return aStart - bStart;\n }),\n ];\n\n return sortedSpans.map((span, index) => {\n const parentSpanId =\n index === 0 ? undefined : String(sortedSpans[index - 1].spanId);\n return {\n ...span,\n parentSpanId,\n };\n });\n}\n\nexport interface TraceWithMeta {\n traceId: string;\n rootSpanId: string;\n spans: Span[];\n resources: { name: string; attributes: Record<string, string> }[];\n /** Duration in ms from trace start to the latest known event. */\n knownDurationMs: number;\n}\n\nexport function buildTrace(\n run: WorkflowRun,\n events: Event[],\n now: Date\n): TraceWithMeta {\n const groupedEvents = groupEventsByCorrelation(events);\n const latestKnownTime = computeLatestKnownTime(events, run);\n const { runSpan, spans } = buildSpans(\n run,\n groupedEvents,\n now,\n latestKnownTime\n );\n const sortedCascadingSpans = cascadeSpans(runSpan, spans);\n\n // Compute known duration relative to trace start\n const traceStartMs = otelTimeToMs(runSpan.startTime);\n const knownDurationMs = latestKnownTime.getTime() - traceStartMs;\n\n return {\n traceId: run.runId,\n rootSpanId: run.runId,\n spans: sortedCascadingSpans,\n resources: [\n {\n name: 'workflow',\n attributes: {\n 'service.name': WORKFLOW_LIBRARY.name,\n },\n },\n ],\n knownDurationMs: Math.max(0, knownDurationMs),\n };\n}\n"]}
|
package/dist/lib/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Step } from '@workflow/world';\nimport type { ModelMessage } from 'ai';\nimport { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nconst durationFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 2,\n});\n\nconst MS_IN_SECOND = 1000;\nconst MS_IN_MINUTE = 60 * MS_IN_SECOND;\nconst MS_IN_HOUR = 60 * MS_IN_MINUTE;\nconst MS_IN_DAY = 24 * MS_IN_HOUR;\n\n/**\n * Formats a duration in milliseconds to a human-readable string.\n *\n * @param ms - Duration in milliseconds\n * @param compact - If true, returns a single-unit format (e.g., \"45s\", \"2.5m\").\n * If false (default), returns multi-part format (e.g., \"1h 30m\", \"2d 5h\").\n *\n * Compact format:\n * - < 1s: shows milliseconds (e.g., \"500ms\")\n * - < 1m: shows seconds (e.g., \"45s\")\n * - < 1h: shows minutes (e.g., \"45m\")\n * - >= 1h: shows hours (e.g., \"2.5h\")\n *\n * Full format:\n * - < 1s: shows milliseconds (e.g., \"500ms\")\n * - < 1m: shows seconds (e.g., \"45.5s\")\n * - >= 1m: shows human-readable format (e.g., \"1h 30m\", \"2d 5h\")\n */\nexport function formatDuration(ms: number, compact = false): string {\n if (ms === 0) {\n return '0';\n }\n\n // For durations less than 1 second, show milliseconds\n if (ms < MS_IN_SECOND) {\n return `${durationFormatter.format(ms)}ms`;\n }\n\n // For durations less than 1 minute, show seconds\n if (ms < MS_IN_MINUTE) {\n return `${durationFormatter.format(ms / MS_IN_SECOND)}s`;\n }\n\n // Compact format: multi-unit without decimals (e.g. \"8m 20s\", \"2h 30m\")\n if (compact) {\n if (ms < MS_IN_HOUR) {\n const m = Math.floor(ms / MS_IN_MINUTE);\n const s = Math.floor((ms % MS_IN_MINUTE) / MS_IN_SECOND);\n return s > 0 ? `${m}m ${s}s` : `${m}m`;\n }\n const h = Math.floor(ms / MS_IN_HOUR);\n const m = Math.floor((ms % MS_IN_HOUR) / MS_IN_MINUTE);\n return m > 0 ? `${h}h ${m}m` : `${h}h`;\n }\n\n // Full format: human-readable multi-part\n const days = Math.floor(ms / MS_IN_DAY);\n const hours = Math.floor((ms % MS_IN_DAY) / MS_IN_HOUR);\n const minutes = Math.floor((ms % MS_IN_HOUR) / MS_IN_MINUTE);\n const seconds = Math.floor((ms % MS_IN_MINUTE) / MS_IN_SECOND);\n\n const parts: string[] = [];\n\n if (days > 0) {\n parts.push(`${days}d`);\n }\n if (hours > 0) {\n parts.push(`${hours}h`);\n }\n if (minutes > 0) {\n parts.push(`${minutes}m`);\n }\n if (hours <= 1 && (seconds > 0 || parts.length === 0)) {\n parts.push(`${seconds}s`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Returns a formatted pagination display string\n * @param currentPage - The current page number\n * @param totalPages - The total number of pages visited so far\n * @param hasMore - Whether there are more pages available\n * @returns Formatted string like \"Page 1 of 3+\" or \"Page 2 of 2\"\n */\nexport function getPaginationDisplay(\n currentPage: number,\n totalPages: number,\n hasMore: boolean\n): string {\n if (hasMore) {\n return `Page ${currentPage} of ${totalPages}+`;\n }\n return `Page ${currentPage} of ${totalPages}`;\n}\n\n// ============================================================================\n// Durable Agent Utilities\n// ============================================================================\n\n/**\n * Check if a step is a doStreamStep (LLM call with conversation input)\n */\nexport function isDoStreamStep(stepName: string): boolean {\n return stepName.endsWith('//doStreamStep');\n}\n\n/**\n * Extract the conversation from a hydrated doStreamStep input.\n * doStreamStep signature: (conversationPrompt, model, writable, tools, options)\n * So input[0] is the conversation.\n */\nexport function extractConversation(stepInput: unknown): ModelMessage[] | null {\n if (!Array.isArray(stepInput) || stepInput.length === 0) {\n return null;\n }\n\n const firstArg = stepInput[0];\n\n if (!Array.isArray(firstArg)) {\n return null;\n }\n\n // Validate it looks like ModelMessage[]\n if (\n !firstArg.every((msg) => msg && typeof msg === 'object' && 'role' in msg)\n ) {\n return null;\n }\n\n return firstArg as ModelMessage[];\n}\n\n/**\n * A doStreamStep with its conversation input extracted\n */\nexport interface StreamStep {\n stepId: string;\n stepName: string;\n displayName: string;\n conversation: ModelMessage[];\n}\n\n/**\n * Identifies all stream steps (doStreamStep) in a run and extracts their conversations.\n */\nexport function identifyStreamSteps(steps: Step[]): StreamStep[] {\n return steps\n .filter((step) => isDoStreamStep(step.stepName))\n .map((step) => {\n const functionName = step.stepName.split('//').pop() ?? 'unknown';\n const conversation = extractConversation(step.input) ?? [];\n\n return {\n stepId: step.stepId,\n stepName: step.stepName,\n displayName: functionName,\n conversation,\n };\n });\n}\n"]}
|