|
40 | 40 | for(const j of a.jobs||[]){const p=document.createElement('p');p.textContent=[j.kind,j.branch,j.state||j.phase,j.id,j.assignment].filter(Boolean).join(' | ');node.append(p)} |
41 | 41 | const proof=document.createElement('details'),summary=document.createElement('summary'),raw=document.createElement('pre');summary.textContent='Dane źródłowe';raw.textContent=JSON.stringify(a,null,2);proof.append(summary,raw);node.append(proof);$('actors').append(node) |
42 | 42 | } |
| 43 | +const plans=data.live?.goals||{};$('goals').textContent=JSON.stringify(plans,null,2);$('goals').style.display='none';const oldPanel=$('goals').parentElement;if(oldPanel?.tagName==='SECTION')oldPanel.style.display='none'; |
| 44 | +} |
| 45 | +
|
43 | 46 | function textField(parent,label,value){if(value===undefined||value===null||value==='')return;const p=document.createElement('p'),b=document.createElement('strong');b.textContent=label+': ';p.append(b,document.createTextNode(String(value)));parent.append(p)} |
44 | 47 | function detailsField(parent,label,value,key){if(!value)return;const d=document.createElement('details'),h=document.createElement('summary'),p=document.createElement('pre');d.dataset.key=key;h.textContent=label;p.textContent=String(value);d.append(h,p);parent.append(d)} |
45 | 48 | function panel(id,title,after){let p=$(id);if(!p){p=document.createElement('section');p.id=id;const h=document.createElement('h2');h.textContent=title;p.append(h);after.after(p)}return p} |
|
61 | 64 | for(const e of [...(data.live?.events||[])].reverse()){const d=document.createElement('details');d.className='event-row';d.dataset.key=(e.request_id||e.time)+'-'+e.actor+'-'+e.kind;const h=document.createElement('summary');h.textContent=[e.time,e.branch,e.actor,e.kind,e.tool].filter(Boolean).join(' | ');d.append(h);textField(d,'Returned local reasoning (unverified)',e.returned_trace);textField(d,'Task / arguments',e.task);textField(d,'Public output / result',e.summary);textField(d,'Error / status',e.detail);if(e.usage&&Object.keys(e.usage).length)textField(d,'Tokens',JSON.stringify(e.usage));textField(d,'Seconds',e.seconds);textField(d,'Evidence',e.source);$('events').append(d)} |
62 | 65 | for(const n of document.querySelectorAll('details[data-key]'))if(opened.has(n.dataset.key))n.open=true; |
63 | 66 | } |
64 | | -const plans=data.live?.goals||{};$('goals').textContent=JSON.stringify(plans,null,2);$('goals').style.display='none';const oldPanel=$('goals').parentElement;if(oldPanel?.tagName==='SECTION')oldPanel.style.display='none'; |
| 67 | +function archivePanel(){ |
| 68 | +if($('action-archive'))return; |
| 69 | +const p=document.createElement('section');p.id='action-archive';const h=document.createElement('h2');h.textContent='Full recorded action archive';const note=document.createElement('p');note.textContent='Browse daily journals from their first event. Live activity above is the latest 200 events. Archives contain recorded actions, not proof that an unlogged action occurred.';const select=document.createElement('select');select.id='archive-day';const button=document.createElement('button');button.textContent='Load action history';const status=document.createElement('p');const rows=document.createElement('div');p.append(h,note,select,button,status,rows);$('timeline-panel').after(p);let cursor=0; |
| 70 | +async function load(reset=false){button.disabled=true;try{if(reset){cursor=0;rows.replaceChildren()}const query=new URLSearchParams({cursor:String(cursor),limit:'100'});if(select.value)query.set('day',select.value);const response=await fetch('/api/actions?'+query,{cache:'no-store'});if(!response.ok)throw Error('HTTP '+response.status);const result=await response.json();if(!select.options.length){for(const day of result.days||[]){const option=document.createElement('option');option.value=day;option.textContent=day;select.append(option)}select.value=result.day||''} |
| 71 | +for(const e of result.events||[]){const d=document.createElement('details'),title=document.createElement('summary'),body=document.createElement('pre');title.textContent=[e.time,e.branch,e.actor,e.kind].filter(Boolean).join(' | ');body.textContent=JSON.stringify({context:e.context,payload:e.payload,id:e.id},null,2);d.append(title,body);rows.append(d)}cursor=result.next_cursor;status.textContent=`${rows.children.length} events shown | ${cursor} / ${result.archive_bytes||0} archive bytes`;button.textContent=result.has_more?'Load next 100 actions':'Check for new actions';}catch(error){status.textContent='Archive unavailable: '+error.message}finally{button.disabled=false}} |
| 72 | +button.onclick=()=>load();select.onchange=()=>load(true); |
65 | 73 | } |
66 | | -
|
| 74 | +function learningPanel(data){const p=panel('goal-learning-panel','Goal-directed ML pipeline',$('plan-panel'));let body=$('goal-learning-view');if(!body){body=document.createElement('div');body.id='goal-learning-view';p.append(body)}body.replaceChildren();const evidence=data.report?.mission_evidence||{},g=evidence.goal_learning||{};textField(body,'Active goal ID',g.goal_id||'No goal recorded');for(const [k,v] of Object.entries(g.learning_task||{}))textField(body,k,v);textField(body,'Recent forecasts',fmt(g.forecasts?.length));textField(body,'Recent resolved forecasts',g.recent_resolved);textField(body,'Recent Brier score',g.recent_brier);textField(body,'Admitted training examples',g.training_admission?.admitted);textField(body,'Confirmed optimizer updates',fmt(evidence.optimizer_updates_observed));textField(body,'Accepted weight updates',fmt(evidence.accepted_weight_updates_this_run));detailsField(body,'Training admission evidence',JSON.stringify(g.training_admission||{}),'goal-admission')} |
67 | 75 | function svg(tag,attrs,text){let node=document.createElementNS('http://www.w3.org/2000/svg',tag);for(const [key,val] of Object.entries(attrs))node.setAttribute(key,val);if(text!==undefined)node.textContent=text;return node} |
68 | 76 | function render(data){const m=data.mission||{},r=data.report||{},ev=(m.state?.phase==='official-public-baseline'?r.mission_evidence?.official_benchmark:null)||m.evaluation||{},learn=m.learning||{},gpu=data.gpu||{}; |
69 | 77 | if(data.layout?.active_sha256&&layoutVersion!==data.layout.active_sha256){location.reload();return}$('layout').textContent='HTML mastera: /workspace/dashboard/index.html | '+(data.layout?.state||'oczekiwanie')+(data.layout?.error?' | '+data.layout.error:''); |
70 | 78 | $('fresh').textContent='Zebrano: '+new Date(data.collected_at*1000).toLocaleString()+' | Raport zbierany co 20 s | Przebieg: '+fmt(m.run); |
71 | | -workView(data);$('warning').textContent=(data.errors||[]).join('\n');$('cards').replaceChildren();card('Misja',m.running?'działa':'zatrzymana');card('Faza',m.state?.phase);card('Cykle uczenia',learn.completed_cycles);card('Zaakceptowane aktualizacje wag',r.accepted_weight_updates_this_run);card('Potwierdzone kroki optymalizatora',r.mission_evidence?.optimizer_updates_observed);card('Kontekst',m.state?.context_window);card('GPU - wykorzystanie',gpu.utilization===undefined?null:gpu.utilization+'%');card('VRAM zajęty / razem',gpu.memory_used===undefined?null:gpu.memory_used+' / '+gpu.memory_total+' MiB');card('GPU - temperatura / moc',gpu.temperature===undefined?null:gpu.temperature+' °C / '+gpu.power+' W'); |
| 79 | +workView(data);learningPanel(data);archivePanel();$('warning').textContent=(data.errors||[]).join('\n');$('cards').replaceChildren();card('Misja',m.running?'działa':'zatrzymana');card('Faza',m.state?.phase);card('Cykle uczenia',learn.completed_cycles);card('Zaakceptowane aktualizacje wag',r.accepted_weight_updates_this_run);card('Potwierdzone kroki optymalizatora',r.mission_evidence?.optimizer_updates_observed);card('Kontekst',m.state?.context_window);card('GPU - wykorzystanie',gpu.utilization===undefined?null:gpu.utilization+'%');card('VRAM zajęty / razem',gpu.memory_used===undefined?null:gpu.memory_used+' / '+gpu.memory_total+' MiB');card('GPU - temperatura / moc',gpu.temperature===undefined?null:gpu.temperature+' °C / '+gpu.power+' W'); |
72 | 80 | $('evaluation').textContent=ev.total?`${ev.completed}/${ev.total} ukończonych, ${ev.passed===undefined?'ocenianie oficjalnym graderem':ev.passed+' zaliczonych'} (${ev.state})`:'Brak bieżącego licznika ewaluacji';$('progress').max=ev.total||1;$('progress').value=ev.completed||0;$('case').textContent=ev.current_case?('Obecny przypadek: '+ev.current_case):''; |
73 | 81 | const ledger=r.paper||{};$('paper').textContent=Object.entries(ledger.branches||{}).map(([name,b])=>`${name} | Equity ${fmt(b.equity)} ${ledger.currency||''} | Net P&L ${fmt(b.net_pnl_before_personal_tax)} | Costs ${fmt(b.modeled_costs)} | Resolved fills ${fmt(b.resolved_fills)}`).join('\n\n')||'No recorded paper ledger';$('blockers').textContent=(r.paper_blockers||[]).join('\n')||'No reported paper blockers';$('workers').textContent=JSON.stringify({drones:r.drones,external_compute:r.external_compute,desktop:r.desktop,official_benchmark:r.official_benchmark},null,2);$('log').textContent=data.controller_log||'Brak logu';$('evidence').textContent=JSON.stringify({last_cycle:learn.last_cycle,evidence:r.mission_evidence,collection_errors:data.errors},null,2); |
74 | 82 | $('backtests').replaceChildren();$('chart').replaceChildren();const tests=r.recent_exploratory_backtests||[];let largest=Math.max(.01,...tests.map(t=>Math.abs(t.development_test?.net_return||0)));$('chart').append(svg('line',{x1:400,y1:0,x2:400,y2:220,stroke:'#8296b1'}));tests.forEach((test,i)=>{const result=test.development_test||{},tr=document.createElement('tr');[`${i+1}. ${test.parameters?.rule||''}`,pct(result.net_return),pct(result.max_sampled_drawdown),fmt(result.fills)].forEach(v=>{let td=document.createElement('td');td.textContent=v;tr.append(td)});$('backtests').append(tr);if(typeof result.net_return==='number'&&Number.isFinite(result.net_return)){let width=Math.abs(result.net_return)/largest*280,y=15+i*48;$('chart').append(svg('rect',{x:result.net_return<0?400-width:400,y,width,height:26,fill:result.net_return<0?'#e68d80':'#75c5ae'}),svg('text',{x:8,y:y+19,fill:'#dce6f5','font-size':14},`${i+1}. ${pct(result.net_return)}`))}});if(!tests.length)$('chart').append(svg('text',{x:20,y:50,fill:'#adbdd1'},'Brak zapisanych wyników')); |
@@ -173,6 +181,7 @@ def validate_template(content): |
173 | 181 |
|
174 | 182 |
|
175 | 183 | def render_template(content, identity): |
| 184 | + content = content.replace("V100 - postęp misji", "Synta - mission control") |
176 | 185 | script = ( |
177 | 186 | "<style>" |
178 | 187 | + HOST_STYLE |
|
0 commit comments