| function $(id){return document.getElementById(id)} |
| function formValue(id){return ($(id)?.value||'').trim()} |
| function setText(id,value){const el=$(id);if(el)el.textContent=value??'β'} |
| function setInputValue(id,value){const el=$(id);if(el)el.value=value||''} |
| function escapeHtml(value){return String(value??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]))} |
|
|
| const IMPLEMENTATION_MODE_COPY={ |
| 'full-inference-gated':{title:'Strict inference',short:'Strict',description:'Requires a real working inference endpoint. The run fails if the generated Space only boots without producing a valid output.'}, |
| 'full-inference-attempt':{title:'Best effort inference',short:'Best effort',description:'Tries to build real inference, but allows partial prototypes or manual follow-up when the model or hardware needs extra work.'}, |
| 'safe-scaffold':{title:'Demo scaffold only',short:'Demo only',description:'Only requires a bootable Gradio demo. This mode does not guarantee that model inference works.'} |
| }; |
| function implementationModeCopy(value){return IMPLEMENTATION_MODE_COPY[String(value||'').trim()]||IMPLEMENTATION_MODE_COPY['full-inference-gated']} |
| function implementationModeLabel(value,{short=false}={}){const copy=implementationModeCopy(value);return short?(copy.short||copy.title):copy.title} |
| function implementationModeDescription(value){return implementationModeCopy(value).description} |
| function firstNonEmpty(...values){for(const value of values){if(value!==undefined&&value!==null&&String(value).trim())return String(value).trim()}return''} |
|
|
| function fmtSeconds(s){if(s==null||s==='')return'β';s=Math.max(0,Number(s)||0);const h=Math.floor(s/3600),m=Math.floor((s%3600)/60),r=s%60;if(h)return`${h}h ${m}m`;return m?`${m}m ${r}s`:`${r}s`} |
| function shortText(value,max=42){value=String(value||'β');return value.length>max?value.slice(0,max-1)+'β¦':value} |
| function formatTime(ts){if(!ts)return'β';try{return new Date(ts).toLocaleTimeString([], {hour:'2-digit',minute:'2-digit',second:'2-digit'})}catch(_){return String(ts).slice(11,19)||'β'}} |
| function statusClass(status){status=String(status||'').toLowerCase();if(status.includes('succeed')||status.includes('success')||status.includes('passed')||status==='completed'||status==='done'||status==='health_only'||status==='repair_success'||status==='full_inference_candidate_health_passed'||status==='full_inference_success')return'success';if(status.includes('manual')||status.includes('stale')||status.includes('blocked')||status.includes('cancelled')||status.includes('canceled')||status.includes('stopped'))return'warn';if(status.includes('failed')||status.includes('error')||status.includes('technical'))return'error';if(status.includes('running')||status.includes('queued')||status.includes('pending')||status.includes('building'))return'running';return'neutral'} |
| function setLink(id,url){const el=$(id);if(!el)return;if(url){el.href=url;el.classList.remove('disabled');el.setAttribute('aria-disabled','false')}else{el.removeAttribute('href');el.classList.add('disabled');el.setAttribute('aria-disabled','true')}} |
| function badgeLabel(status){return String(status||'unknown').replaceAll('_',' ')} |
|
|