fffiloni commited on
Commit
f6288a8
·
verified ·
1 Parent(s): 5f52f2a

Upload 8 files

Browse files
Files changed (3) hide show
  1. web/static/app.css +3 -3
  2. web/static/app.js +6 -2
  3. web/static/runs.js +12 -5
web/static/app.css CHANGED
@@ -1,4 +1,4 @@
1
- /* ASF CSS optimized runtime bundle — v196.1. 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,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.1 legacy regression anchors retained for historical tests:
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.1 — 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}
 
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
- /* v71: avoid rendering stale view.pipeline before /progress returns canonical compact timeline. */
1602
- switchCenterTab('active');
 
1603
  }
1604
 
1605
- // Build run routing invariant: switchCenterTab('active');setBuildModeInspecting(runId);startPolling(runId)
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