Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
ad8b7f1
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 27, 2026
e0cb61b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 28, 2026
051cadc
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 29, 2026
af8ac1f
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 29, 2026
e68e7d2
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 30, 2026
8305e5b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 30, 2026
f3da688
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 31, 2026
f8ee413
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 1, 2026
589cbd7
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 2, 2026
e979fdf
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 3, 2026
d4baed2
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 6, 2026
53503a4
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 10, 2026
d51e2e4
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 13, 2026
5123088
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 13, 2026
dd1a307
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 13, 2026
00bcfcd
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 14, 2026
f6a157b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 15, 2026
816f35b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 16, 2026
2b87dce
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 17, 2026
146de28
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 18, 2026
0ef6455
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 18, 2026
2d8c690
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 18, 2026
3513471
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 20, 2026
0f5d29e
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 20, 2026
c76001e
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 23, 2026
f97184f
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 24, 2026
f9e6daa
[web-shared] Fix trace viewer pagination issue
karthikscale3 Feb 24, 2026
ca10e1f
[web-shared] Fix trace viewer pagination issue
karthikscale3 Feb 24, 2026
614f197
[web-shared] Fix trace viewer pagination issue
karthikscale3 Feb 24, 2026
f820c7a
[workflow o11y] bump package and fix trace viewer pagination issue
karthikscale3 Feb 24, 2026
0bf1d09
[workflow o11y] bump package and fix trace viewer pagination issue
karthikscale3 Feb 24, 2026
afbf6c8
[web-shared] Fix trace viewer pagination issue
karthikscale3 Feb 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/moody-ghosts-decide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@workflow/web-shared": patch
"@workflow/web": patch
---

Fix traceviewer pagination issues
9 changes: 9 additions & 0 deletions packages/web-shared/src/components/run-trace-view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ interface RunTraceViewProps {
onCancelRun?: (runId: string) => Promise<void>;
onStreamClick?: (streamId: string) => void;
onSpanSelect?: (info: SpanSelectionInfo) => void;
onLoadMoreSpans?: () => void | Promise<void>;
hasMoreSpans?: boolean;
isLoadingMoreSpans?: boolean;
}

