11'use client' ;
22
3- import React , { useState } from 'react' ;
3+ import React , { useState , useEffect } from 'react' ;
44import TraceViewer from '../src/components/TraceViewer' ;
55import TraceCarousel from '../src/components/TraceCarousel' ;
66import { TraceData } from '../src/types/trace' ;
7- import trace1Data from '../src/data/trace1.json' ;
8- import trace2Data from '../src/data/trace2.json' ;
9- import trace3Data from '../src/data/trace3.json' ;
10- import trace4Data from '../src/data/trace4.json' ;
11- import trace5Data from '../src/data/trace5.json' ;
12- import trace6Data from '../src/data/trace6.json' ;
13- import trace7Data from '../src/data/trace7.json' ;
147
158// 获取basePath
169const basePath = process . env . NEXT_PUBLIC_BASE_PATH || '' ;
@@ -27,30 +20,89 @@ const fixAssetPaths = (data: TraceData): TraceData => {
2720 } ;
2821} ;
2922
30- // 应用路径修正
31- const processedTrace1 = fixAssetPaths ( trace1Data as TraceData ) ;
32- const processedTrace2 = fixAssetPaths ( trace2Data as TraceData ) ;
33- const processedTrace3 = fixAssetPaths ( trace3Data as TraceData ) ;
34- const processedTrace4 = fixAssetPaths ( trace4Data as TraceData ) ;
35- const processedTrace5 = fixAssetPaths ( trace5Data as TraceData ) ;
36- const processedTrace6 = fixAssetPaths ( trace6Data as TraceData ) ;
37- const processedTrace7 = fixAssetPaths ( trace7Data as TraceData ) ;
38- // 将所有轨迹数据收集到一个数组中
39- const allTraceData = [
40- processedTrace1 ,
41- processedTrace2 ,
42- processedTrace3 ,
43- processedTrace4 ,
44- processedTrace5 ,
45- processedTrace6 ,
46- processedTrace7
47- ] ;
23+ // 生成traceIds
24+ const generateTraceIds = ( count : number ) : string [ ] => {
25+ return Array . from ( { length : count } , ( _ , i ) => `viewer${ i + 1 } ` ) ;
26+ } ;
27+
28+ // TaskDisplay component to show current task
29+ const TaskDisplay = ( { traceData, activeIndex = 0 , darkMode = true } : { traceData : TraceData | null , activeIndex ?: number , darkMode ?: boolean } ) => {
30+ if ( ! traceData ) {
31+ return null ;
32+ }
4833
49- // 为每个轨迹生成唯一ID
50- const traceIds = [ 'viewer1' , 'viewer2' , 'viewer3' , 'viewer4' , 'viewer5' , 'viewer6' , 'viewer7' ] ;
34+ // 适配夜间/白天模式的样式
35+ const bgClass = darkMode
36+ ? 'bg-gray-900/90 border-blue-500/40 shadow-lg'
37+ : 'bg-white border-blue-500/30 shadow-md' ;
38+ const textClass = darkMode ? 'text-gray-100' : 'text-gray-900' ;
39+ const taskLabelClass = darkMode
40+ ? 'text-blue-300 font-bold tracking-wider mr-2'
41+ : 'text-blue-700 font-bold tracking-wider mr-2' ;
42+ const taskContentClass = darkMode
43+ ? 'font-sans font-medium text-base md:text-lg leading-relaxed break-words text-gray-100'
44+ : 'font-sans font-medium text-base md:text-lg leading-relaxed break-words text-gray-900' ;
45+
46+ return (
47+ < div
48+ className = { `w-full rounded-xl mb-6 border px-6 py-4 flex items-start ${ bgClass } ${ textClass } ` }
49+ style = { { fontFamily : `-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif` } }
50+ >
51+ < span className = { taskLabelClass } style = { { fontFamily : 'Segoe UI,Arial,sans-serif' } } > TASK:</ span >
52+ < span className = { taskContentClass } > { traceData . task || 'No task information available' } </ span >
53+ </ div >
54+ ) ;
55+ } ;
5156
5257export default function Home ( ) {
58+ const [ allTraceData , setAllTraceData ] = useState < TraceData [ ] > ( [ ] ) ;
59+ const [ traceIds , setTraceIds ] = useState < string [ ] > ( [ ] ) ;
5360 const [ darkMode , setDarkMode ] = useState ( true ) ;
61+ const [ activeTraceIndex , setActiveTraceIndex ] = useState ( 0 ) ;
62+
63+ useEffect ( ( ) => {
64+ // 动态加载trace文件
65+ async function loadTraceFiles ( ) {
66+ try {
67+ // 尝试加载所有可能的trace文件(从1到20)
68+ const tracePromises = [ ] ;
69+
70+ // 定义一个异步函数来尝试导入单个trace文件
71+ const tryImportTrace = async ( index : number ) => {
72+ try {
73+ const module = await import ( `../src/data/trace${ index } .json` ) ;
74+ return { index, data : module . default } ;
75+ } catch ( e ) {
76+ return null ;
77+ }
78+ } ;
79+
80+ // 并行尝试导入所有可能的trace文件
81+ for ( let i = 1 ; i <= 20 ; i ++ ) {
82+ tracePromises . push ( tryImportTrace ( i ) ) ;
83+ }
84+
85+ // 等待所有导入尝试完成
86+ const results = await Promise . all ( tracePromises ) ;
87+
88+ // 过滤出成功导入的trace文件,并按索引排序
89+ const successfulImports = results
90+ . filter ( result => result !== null )
91+ . sort ( ( a , b ) => a ! . index - b ! . index )
92+ . map ( result => fixAssetPaths ( result ! . data as TraceData ) ) ;
93+
94+ console . log ( `Successfully loaded ${ successfulImports . length } trace files` ) ;
95+
96+ // 更新状态
97+ setAllTraceData ( successfulImports ) ;
98+ setTraceIds ( generateTraceIds ( successfulImports . length ) ) ;
99+ } catch ( error ) {
100+ console . error ( 'Error loading trace files:' , error ) ;
101+ }
102+ }
103+
104+ loadTraceFiles ( ) ;
105+ } , [ ] ) ;
54106
55107 const toggleTheme = ( ) => {
56108 setDarkMode ( ! darkMode ) ;
@@ -565,12 +617,19 @@ export default function Home() {
565617 Agent Execution Traces
566618 </ h2 >
567619
620+ { /* Task Display Component in the red box area */ }
621+ < TaskDisplay
622+ traceData = { allTraceData . length > 0 ? allTraceData [ activeTraceIndex ] : null }
623+ darkMode = { darkMode }
624+ />
625+
568626 < div className = "mb-4" >
569627 < TraceCarousel
570628 traceDatas = { allTraceData }
571629 ids = { traceIds }
572630 autoplay = { true }
573631 autoplayInterval = { 8000 }
632+ onActiveIndexChange = { setActiveTraceIndex }
574633 />
575634 </ div >
576635
0 commit comments