@@ -1322,7 +1322,7 @@ <h3>User Settings & API Keys</h3>
13221322 // detail info
13231323 info_venue : 'Venue' , info_user : 'User' , info_model : 'Model' ,
13241324 info_environment : 'Environment' , info_created : 'Created' , info_updated : 'Updated' ,
1325- info_status : 'Status' ,
1325+ info_status : 'Status' , info_phase : 'Phase' ,
13261326 completed_iter : 'Completed (%d iterations)' ,
13271327 running_iter : 'Running (%d / %d iterations)' ,
13281328 running_plain : 'Running' ,
@@ -1434,7 +1434,7 @@ <h3>User Settings & API Keys</h3>
14341434 status_waiting_template : '⏳ في انتظار القالب' , status_pending : '⏳ في قائمة الانتظار' ,
14351435 info_venue : 'المؤتمر' , info_user : 'المستخدم' , info_model : 'النموذج' ,
14361436 info_environment : 'البيئة' , info_created : 'تاريخ الإنشاء' , info_updated : 'آخر تحديث' ,
1437- info_status : 'الحالة' ,
1437+ info_status : 'الحالة' , info_phase : 'المرحلة' ,
14381438 completed_iter : 'مكتمل (%d تكرارات)' ,
14391439 running_iter : 'قيد التشغيل (%d / %d تكرارات)' ,
14401440 running_plain : 'قيد التشغيل' ,
@@ -1537,7 +1537,7 @@ <h3>User Settings & API Keys</h3>
15371537 status_waiting_template : '⏳ 等待模板' , status_pending : '⏳ 排队中' ,
15381538 info_venue : '会议' , info_user : '用户' , info_model : '模型' ,
15391539 info_environment : '环境' , info_created : '创建时间' , info_updated : '更新时间' ,
1540- info_status : '状态' ,
1540+ info_status : '状态' , info_phase : '阶段' ,
15411541 completed_iter : '已完成(%d 次迭代)' ,
15421542 running_iter : '运行中(%d / %d 次迭代)' ,
15431543 running_plain : '运行中' ,
@@ -1966,6 +1966,59 @@ <h3>User Settings & API Keys</h3>
19661966 </div>` ;
19671967}
19681968
1969+ // ══════════════════════════════════════════════════════
1970+ // Phase status helper
1971+ // ══════════════════════════════════════════════════════
1972+ function _renderPhaseStatus ( p ) {
1973+ const ps = p . phase_status ;
1974+ if ( ! ps || ! ps . phase ) {
1975+ // Fallback for older backends
1976+ return `<div><b>Iteration:</b> ${ p . current_iteration || 0 } / ${ p . max_iterations } </div>` ;
1977+ }
1978+
1979+ const phaseLabels = {
1980+ research : t ( 'phase_research' ) || 'Research' ,
1981+ dev : t ( 'phase_dev' ) || 'Dev' ,
1982+ review : t ( 'phase_review' ) || 'Review' ,
1983+ accepted : '✓ Accepted' ,
1984+ initializing : 'Initializing' ,
1985+ } ;
1986+ const phaseColors = {
1987+ research : '#8b5cf6' ,
1988+ dev : '#f59e0b' ,
1989+ review : '#3b82f6' ,
1990+ accepted : '#10b981' ,
1991+ initializing : 'var(--text-muted)' ,
1992+ } ;
1993+
1994+ const phaseName = phaseLabels [ ps . phase ] || ps . phase ;
1995+ const phaseColor = phaseColors [ ps . phase ] || 'var(--text)' ;
1996+
1997+ // Build iteration detail string
1998+ let iterDetail = '' ;
1999+ if ( ps . phase === 'dev' ) {
2000+ iterDetail = ` (${ ps . dev_iter } /${ ps . max_dev_iter } )` ;
2001+ } else if ( ps . phase === 'review' ) {
2002+ iterDetail = ` (${ ps . review_iter } /${ ps . max_review_iter } )` ;
2003+ }
2004+
2005+ const badge = `<span style="display:inline-block;padding:1px 8px;border-radius:10px;font-size:.82em;font-weight:600;color:#fff;background:${ phaseColor } ">${ esc ( phaseName ) } ${ iterDetail } </span>` ;
2006+
2007+ // Build dev + review iteration summary line
2008+ const parts = [ ] ;
2009+ if ( ps . max_dev_iter > 0 ) {
2010+ parts . push ( `Dev ${ ps . dev_iter } /${ ps . max_dev_iter } ` ) ;
2011+ }
2012+ if ( ps . max_review_iter > 0 ) {
2013+ parts . push ( `Review ${ ps . review_iter } /${ ps . max_review_iter } ` ) ;
2014+ }
2015+ const iterLine = parts . length
2016+ ? `<div style="color:var(--text-muted);font-size:.88em;margin-top:2px">${ parts . join ( ' · ' ) } </div>`
2017+ : '' ;
2018+
2019+ return `<div><b>${ t ( 'info_phase' ) || 'Phase' } :</b> ${ badge } ${ iterLine } </div>` ;
2020+ }
2021+
19692022// ══════════════════════════════════════════════════════
19702023// Project Detail
19712024// ══════════════════════════════════════════════════════
@@ -2024,7 +2077,7 @@ <h3>User Settings & API Keys</h3>
20242077 <div><b>Project ID:</b> <code style="font-size:.85em;background:var(--bg-hover);padding:1px 5px;border-radius:4px">${ esc ( p . id ) } </code></div>
20252078 <div><b>${ t ( 'info_venue' ) } :</b> ${ esc ( p . venue ) } </div>
20262079 <div><b>${ t ( 'info_model' ) } :</b> ${ esc ( p . model || 'claude-sonnet-4-6' ) } </div>
2027- <div><b>Iteration:</b> ${ p . current_iteration || 0 } / ${ p . max_iterations } </div>
2080+ ${ _renderPhaseStatus ( p ) }
20282081 <div><b>${ t ( 'info_environment' ) } :</b> ${ esc ( p . environment || 'Local' ) } </div>
20292082 ${ condaEnvLine }
20302083 <div><b>${ t ( 'info_user' ) } :</b> ${ esc ( p . user_email || '' ) } </div>
0 commit comments