@@ -55,6 +55,7 @@ import { TabButton, TabContainer } from "~/components/primitives/Tabs";
5555import { TextLink } from "~/components/primitives/TextLink" ;
5656import { InfoIconTooltip , SimpleTooltip } from "~/components/primitives/Tooltip" ;
5757import { RunTimeline , RunTimelineEvent , SpanTimeline } from "~/components/run/RunTimeline" ;
58+ import { SpanHorizontalTimeline } from "~/components/runs/v3/SpanHorizontalTimeline" ;
5859import { PacketDisplay } from "~/components/runs/v3/PacketDisplay" ;
5960import { RunIcon } from "~/components/runs/v3/RunIcon" ;
6061import { RunTag } from "~/components/runs/v3/RunTag" ;
@@ -289,17 +290,6 @@ function SpanBody({
289290 />
290291 ) }
291292 </ div >
292- { isAiInspector && (
293- < div className = "flex items-center gap-3 pb-1.5 pl-6 text-xs text-text-dimmed" >
294- < DateTime date = { span . startTime } includeSeconds />
295- { span . duration != null && (
296- < >
297- < span className = "text-charcoal-600" > /</ span >
298- < span className = "text-text-bright" > { formatSpanDuration ( span . duration ) } </ span >
299- </ >
300- ) }
301- </ div >
302- ) }
303293 </ div >
304294 { isAiInspector ? (
305295 < SpanEntity span = { span } />
@@ -321,6 +311,7 @@ function formatSpanDuration(nanoseconds: number): string {
321311 return `${ mins } m ${ secs } s` ;
322312}
323313
314+
324315function applySpanOverrides ( span : Span , spanOverrides ?: SpanOverride ) : Span {
325316 if ( ! spanOverrides ) {
326317 return span ;
@@ -1426,17 +1417,39 @@ function SpanEntity({ span }: { span: Span }) {
14261417 aiData = { span . entity . object }
14271418 promptVersionData = { span . entity . promptVersionData }
14281419 rawProperties = { typeof span . properties === "string" ? span . properties : span . properties != null ? JSON . stringify ( span . properties , null , 2 ) : undefined }
1420+ startTime = { span . startTime }
1421+ duration = { span . duration }
14291422 />
14301423 ) ;
14311424 }
14321425 case "ai-tool-call" : {
1433- return < AIToolCallSpanDetails data = { span . entity . object } /> ;
1426+ return (
1427+ < div className = "overflow-y-auto scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600" >
1428+ < div className = "px-3" >
1429+ < SpanHorizontalTimeline startTime = { span . startTime } duration = { span . duration } />
1430+ </ div >
1431+ < AIToolCallSpanDetails data = { span . entity . object } />
1432+ </ div >
1433+ ) ;
14341434 }
14351435 case "ai-embed" : {
1436- return < AIEmbedSpanDetails data = { span . entity . object } /> ;
1436+ return (
1437+ < div className = "overflow-y-auto scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600" >
1438+ < div className = "px-3" >
1439+ < SpanHorizontalTimeline startTime = { span . startTime } duration = { span . duration } />
1440+ </ div >
1441+ < AIEmbedSpanDetails data = { span . entity . object } />
1442+ </ div >
1443+ ) ;
14371444 }
14381445 case "prompt" : {
1439- return < PromptSpanDetails promptData = { span . entity . object } /> ;
1446+ return (
1447+ < PromptSpanDetails
1448+ promptData = { span . entity . object }
1449+ startTime = { span . startTime }
1450+ duration = { span . duration }
1451+ />
1452+ ) ;
14401453 }
14411454 default : {
14421455 assertNever ( span . entity ) ;
0 commit comments