From 9d3e0d7a5457e3bbc7bb84c4d7c0d09bd449b5f5 Mon Sep 17 00:00:00 2001 From: "exe.dev user" Date: Mon, 26 Oct 2026 17:49:33 +0000 Subject: [PATCH] Remove redundant run trace frame --- packages/app/src/features/runs/continuous-trace.tsx | 8 ++++---- packages/app/test/runs.browser.test.mjs | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/app/src/features/runs/continuous-trace.tsx b/packages/app/src/features/runs/continuous-trace.tsx index 98e950e..15585ca 100644 --- a/packages/app/src/features/runs/continuous-trace.tsx +++ b/packages/app/src/features/runs/continuous-trace.tsx @@ -1,5 +1,5 @@ import { traceClasses, EventBody } from "./event-body"; -import { Disclosure, Summary, Card } from "../../shared/ui"; +import { Disclosure, Summary } from "../../shared/ui"; import { useEffect, useLayoutEffect, useMemo, useRef, useState, type TouchEvent } from "react"; import { useInfiniteQuery, useQuery, type InfiniteData } from "@tanstack/react-query"; import { api } from "factorize-api-client"; @@ -135,12 +135,12 @@ export function ContinuousTrace({ runId, revision, active, onReset }: { runId: s return () => { window.removeEventListener("resize", resize); observer.disconnect(); }; }, []); const grouped = conversation(items); - return {trace.error &&

{trace.error.message}

}{trace.isPending &&

Loading conversation…

} -
+ return <>{trace.error &&

{trace.error.message}

}{trace.isPending &&

Loading conversation…

} +
{(pullDistance > 0 || pullLoading) &&

{pullLoading ? "Loading older events…" : pullDistance >= 56 ? "Release to load older events" : `Pull to load older events · ${Math.round((pullDistance / 56) * 100)}%`}

} {!trace.isPending && !grouped.length &&

No assistant messages yet.

}
{grouped.map((item, index) => item.kind === "assistant" ?
: { const key = item.events[0]?.id + ":" + index; const open = event.currentTarget.open; setExpanded(previous => { const next = new Set(previous); open ? next.add(key) : next.delete(key); return next; }); }}>{item.count} Tool Call{item.count === 1 ? "" : "s"}
{item.events.map(event =>
)}
)}
{active &&

Running…

} - ; + ; } diff --git a/packages/app/test/runs.browser.test.mjs b/packages/app/test/runs.browser.test.mjs index 98d9ff6..b2f5843 100644 --- a/packages/app/test/runs.browser.test.mjs +++ b/packages/app/test/runs.browser.test.mjs @@ -135,6 +135,11 @@ test("run trace uses pull-to-load history, preserves the anchor, and never crash }); await page.goto(origin + "/job-runs/" + runId); const scroller = page.locator("[data-run-trace-scroll]"); await page.getByText("Trace 24", { exact: true }).waitFor(); + const tracePanel = page.locator("#run-panel-trace"); + assert.equal(await tracePanel.locator(":scope > section").count(), 0, "trace should not contain a redundant nested section"); + assert.equal(await tracePanel.locator(":scope > [data-run-trace-scroll]").count(), 1, "trace viewport should belong directly to the tab panel"); + const presentation = await scroller.evaluate(element => { const style = getComputedStyle(element); return { border: style.borderWidth, radius: style.borderRadius, padding: style.padding }; }); + assert.equal(presentation.border, "0px"); assert.equal(presentation.radius, "0px"); assert.equal(presentation.padding, "0px"); await page.getByText("1 Tool Call", { exact: true }).click(); assert.equal(await page.getByText("Cannot read properties of null", { exact: false }).count(), 0); const initial = await scroller.evaluate(element => ({ top: element.scrollTop, height: element.scrollHeight, client: element.clientHeight })); @@ -150,5 +155,8 @@ test("run trace uses pull-to-load history, preserves the anchor, and never crash await page.setViewportSize({ width: 900, height: 700 }); const shortHeight = await scroller.evaluate(element => element.clientHeight); await page.setViewportSize({ width: 900, height: 900 }); const tallHeight = await scroller.evaluate(element => element.clientHeight); assert.ok(tallHeight > shortHeight, "trace viewport should resize with the window"); + await page.setViewportSize({ width: 390, height: 700 }); + const mobilePresentation = await scroller.evaluate(element => { const style = getComputedStyle(element); return { border: style.borderWidth, radius: style.borderRadius, padding: style.padding }; }); + assert.equal(mobilePresentation.border, "0px"); assert.equal(mobilePresentation.radius, "0px"); assert.equal(mobilePresentation.padding, "0px"); await context.close(); });