export function RunTraceView({
Expand All @@ -44,6 +47,9 @@ export function RunTraceView({
onCancelRun,
onStreamClick,
onSpanSelect,
onLoadMoreSpans,
hasMoreSpans,
isLoadingMoreSpans,
}: RunTraceViewProps) {
if (error && !run) {
return (
Expand Down Expand Up @@ -72,6 +78,9 @@ export function RunTraceView({
onCancelRun={onCancelRun}
onStreamClick={onStreamClick}
onSpanSelect={onSpanSelect}
onLoadMoreSpans={onLoadMoreSpans}
hasMoreSpans={hasMoreSpans}
isLoadingMoreSpans={isLoadingMoreSpans}
/>
</div>
);
Expand Down
51 changes: 50 additions & 1 deletion packages/web-shared/src/components/workflow-trace-view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,9 @@ function TraceViewerWithContextMenu({
onWakeUpSleep,
onCancelRun,
onResolveHook,
onLoadMoreSpans,
hasMoreSpans = false,
isLoadingMoreSpans = false,
children,
}: {
trace: { spans: Span[] };
Expand All @@ -294,9 +297,12 @@ function TraceViewerWithContextMenu({
payload: unknown,
hook?: Hook
) => Promise<void>;
onLoadMoreSpans?: () => void | Promise<void>;
hasMoreSpans?: boolean;
isLoadingMoreSpans?: boolean;
children: ReactNode;
}): ReactNode {
const { dispatch } = useTraceViewer();
const { state, dispatch } = useTraceViewer();

// Drive active span widths at 60fps without React re-renders
useLiveTick(isLive);
Expand Down Expand Up @@ -413,6 +419,37 @@ function TraceViewerWithContextMenu({
};
}, [handleContextMenu]);

const loadingMoreRef = useRef(false);
useEffect(() => {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

loads additional steps as the scroll hits the bottom

const timeline = state.timelineRef.current;
if (!timeline || !onLoadMoreSpans || !hasMoreSpans) {
return;
}

const thresholdPx = 200;
const maybeLoadMore = () => {
if (loadingMoreRef.current || isLoadingMoreSpans || !hasMoreSpans) {
return;
}
const remaining =
timeline.scrollHeight - timeline.scrollTop - timeline.clientHeight;
if (remaining > thresholdPx) {
return;
}

loadingMoreRef.current = true;
Promise.resolve(onLoadMoreSpans()).finally(() => {
loadingMoreRef.current = false;
});
};

timeline.addEventListener('scroll', maybeLoadMore);
maybeLoadMore();
return () => {
timeline.removeEventListener('scroll', maybeLoadMore);
};
}, [state.timelineRef, onLoadMoreSpans, hasMoreSpans, isLoadingMoreSpans]);

const closeMenu = useCallback(() => {
setContextMenu(null);
}, []);
Expand Down Expand Up @@ -853,6 +890,9 @@ export const WorkflowTraceViewer = ({
onStreamClick,
onSpanSelect,
onLoadEventData,
onLoadMoreSpans,
hasMoreSpans = false,
isLoadingMoreSpans = false,
}: {
run: WorkflowRun;
steps: Step[];
Expand Down Expand Up @@ -883,6 +923,12 @@ export const WorkflowTraceViewer = ({
correlationId: string,
eventId: string
) => Promise<unknown | null>;
/** Load next trace page when vertical scroll reaches bottom. */
onLoadMoreSpans?: () => void | Promise<void>;
/** Whether trace pagination has more data to load. */
hasMoreSpans?: boolean;
/** Whether trace pagination is currently fetching another page. */
isLoadingMoreSpans?: boolean;
}) => {
const [selectedSpan, setSelectedSpan] = useState<SelectedSpanInfo | null>(
null
Expand Down Expand Up @@ -1049,6 +1095,9 @@ export const WorkflowTraceViewer = ({
onWakeUpSleep={onWakeUpSleep}
onCancelRun={onCancelRun}
onResolveHook={onResolveHook}
onLoadMoreSpans={onLoadMoreSpans}
hasMoreSpans={hasMoreSpans}
isLoadingMoreSpans={isLoadingMoreSpans}
>
<TraceViewerTimeline
eagerRender
Expand Down
6 changes: 6 additions & 0 deletions packages/web/app/components/run-detail-view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,9 @@ export function RunDetailView({
auxiliaryDataLoading,
error,
update,
loadMoreTraceData,
hasMoreTraceData,
isLoadingMoreTraceData,
} = useWorkflowTraceViewerData(env, runId, { live: true });
const run = runData ?? ({} as WorkflowRun);

Expand Down Expand Up @@ -723,6 +726,9 @@ export function RunDetailView({
onWakeUpSleep={handleWakeUpSleep}
onResolveHook={handleResolveHook}
onLoadEventData={handleLoadSidebarEventData}
onLoadMoreSpans={loadMoreTraceData}
hasMoreSpans={hasMoreTraceData}
isLoadingMoreSpans={isLoadingMoreTraceData}
/>
</div>
</ErrorBoundary>
Expand Down
3 changes: 3 additions & 0 deletions packages/web/app/lib/client/hooks/use-trace-viewer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ vi.mock('~/lib/rpc-client', () => ({
fetchSteps: vi.fn(),
fetchHooks: vi.fn(),
fetchEvents: vi.fn(),
fetchEventsByCorrelationId: vi.fn(),
}));

import type { WorkflowRun } from '@workflow/world';
import {
fetchEvents,
fetchEventsByCorrelationId,
fetchHooks,
fetchRun,
fetchSteps,
Expand Down Expand Up @@ -50,6 +52,7 @@ function emptyPage() {
describe('useWorkflowTraceViewerData', () => {
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(fetchEventsByCorrelationId).mockReturnValue(emptyPage());
});

it('shows complete trace data on load', async () => {
Expand Down
Loading
Loading