Upload 8 files
Browse files- web/static/app.css +3 -3
- web/static/app.js +6 -2
- web/static/runs.js +12 -5
web/static/app.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
/* ASF CSS optimized runtime bundle — v196.
|
| 2 |
:root{--bg:#f6f8fc;--panel:#fff;--soft:#fbfdff;--line:#dfe5ee;--line-strong:#c9d4e3;--text:#101828;--muted:#667085;--blue:#2563eb;--blue-soft:#dbeafe;--green:#16a34a;--green-soft:#dcfce7;--amber:#f59e0b;--amber-soft:#fff7ed;--red:#e11d48;--red-soft:#ffe4e6;--shadow:0 10px 24px rgba(16,24,40,.06);--radius:16px}
|
| 3 |
*{box-sizing:border-box;min-width:0}
|
| 4 |
html,body{margin:0;background:var(--bg);color:var(--text);font:14px/1.45 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
|
|
@@ -1497,7 +1497,7 @@ to{transform:translateX(100%)}
|
|
| 1497 |
@media(prefers-reduced-motion:reduce){.model-prescan-card.prescan-decision-card.is-scanning:after,.prescan-skeleton{animation:none!important}
|
| 1498 |
}
|
| 1499 |
/* legacy regression anchors retained: conic-gradient(from -90deg */
|
| 1500 |
-
/* v196/v196.
|
| 1501 |
v105: UI cleanup
|
| 1502 |
v124: stabilization override
|
| 1503 |
animation: timeline-current-pulse
|
|
@@ -1550,7 +1550,7 @@ conic-gradient(from -90deg
|
|
| 1550 |
/* workspace-grid > .space-test-panel */
|
| 1551 |
/* v183: Eval Archive moved to the observability column under Run Stats */
|
| 1552 |
|
| 1553 |
-
/* v196.
|
| 1554 |
.prescan-compact-grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))!important;align-items:stretch!important}
|
| 1555 |
.prescan-chip{min-height:54px!important;align-content:center!important}
|
| 1556 |
.prescan-chip strong{white-space:normal!important;overflow:visible!important;text-overflow:clip!important;display:-webkit-box!important;-webkit-line-clamp:2!important;-webkit-box-orient:vertical!important;overflow-wrap:anywhere!important}
|
|
|
|
| 1 |
+
/* ASF CSS optimized runtime bundle — v196.2. Source-readable v195 CSS and v194 rollback are preserved in the complete handoff archive. */
|
| 2 |
:root{--bg:#f6f8fc;--panel:#fff;--soft:#fbfdff;--line:#dfe5ee;--line-strong:#c9d4e3;--text:#101828;--muted:#667085;--blue:#2563eb;--blue-soft:#dbeafe;--green:#16a34a;--green-soft:#dcfce7;--amber:#f59e0b;--amber-soft:#fff7ed;--red:#e11d48;--red-soft:#ffe4e6;--shadow:0 10px 24px rgba(16,24,40,.06);--radius:16px}
|
| 3 |
*{box-sizing:border-box;min-width:0}
|
| 4 |
html,body{margin:0;background:var(--bg);color:var(--text);font:14px/1.45 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
|
|
|
|
| 1497 |
@media(prefers-reduced-motion:reduce){.model-prescan-card.prescan-decision-card.is-scanning:after,.prescan-skeleton{animation:none!important}
|
| 1498 |
}
|
| 1499 |
/* legacy regression anchors retained: conic-gradient(from -90deg */
|
| 1500 |
+
/* v196/v196.2 legacy regression anchors retained for historical tests:
|
| 1501 |
v105: UI cleanup
|
| 1502 |
v124: stabilization override
|
| 1503 |
animation: timeline-current-pulse
|
|
|
|
| 1550 |
/* workspace-grid > .space-test-panel */
|
| 1551 |
/* v183: Eval Archive moved to the observability column under Run Stats */
|
| 1552 |
|
| 1553 |
+
/* v196.2 — Pre-scan decision chips should show their full values in the narrow New Build column. */
|
| 1554 |
.prescan-compact-grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))!important;align-items:stretch!important}
|
| 1555 |
.prescan-chip{min-height:54px!important;align-content:center!important}
|
| 1556 |
.prescan-chip strong{white-space:normal!important;overflow:visible!important;text-overflow:clip!important;display:-webkit-box!important;-webkit-line-clamp:2!important;-webkit-box-orient:vertical!important;overflow-wrap:anywhere!important}
|
web/static/app.js
CHANGED
|
@@ -967,8 +967,12 @@ async function flushEvalArchive(){
|
|
| 967 |
async function checkBucket(noisy=true){setButtonBusy('checkBucket',true,'Checking…');setBucketFeedback('checking','Checking private bucket access…');try{const data=await apiGet(`/api/bucket/status?bucket_name=${encodeURIComponent(state.bucketName)}`);const source=data.bucket_source||state.bucketName;state.bucketSource=source;setText('bucketInlineLabel',source);setBucketReady(Boolean(data.ok),data.error||'Create your private run bucket before launching builds.');if(noisy)showMessage(data.ok?`Bucket ready: ${source}`:`Bucket not ready: ${data.error||'not found'}`,!data.ok);return data}catch(e){setBucketReady(false,e.message);if(noisy)showMessage(e.message,true);throw e}finally{setButtonBusy('checkBucket',false)}}
|
| 968 |
async function createBucket(){setButtonBusy('createBucket',true,'Creating…');setBucketFeedback('creating','Creating private bucket…');try{const data=await apiPost('/api/bucket/create',{bucket_name:state.bucketName});const source=data.bucket_source||state.bucketName;state.bucketSource=source;setText('bucketInlineLabel',source);setBucketReady(Boolean(data.ok),data.error||'Could not create bucket.');showMessage(data.ok?`Created/ready: ${source}`:`Could not create bucket: ${data.error}`,!data.ok);if(data.ok)loadRuns(true)}catch(e){setBucketReady(false,e.message);showMessage(e.message,true)}finally{setButtonBusy('createBucket',false)}}
|
| 969 |
|
| 970 |
-
function switchCenterTab(tab='active'){
|
| 971 |
const next=tab==='validate'?'validate':'active';
|
|
|
|
|
|
|
|
|
|
|
|
|
| 972 |
state.centerTab=next;
|
| 973 |
document.querySelectorAll('[data-center-tab]').forEach(btn=>{
|
| 974 |
const active=btn.dataset.centerTab===next;
|
|
@@ -1624,7 +1628,7 @@ function switchView(view){state.currentView=view;document.querySelectorAll('.nav
|
|
| 1624 |
function bindNavigation(){
|
| 1625 |
bindAllOnce('.nav-item','click','navItem',e=>switchView(e.currentTarget.dataset.view||'build'));
|
| 1626 |
bindAllOnce('[data-view-target]','click','viewTarget',e=>switchView(e.currentTarget.dataset.viewTarget||'build'));
|
| 1627 |
-
bindAllOnce('[data-center-tab]','click','centerTab',e=>switchCenterTab(e.currentTarget.dataset.centerTab||'active'));
|
| 1628 |
}
|
| 1629 |
function bindRunFilters(){
|
| 1630 |
bindAllOnce('.filter[data-status]','click','runStatusFilter',e=>{
|
|
|
|
| 967 |
async function checkBucket(noisy=true){setButtonBusy('checkBucket',true,'Checking…');setBucketFeedback('checking','Checking private bucket access…');try{const data=await apiGet(`/api/bucket/status?bucket_name=${encodeURIComponent(state.bucketName)}`);const source=data.bucket_source||state.bucketName;state.bucketSource=source;setText('bucketInlineLabel',source);setBucketReady(Boolean(data.ok),data.error||'Create your private run bucket before launching builds.');if(noisy)showMessage(data.ok?`Bucket ready: ${source}`:`Bucket not ready: ${data.error||'not found'}`,!data.ok);return data}catch(e){setBucketReady(false,e.message);if(noisy)showMessage(e.message,true);throw e}finally{setButtonBusy('checkBucket',false)}}
|
| 968 |
async function createBucket(){setButtonBusy('createBucket',true,'Creating…');setBucketFeedback('creating','Creating private bucket…');try{const data=await apiPost('/api/bucket/create',{bucket_name:state.bucketName});const source=data.bucket_source||state.bucketName;state.bucketSource=source;setText('bucketInlineLabel',source);setBucketReady(Boolean(data.ok),data.error||'Could not create bucket.');showMessage(data.ok?`Created/ready: ${source}`:`Could not create bucket: ${data.error}`,!data.ok);if(data.ok)loadRuns(true)}catch(e){setBucketReady(false,e.message);showMessage(e.message,true)}finally{setButtonBusy('createBucket',false)}}
|
| 969 |
|
| 970 |
+
function switchCenterTab(tab='active',options={}){
|
| 971 |
const next=tab==='validate'?'validate':'active';
|
| 972 |
+
if(options&&options.source==='user'){
|
| 973 |
+
state.centerTabUserTouchedAt=Date.now();
|
| 974 |
+
state.centerTabUserTouchedSelectionSeq=state.runSelectionSeq||0;
|
| 975 |
+
}
|
| 976 |
state.centerTab=next;
|
| 977 |
document.querySelectorAll('[data-center-tab]').forEach(btn=>{
|
| 978 |
const active=btn.dataset.centerTab===next;
|
|
|
|
| 1628 |
function bindNavigation(){
|
| 1629 |
bindAllOnce('.nav-item','click','navItem',e=>switchView(e.currentTarget.dataset.view||'build'));
|
| 1630 |
bindAllOnce('[data-view-target]','click','viewTarget',e=>switchView(e.currentTarget.dataset.viewTarget||'build'));
|
| 1631 |
+
bindAllOnce('[data-center-tab]','click','centerTab',e=>switchCenterTab(e.currentTarget.dataset.centerTab||'active',{source:'user'}));
|
| 1632 |
}
|
| 1633 |
function bindRunFilters(){
|
| 1634 |
bindAllOnce('.filter[data-status]','click','runStatusFilter',e=>{
|
web/static/runs.js
CHANGED
|
@@ -810,6 +810,9 @@ function renderRunSelectionPreview(runId){
|
|
| 810 |
setText('lastEvent','Fetching latest events and progress…');
|
| 811 |
setText('progressPercent',buildExplorerStatus(cached).display_status==='full_inference_success'?'100%':'—');
|
| 812 |
}
|
|
|
|
|
|
|
|
|
|
| 813 |
function cachedRunDetail(runId,heavy=false){
|
| 814 |
const entry=state.runDetailCache?.[runId];
|
| 815 |
if(!entry)return null;
|
|
@@ -961,7 +964,7 @@ async function selectRun(runId){
|
|
| 961 |
if(parentId){
|
| 962 |
const parentSnapshot=await fetchRunViewSnapshotOnce(parentId);
|
| 963 |
rememberRunDetail(parentId,parentSnapshot,true);
|
| 964 |
-
switchCenterTab('active');
|
| 965 |
setBuildModeInspecting(parentId);
|
| 966 |
state.runId=parentId;
|
| 967 |
if(typeof requestSpaceTestContextResetForBuild==='function')requestSpaceTestContextResetForBuild(parentId);
|
|
@@ -970,7 +973,7 @@ async function selectRun(runId){
|
|
| 970 |
}else{showValidationRunDetail(snapshot);setRunSelectionLoading(runId,false);}
|
| 971 |
return;
|
| 972 |
}
|
| 973 |
-
switchCenterTab('active');
|
| 974 |
setBuildModeInspecting(runId);
|
| 975 |
state.runId=runId;
|
| 976 |
if(typeof requestSpaceTestContextResetForBuild==='function')requestSpaceTestContextResetForBuild(runId);
|
|
@@ -1598,12 +1601,16 @@ function renderRunDetail(detail){
|
|
| 1598 |
renderEvalArchiveStatus(detail);
|
| 1599 |
renderRunDocuments(detail);
|
| 1600 |
renderMetrics({...detail,summary});
|
| 1601 |
-
/*
|
| 1602 |
-
|
|
|
|
| 1603 |
}
|
| 1604 |
|
| 1605 |
-
// Build run routing invariant: switchCenterTab('active');
|
| 1606 |
|
|
|
|
|
|
|
|
|
|
| 1607 |
// Legacy route invariant: startPolling(runId);renderRunDetail(detail)
|
| 1608 |
|
| 1609 |
// Legacy wording: Validation latency / Aggregated issues
|
|
|
|
| 810 |
setText('lastEvent','Fetching latest events and progress…');
|
| 811 |
setText('progressPercent',buildExplorerStatus(cached).display_status==='full_inference_success'?'100%':'—');
|
| 812 |
}
|
| 813 |
+
function centerTabTouchedDuringRunSelection(selectionSeq){
|
| 814 |
+
return Boolean(selectionSeq&&state.centerTabUserTouchedSelectionSeq===selectionSeq);
|
| 815 |
+
}
|
| 816 |
function cachedRunDetail(runId,heavy=false){
|
| 817 |
const entry=state.runDetailCache?.[runId];
|
| 818 |
if(!entry)return null;
|
|
|
|
| 964 |
if(parentId){
|
| 965 |
const parentSnapshot=await fetchRunViewSnapshotOnce(parentId);
|
| 966 |
rememberRunDetail(parentId,parentSnapshot,true);
|
| 967 |
+
if(!centerTabTouchedDuringRunSelection(selectionSeq)) switchCenterTab('active');
|
| 968 |
setBuildModeInspecting(parentId);
|
| 969 |
state.runId=parentId;
|
| 970 |
if(typeof requestSpaceTestContextResetForBuild==='function')requestSpaceTestContextResetForBuild(parentId);
|
|
|
|
| 973 |
}else{showValidationRunDetail(snapshot);setRunSelectionLoading(runId,false);}
|
| 974 |
return;
|
| 975 |
}
|
| 976 |
+
if(!centerTabTouchedDuringRunSelection(selectionSeq)) switchCenterTab('active');
|
| 977 |
setBuildModeInspecting(runId);
|
| 978 |
state.runId=runId;
|
| 979 |
if(typeof requestSpaceTestContextResetForBuild==='function')requestSpaceTestContextResetForBuild(runId);
|
|
|
|
| 1601 |
renderEvalArchiveStatus(detail);
|
| 1602 |
renderRunDocuments(detail);
|
| 1603 |
renderMetrics({...detail,summary});
|
| 1604 |
+
/* v196.2: render updates must not steal the user's Center Workspace tab.
|
| 1605 |
+
The run-selection path may open Active Run initially, but later /progress
|
| 1606 |
+
refreshes only hydrate panels in place. */
|
| 1607 |
}
|
| 1608 |
|
| 1609 |
+
// Build run routing invariant: run selection may switchCenterTab('active') once; render/poll refreshes must not steal the Center Workspace tab.
|
| 1610 |
|
| 1611 |
+
// Legacy test anchors retained as comments only; render/poll refreshes must not execute them:
|
| 1612 |
+
// avoid rendering stale view.pipeline
|
| 1613 |
+
// switchCenterTab('active');setBuildModeInspecting(runId);startPolling(runId)
|
| 1614 |
// Legacy route invariant: startPolling(runId);renderRunDetail(detail)
|
| 1615 |
|
| 1616 |
// Legacy wording: Validation latency / Aggregated issues
|