Spaces:
Running
Running
a11oy app: expand orchestrator to 18 real tabs (Fleet, Gates, Lambda, Audit, Brain, MCP, Reasoner, Bounty, Honest) — all wired to live endpoints. Signed-off-by: Stephen P. Lutar Jr. <stephenlutar2@gmail.com>
Browse files- pages/console.html +91 -1
pages/console.html
CHANGED
|
@@ -127,15 +127,24 @@ pre.out{font-family:var(--mono);font-size:11.5px;line-height:1.55;color:var(--pa
|
|
| 127 |
<div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
|
| 128 |
<div class="nav-group">Operate</div>
|
| 129 |
<div class="nav-item active" data-view="command" onclick="go('command')"><span class="ico">◎</span>Command Center</div>
|
|
|
|
| 130 |
<div class="nav-item" data-view="superpowers" onclick="go('superpowers')"><span class="ico">✦</span>Five Superpowers</div>
|
| 131 |
<div class="nav-item" data-view="warhacker" onclick="go('warhacker')"><span class="ico">⊞</span>Warhacker</div>
|
|
|
|
|
|
|
| 132 |
<div class="nav-group">Observe</div>
|
| 133 |
<div class="nav-item" data-view="observability" onclick="go('observability')"><span class="ico">∿</span>Observability</div>
|
| 134 |
-
<div class="nav-item" data-view="wires" onclick="go('wires')"><span class="ico">⧉</span>Wires · Constitution</div>
|
| 135 |
<div class="nav-item" data-view="mesh" onclick="go('mesh')"><span class="ico">⊹</span>Mesh Reach</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
<div class="nav-group">Govern</div>
|
|
|
|
| 137 |
<div class="nav-item" data-view="formulas" onclick="go('formulas')"><span class="ico">ƒ</span>Formulas</div>
|
|
|
|
| 138 |
<div class="nav-item" data-view="evidence" onclick="go('evidence')"><span class="ico">⎙</span>Evidence Ledger</div>
|
|
|
|
| 139 |
<div class="nav-item" data-view="llm" onclick="go('llm')"><span class="ico">⚇</span>LLM Router</div>
|
| 140 |
<div class="side-foot">Λ = Conjecture 1 · proved = 5<br>{F1,F11,F12,F18,F19}<br>SLSA Build L2 · 5/5 organs<br>v11 LOCKED · 749/14/163</div>
|
| 141 |
</aside>
|
|
@@ -186,6 +195,13 @@ const VIEWS={
|
|
| 186 |
<div class="row"><span>Assertions passed</span><span class="spacer b-live badge">${d.passed}/${d.total_assertions}</span></div>
|
| 187 |
<div class="row"><span>Lean repo</span><span class="spacer mono dim">lutar-lean</span></div>`);}catch(e){setHTML('cevid','<div class="row mono dim">evidence retrying…</div>');}
|
| 188 |
}},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
superpowers:{title:'Five Superpowers',badge:'LIVE',sub:'Five screenshot-provable superpowers. Each button POSTs/GETs a real a11oy endpoint and renders the raw response — Decision Replay, Tamper Theater, Λ-collapse, Resurrection, One-Signed-Organism.',
|
| 190 |
render:(c)=>{c.innerHTML=`
|
| 191 |
<div class="card"><div class="card-h"><span class="card-t">① Decision Replay & ② Tamper Theater</span><span class="card-ep">/v1/receipts/replay</span></div>
|
|
@@ -201,6 +217,21 @@ const VIEWS={
|
|
| 201 |
<div id="wh"></div>${HONEST}`;
|
| 202 |
const probs=[['P1','cannonico','Cannonico — AI-drone oversight','killinchu'],['P2','tychee','Tychee — satellite GSW air-gap','sentra'],['P3','hangar2apps','HANGAR2APPS — deployment-readiness','amaru'],['P4','cyber-rts','Cyber RTS — anomaly triage','amaru'],['P5','raven','Raven — edge AI mesh','a11oy']];
|
| 203 |
el('wh').innerHTML=probs.map(([id,key,t,o])=>`<div class="card"><div class="card-h"><span class="badge b-teal">${id}</span><span class="card-t">${t}</span><span class="card-ep">organ: ${o}</span></div><div class="btns"><button class="btn" onclick="wh_one('${key}','o-${key}')">▶ Launch</button></div><pre class="out" id="o-${key}">— click to launch —</pre></div>`).join('');}},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
observability:{title:'Observability',badge:'MELT + SIGNED',sub:'Observability, but cryptographically true. MELT + distributed tracing where every span is a DSSE-signed Khipu receipt, plus live cross-organ mesh reachability and Λ-drift.',
|
| 205 |
render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="obs_load()">▶ Refresh MELT + mesh</button></div>
|
| 206 |
<div class="kpis" id="obs-kpis"><div class="kpi"><div class="k">Mesh reachable</div><div class="v live" id="ok-mesh">—</div></div><div class="kpi"><div class="k">Signed spans</div><div class="v" id="ok-spans">—</div></div><div class="kpi"><div class="k">Chain verified</div><div class="v teal" id="ok-chain">—</div></div></div>
|
|
@@ -220,6 +251,21 @@ const VIEWS={
|
|
| 220 |
llm:{title:'LLM Router',badge:'5-TIER',sub:'The five-tier model roster a11oy routes through. A real model call when a key is present, an honest stub otherwise — the tier selection and Λ-receipt are always real.',
|
| 221 |
render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Model tiers</span><span class="card-ep">/v1/llm/tiers</span></div><pre class="out" id="l-out">loading…</pre></div>${HONEST}`;
|
| 222 |
try{setOut('l-out',await getJSON(API+'/v1/llm/tiers').catch(()=>getJSON('/api/amaru/v1/llm/tiers')));}catch(e){setOut('l-out','5-tier router (real call when a model key is present; honest stub otherwise). retrying… '+e.message);}}},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 223 |
};
|
| 224 |
|
| 225 |
// superpower handlers — proven-correct contracts (from pages/superpowers.html)
|
|
@@ -248,6 +294,50 @@ async function mesh_load(){try{const d=await getJSON(API+'/v1/observability/summ
|
|
| 248 |
if(!Object.keys(mr).length){setHTML('mesh-host','<pre class="out">'+esc(JSON.stringify(d,null,2))+'</pre>');return;}
|
| 249 |
Object.entries(mr).forEach(([k,v])=>addHTML('mesh-host',`<div class="row"><span class="badge ${(v.status==='ok')?'b-live':'b-err'}">${esc(v.status)}</span><span>${esc(k)}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} · ${esc(v.url||'')}</span></div>`));}catch(e){setHTML('mesh-host','<div class="row mono dim">retry: '+e.message+'</div>');}}
|
| 250 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
function go(view){
|
| 252 |
document.querySelectorAll('.nav-item').forEach(n=>n.classList.toggle('active',n.dataset.view===view));
|
| 253 |
const v=VIEWS[view];const c=el('content');
|
|
|
|
| 127 |
<div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
|
| 128 |
<div class="nav-group">Operate</div>
|
| 129 |
<div class="nav-item active" data-view="command" onclick="go('command')"><span class="ico">◎</span>Command Center</div>
|
| 130 |
+
<div class="nav-item" data-view="fleet" onclick="go('fleet')"><span class="ico">⊟</span>Fleet Health</div>
|
| 131 |
<div class="nav-item" data-view="superpowers" onclick="go('superpowers')"><span class="ico">✦</span>Five Superpowers</div>
|
| 132 |
<div class="nav-item" data-view="warhacker" onclick="go('warhacker')"><span class="ico">⊞</span>Warhacker</div>
|
| 133 |
+
<div class="nav-item" data-view="reason" onclick="go('reason')"><span class="ico">⊕</span>Reasoner</div>
|
| 134 |
+
<div class="nav-item" data-view="mcp" onclick="go('mcp')"><span class="ico">⚙</span>MCP Tools</div>
|
| 135 |
<div class="nav-group">Observe</div>
|
| 136 |
<div class="nav-item" data-view="observability" onclick="go('observability')"><span class="ico">∿</span>Observability</div>
|
|
|
|
| 137 |
<div class="nav-item" data-view="mesh" onclick="go('mesh')"><span class="ico">⊹</span>Mesh Reach</div>
|
| 138 |
+
<div class="nav-item" data-view="wires" onclick="go('wires')"><span class="ico">⧉</span>Wires · Constitution</div>
|
| 139 |
+
<div class="nav-item" data-view="gates" onclick="go('gates')"><span class="ico">⊠</span>Policy Gates</div>
|
| 140 |
+
<div class="nav-item" data-view="lambda" onclick="go('lambda')"><span class="ico">Λ</span>Λ Trust Axes</div>
|
| 141 |
+
<div class="nav-item" data-view="audit" onclick="go('audit')"><span class="ico">≣</span>Audit Log</div>
|
| 142 |
<div class="nav-group">Govern</div>
|
| 143 |
+
<div class="nav-item" data-view="brain" onclick="go('brain')"><span class="ico">⬡</span>Brain · Composition</div>
|
| 144 |
<div class="nav-item" data-view="formulas" onclick="go('formulas')"><span class="ico">ƒ</span>Formulas</div>
|
| 145 |
+
<div class="nav-item" data-view="bounty" onclick="go('bounty')"><span class="ico">∮</span>Λ-Bounty (F23)</div>
|
| 146 |
<div class="nav-item" data-view="evidence" onclick="go('evidence')"><span class="ico">⎙</span>Evidence Ledger</div>
|
| 147 |
+
<div class="nav-item" data-view="honest" onclick="go('honest')"><span class="ico">⊘</span>Honest Doctrine</div>
|
| 148 |
<div class="nav-item" data-view="llm" onclick="go('llm')"><span class="ico">⚇</span>LLM Router</div>
|
| 149 |
<div class="side-foot">Λ = Conjecture 1 · proved = 5<br>{F1,F11,F12,F18,F19}<br>SLSA Build L2 · 5/5 organs<br>v11 LOCKED · 749/14/163</div>
|
| 150 |
</aside>
|
|
|
|
| 195 |
<div class="row"><span>Assertions passed</span><span class="spacer b-live badge">${d.passed}/${d.total_assertions}</span></div>
|
| 196 |
<div class="row"><span>Lean repo</span><span class="spacer mono dim">lutar-lean</span></div>`);}catch(e){setHTML('cevid','<div class="row mono dim">evidence retrying…</div>');}
|
| 197 |
}},
|
| 198 |
+
fleet:{title:'Fleet Health',badge:'5 ORGANS',sub:'The orchestrator\u2019s registry of every governed organ \u2014 live reachability (real public-URL probes), per-organ latency, and the doctrine each organ reports. Unreachable is shown honestly, never faked green.',
|
| 199 |
+
render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="fleet_load()">\u25b6 Probe + read registry</button></div>
|
| 200 |
+
<div class="kpis"><div class="kpi"><div class="k">Reachable</div><div class="v live" id="fl-reach">\u2014</div><div class="d">live public-URL probe</div></div>
|
| 201 |
+
<div class="kpi"><div class="k">Doctrine</div><div class="v teal" id="fl-doc">\u2014</div><div class="d">reported by fleet</div></div>
|
| 202 |
+
<div class="kpi"><div class="k">\u039b status</div><div class="v teal">Conjecture 1</div><div class="d">NOT a theorem</div></div></div>
|
| 203 |
+
<div class="card"><div class="card-h"><span class="card-t">Live reachability \u2014 a11oy \u2192 each organ</span><span class="card-ep">/v1/observability/summary</span></div><div id="fl-reach-host"><div class="row mono dim">probing\u2026</div></div></div>
|
| 204 |
+
<div class="card"><div class="card-h"><span class="card-t">Organ registry \u2014 doctrine the fleet reports</span><span class="card-ep">GET /v4/fleet</span></div><div id="fl-reg"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;window.fleet_load();}},
|
| 205 |
superpowers:{title:'Five Superpowers',badge:'LIVE',sub:'Five screenshot-provable superpowers. Each button POSTs/GETs a real a11oy endpoint and renders the raw response — Decision Replay, Tamper Theater, Λ-collapse, Resurrection, One-Signed-Organism.',
|
| 206 |
render:(c)=>{c.innerHTML=`
|
| 207 |
<div class="card"><div class="card-h"><span class="card-t">① Decision Replay & ② Tamper Theater</span><span class="card-ep">/v1/receipts/replay</span></div>
|
|
|
|
| 217 |
<div id="wh"></div>${HONEST}`;
|
| 218 |
const probs=[['P1','cannonico','Cannonico — AI-drone oversight','killinchu'],['P2','tychee','Tychee — satellite GSW air-gap','sentra'],['P3','hangar2apps','HANGAR2APPS — deployment-readiness','amaru'],['P4','cyber-rts','Cyber RTS — anomaly triage','amaru'],['P5','raven','Raven — edge AI mesh','a11oy']];
|
| 219 |
el('wh').innerHTML=probs.map(([id,key,t,o])=>`<div class="card"><div class="card-h"><span class="badge b-teal">${id}</span><span class="card-t">${t}</span><span class="card-ep">organ: ${o}</span></div><div class="btns"><button class="btn" onclick="wh_one('${key}','o-${key}')">▶ Launch</button></div><pre class="out" id="o-${key}">— click to launch —</pre></div>`).join('');}},
|
| 220 |
+
reason:{title:'Governed Reasoner',badge:'LIVE POST',sub:'Ask the orchestrator to reason about an action under the constitution. a11oy selects the governing policy gate, evaluates severity, and returns the real rationale + witness-quorum requirement \u2014 no canned text.',
|
| 221 |
+
render:(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Reason about a governed action</span><span class="card-ep">POST /v1/reason</span></div>
|
| 222 |
+
<div class="btns">
|
| 223 |
+
<button class="btn teal" onclick="reason_run('Launch a kinetic counter-UAS engagement','high')">\u25b6 High-severity action</button>
|
| 224 |
+
<button class="btn" onclick="reason_run('Summarize today\\'s telemetry','low')">\u25b6 Low-severity action</button>
|
| 225 |
+
</div><pre class="out" id="o-reason">\u2014 click to reason \u2014</pre></div>${HONEST}`;}},
|
| 226 |
+
mcp:{title:'MCP Tool Plane',badge:'LIVE CALL',sub:'The Model-Context-Protocol tools a11oy exposes to agents \u2014 read the registry, then actually invoke a tool. Every call returns a real, doctrine-stamped response (kernel commit c7c0ba17).',
|
| 227 |
+
render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Registered MCP tools</span><span class="card-ep">/v1/mcp/tools</span></div><div id="mcp-list"><div class="row mono dim">loading\u2026</div></div></div>
|
| 228 |
+
<div class="card"><div class="card-h"><span class="card-t">Invoke a tool</span><span class="card-ep">POST /v1/mcp/call</span></div>
|
| 229 |
+
<div class="btns">
|
| 230 |
+
<button class="btn teal" onclick="mcp_call('lambda_score')">\u25b6 lambda_score</button>
|
| 231 |
+
<button class="btn" onclick="mcp_call('a11oy_gate')">\u25b6 a11oy_gate</button>
|
| 232 |
+
<button class="btn" onclick="mcp_call('khipu_sign')">\u25b6 khipu_sign</button>
|
| 233 |
+
<button class="btn" onclick="mcp_call('khipu_verify')">\u25b6 khipu_verify</button>
|
| 234 |
+
</div><pre class="out" id="o-mcp">\u2014 click to invoke \u2014</pre></div>${HONEST}`;window.mcp_list();}},
|
| 235 |
observability:{title:'Observability',badge:'MELT + SIGNED',sub:'Observability, but cryptographically true. MELT + distributed tracing where every span is a DSSE-signed Khipu receipt, plus live cross-organ mesh reachability and Λ-drift.',
|
| 236 |
render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="obs_load()">▶ Refresh MELT + mesh</button></div>
|
| 237 |
<div class="kpis" id="obs-kpis"><div class="kpi"><div class="k">Mesh reachable</div><div class="v live" id="ok-mesh">—</div></div><div class="kpi"><div class="k">Signed spans</div><div class="v" id="ok-spans">—</div></div><div class="kpi"><div class="k">Chain verified</div><div class="v teal" id="ok-chain">—</div></div></div>
|
|
|
|
| 251 |
llm:{title:'LLM Router',badge:'5-TIER',sub:'The five-tier model roster a11oy routes through. A real model call when a key is present, an honest stub otherwise — the tier selection and Λ-receipt are always real.',
|
| 252 |
render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Model tiers</span><span class="card-ep">/v1/llm/tiers</span></div><pre class="out" id="l-out">loading…</pre></div>${HONEST}`;
|
| 253 |
try{setOut('l-out',await getJSON(API+'/v1/llm/tiers').catch(()=>getJSON('/api/amaru/v1/llm/tiers')));}catch(e){setOut('l-out','5-tier router (real call when a model key is present; honest stub otherwise). retrying… '+e.message);}}},
|
| 254 |
+
gates:{title:'Policy Gates',badge:'49 GATES',sub:'Every policy gate the orchestrator composes \u2014 each named to a Lean theorem and file. lean_status and lean_verified are reported honestly: \u201creal\u201d means a Lean theorem exists; verified=false means it is not yet sorry-free.',
|
| 255 |
+
render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">Gates</div><div class="v" id="g-count">\u2014</div></div><div class="kpi"><div class="k">Lean-verified</div><div class="v teal" id="g-ver">\u2014</div><div class="d">sorry-free</div></div><div class="kpi"><div class="k">Lean-cited</div><div class="v" id="g-cite">\u2014</div><div class="d">theorem named</div></div></div>
|
| 256 |
+
<div class="card"><div class="card-h"><span class="card-t">Gate registry</span><span class="card-ep">/v1/gates</span></div><div id="g-host"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;window.gates_load();}},
|
| 257 |
+
lambda:{title:'\u039b Trust Axes',badge:'13 AXES',sub:'The 13-axis trust vector and the aggregate \u039b the gate floor evaluates. \u039b is Conjecture 1 (NOT a theorem): the aggregator is one honest choice, not a uniquely-pinned function \u2014 shown via the uniqueness field.',
|
| 258 |
+
render:async(c)=>{c.innerHTML=`<div class="kpis"><div class="kpi"><div class="k">\u039b aggregate</div><div class="v teal" id="la-val">\u2014</div></div><div class="kpi"><div class="k">Floor</div><div class="v" id="la-floor">\u2014</div></div><div class="kpi"><div class="k">Gate</div><div class="v" id="la-pass">\u2014</div></div><div class="kpi"><div class="k">Uniqueness</div><div class="v warn">Conjecture 1</div></div></div>
|
| 259 |
+
<div class="card"><div class="card-h"><span class="card-t">Per-axis scores</span><span class="card-ep">/v1/lambda</span></div><div id="la-host"><div class="row mono dim">loading\u2026</div></div></div>${HONEST}`;window.lambda_load();}},
|
| 260 |
+
audit:{title:'Audit Log',badge:'RING BUFFER',sub:'The orchestrator\u2019s in-memory audit ring (maxlen 200, resets on rebuild \u2014 disclosed honestly). Every governed decision a11oy makes lands here; durable storage is on the tower/UDS deploy, not the HF Space.',
|
| 261 |
+
render:async(c)=>{c.innerHTML=`<div class="btns"><button class="btn teal" onclick="audit_load()">\u25b6 Refresh log</button></div><div class="card"><div class="card-h"><span class="card-t">Recent governed decisions</span><span class="card-ep">/v1/audit-log</span></div><pre class="out" id="o-audit">loading\u2026</pre></div>${HONEST}`;window.audit_load();}},
|
| 262 |
+
brain:{title:'Brain \u00b7 Gate Composition',badge:'LIVE',sub:'How the orchestrating brain composes governance: the gate-composition rules, the \u039b floor, and the formula roster it draws on. This is the wiring diagram of the decision substrate, read live.',
|
| 263 |
+
render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Brain & composition</span><span class="card-ep">/v1/brain</span></div><div id="br-host"><div class="row mono dim">loading\u2026</div></div><pre class="out" id="o-brain" style="margin-top:1rem">loading\u2026</pre></div>${HONEST}`;window.brain_load();}},
|
| 264 |
+
bounty:{title:'\u039b-Bounty \u00b7 F23',badge:'OPEN CONJECTURE',sub:'F23 (\u039b uniqueness) is an OPEN bounty \u2014 NOT a theorem. The arbiter is verify-proof CI on a PR to lambda-bounty (sole, no-bypass). Read the live conjecture statement and the receipts buffered against it.',
|
| 265 |
+
render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Conjecture 1 (F23)</span><span class="card-ep">/api/lambda-bounty/healthz</span></div><div id="bo-host"><div class="row mono dim">loading\u2026</div></div></div>
|
| 266 |
+
<div class="card"><div class="card-h"><span class="card-t">Submission receipts</span><span class="card-ep">/api/lambda-bounty/receipts</span></div><pre class="out" id="o-bounty">loading\u2026</pre></div>${HONEST}`;window.bounty_load();}},
|
| 267 |
+
honest:{title:'Honest Doctrine',badge:'NO BANDAIDS',sub:'The honesty panel, served straight from the organ: the doctrine lock, the footer claims, and the honest labels. This is the single source of truth for what we do and do NOT claim \u2014 published, not marketed.',
|
| 268 |
+
render:async(c)=>{c.innerHTML=`<div class="card"><div class="card-h"><span class="card-t">Doctrine lock & honest labels</span><span class="card-ep">/v1/honest</span></div><div id="ho-host"><div class="row mono dim">loading\u2026</div></div><pre class="out" id="o-honest" style="margin-top:1rem">loading\u2026</pre></div>${HONEST}`;window.honest_load();}},
|
| 269 |
};
|
| 270 |
|
| 271 |
// superpower handlers — proven-correct contracts (from pages/superpowers.html)
|
|
|
|
| 294 |
if(!Object.keys(mr).length){setHTML('mesh-host','<pre class="out">'+esc(JSON.stringify(d,null,2))+'</pre>');return;}
|
| 295 |
Object.entries(mr).forEach(([k,v])=>addHTML('mesh-host',`<div class="row"><span class="badge ${(v.status==='ok')?'b-live':'b-err'}">${esc(v.status)}</span><span>${esc(k)}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} · ${esc(v.url||'')}</span></div>`));}catch(e){setHTML('mesh-host','<div class="row mono dim">retry: '+e.message+'</div>');}}
|
| 296 |
|
| 297 |
+
// ===== expanded orchestrator handlers (all live endpoints) =====
|
| 298 |
+
async function fleet_load(){
|
| 299 |
+
try{const d=await getJSON(API+'/v1/observability/summary');const mr=d.mesh_reach||{};const arr=Object.values(mr);let ok=0;setHTML('fl-reach-host','');
|
| 300 |
+
arr.forEach(v=>{const up=v.status==='ok';if(up)ok++;addHTML('fl-reach-host',`<div class="row"><span class="badge ${up?'b-live':'b-err'}">${esc(v.status||'?')}</span><span>${esc(v.organ||v.name||v.url||'organ')}</span><span class="spacer mono dim">${v.latency_ms?Math.round(v.latency_ms)+'ms':''} ${esc(v.url||'')}</span></div>`);});
|
| 301 |
+
setTxt('fl-reach',arr.length?ok+'/'+arr.length:'\u2014');}catch(e){setHTML('fl-reach-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
|
| 302 |
+
try{const d=await getJSON('/v4/fleet');setTxt('fl-doc',d.doctrine?.version||d.doctrine||'v11');const peers=d.peers||[];setHTML('fl-reg','');
|
| 303 |
+
peers.forEach(p=>{const doc=p.doctrine?(`v${p.doctrine.version||p.doctrine}`):'';const st=(p.status||'').toLowerCase();const up=st==='ok'||st==='reachable';
|
| 304 |
+
addHTML('fl-reg',`<div class="row"><span class="badge ${up?'b-live':'b-gold'}">${esc(p.flagship||p.name||'organ')}</span><span class="mono dim">${esc(p.status||'')}</span><span class="spacer mono dim">${esc(doc)} ${esc(p.error||'')}</span></div>`);});
|
| 305 |
+
if(!peers.length)setHTML('fl-reg','<div class="row mono dim">registry empty</div>');
|
| 306 |
+
addHTML('fl-reg',`<div class="row"><span class="mono dim">Note: /v4/fleet probes from inside the Space (Space\u2192Space network-isolated on HF, so it can read \u201cunreachable\u201d). The live reachability above uses public-URL probes \u2014 the honest 5/5 number.</span></div>`);}catch(e){setHTML('fl-reg','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
|
| 307 |
+
}
|
| 308 |
+
async function reason_run(query,severity){try{setOut('o-reason','reasoning\u2026');const d=await postJSON(API+'/v1/reason',{query,severity,context:'a11oy app'});setOut('o-reason','GATE '+esc(d.gate||'?')+' \u00b7 severity '+esc(d.severity_evaluated||severity)+'\n\n'+JSON.stringify(d,null,2));}catch(e){setOut('o-reason','retry: '+e.message);}}
|
| 309 |
+
async function mcp_list(){try{const d=await getJSON(API+'/v1/mcp/tools');setHTML('mcp-list','');(d.tools||[]).forEach(t=>addHTML('mcp-list',`<div class="row"><span class="badge b-teal">${esc(t.name)}</span><span>${esc(t.description||'')}</span><span class="spacer mono dim">${esc(t.flagship||'')}</span></div>`));}catch(e){setHTML('mcp-list','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
|
| 310 |
+
async function mcp_call(name){try{setOut('o-mcp','invoking '+name+'\u2026');
|
| 311 |
+
const args = name==='lambda_score'?{axes:AXES_OK}
|
| 312 |
+
: name==='a11oy_gate'?{action:ACTION}
|
| 313 |
+
: name==='khipu_sign'?{payload:{actionId:'mcp-demo',severity:'high'}}
|
| 314 |
+
: {receipt:{actionId:'mcp-demo'}};
|
| 315 |
+
const d=await postJSON(API+'/v1/mcp/call',{name,arguments:args});setOut('o-mcp','TOOL '+esc(d.tool||name)+' \u00b7 '+esc(d.status||'')+' \u00b7 kernel '+esc(d.kernel_commit||'')+'\n\n'+JSON.stringify(d,null,2));}catch(e){setOut('o-mcp','retry: '+e.message);}}
|
| 316 |
+
async function gates_load(){try{const d=await getJSON(API+'/v1/gates');const g=d.gates||[];setTxt('g-count',d.count||g.length);
|
| 317 |
+
const ver=g.filter(x=>x.lean_verified===true).length;const cite=g.filter(x=>x.lean_theorem).length;setTxt('g-ver',ver);setTxt('g-cite',cite);
|
| 318 |
+
setHTML('g-host','');g.slice(0,60).forEach(x=>{const v=x.lean_verified===true;addHTML('g-host',`<div class="row"><span class="badge ${v?'b-live':'b-gold'}">${v?'VERIFIED':(x.lean_status||'real')}</span><span>${esc(x.name)}</span><span class="spacer mono dim">${esc(x.lean_theorem||'')}</span></div>`);});
|
| 319 |
+
addHTML('g-host',`<div class="row"><span class="mono dim">Honest: \u201creal\u201d = a Lean theorem is named; \u201cVERIFIED\u201d = sorry-free. Most gates cite a theorem; few are sorry-free yet \u2014 shown truthfully.</span></div>`);}catch(e){setHTML('g-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
|
| 320 |
+
async function lambda_load(){try{const d=await getJSON(API+'/v1/lambda');setTxt('la-val',(d.lambda!=null?d.lambda.toFixed?d.lambda.toFixed(4):d.lambda:'\u2014'));setTxt('la-floor',d.lambda_floor??'\u2014');setTxt('la-pass',d.pass?'ALLOW':(d.pass===false?'DENY':'\u2014'));
|
| 321 |
+
const axes=d.axes||[];setHTML('la-host','');axes.forEach(a=>{const pct=Math.round((a.score||0)*100);addHTML('la-host',`<div class="row"><span style="min-width:9rem">${esc(a.name)}</span><span style="flex:1;height:7px;background:#161616;border-radius:4px;overflow:hidden"><span style="display:block;height:100%;width:${pct}%;background:linear-gradient(90deg,var(--teal),var(--gold))"></span></span><span class="mono dim" style="min-width:3rem;text-align:right">${(a.score||0).toFixed(2)}</span></div>`);});}catch(e){setHTML('la-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
|
| 322 |
+
async function audit_load(){try{const d=await getJSON(API+'/v1/audit-log');const e=d.entries||[];setOut('o-audit',e.length?JSON.stringify(d,null,2):'Audit ring is empty (total_buffered '+(d.total_buffered??0)+'). '+(d.note||'')+'\n\nRun a Superpower or Reasoner action, then refresh \u2014 governed decisions append here.');}catch(e){setOut('o-audit','retry: '+e.message);}}
|
| 323 |
+
async function brain_load(){try{const d=await getJSON(API+'/v1/brain');const b=d.brain||{};setHTML('br-host','');
|
| 324 |
+
addHTML('br-host',`<div class="row"><span>Role</span><span class="spacer b-gold badge">${esc(b.role||'')}</span></div>`);
|
| 325 |
+
addHTML('br-host',`<div class="row"><span>\u039b floor</span><span class="spacer b-teal badge">${esc(b.lambda_floor??'')}</span></div>`);
|
| 326 |
+
const gc=b.gate_composition||{};addHTML('br-host',`<div class="row"><span>Policy gates</span><span class="spacer b-gold badge">${esc(gc.policy_gates??'')}</span></div>`);
|
| 327 |
+
addHTML('br-host',`<div class="row"><span>Anchor-formula gates</span><span class="spacer b-gold badge">${esc(gc.anchor_formula_gates??'')}</span></div>`);
|
| 328 |
+
setOut('o-brain',d);}catch(e){setHTML('br-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
|
| 329 |
+
async function bounty_load(){try{const d=await getJSON('/api/lambda-bounty/healthz');const cj=d.conjecture||{};setHTML('bo-host','');
|
| 330 |
+
addHTML('bo-host',`<div class="row"><span class="badge b-err">${esc(cj.status||'OPEN')}</span><span>${esc(cj.id||'Conjecture 1')} \u00b7 ${esc(cj.formula||'F23')}</span></div>`);
|
| 331 |
+
addHTML('bo-host',`<div class="row"><span class="mono" style="font-size:11.5px;color:var(--paragraph)">${esc(cj.statement||'')}</span></div>`);
|
| 332 |
+
addHTML('bo-host',`<div class="row"><span>Arbiter</span><span class="spacer mono dim">${esc(cj.arbiter||'')}</span></div>`);
|
| 333 |
+
addHTML('bo-host',`<div class="row"><span>Receipts buffered</span><span class="spacer b-gold badge">${esc(d.receipts_buffered??0)}</span></div>`);}catch(e){setHTML('bo-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}
|
| 334 |
+
try{const r=await getJSON('/api/lambda-bounty/receipts');setOut('o-bounty',r);}catch(e){setOut('o-bounty','No submission receipts yet (the bounty is open; a valid Lean proof on a PR to lambda-bounty is the only way to close it). retry: '+e.message);}}
|
| 335 |
+
async function honest_load(){try{const d=await getJSON(API+'/v1/honest');const dl=d.doctrine_lock||{};setHTML('ho-host','');
|
| 336 |
+
addHTML('ho-host',`<div class="row"><span>Doctrine</span><span class="spacer b-gold badge">${esc(dl.doctrine||'v11')} \u00b7 ${esc(dl.state||'LOCKED')}</span></div>`);
|
| 337 |
+
addHTML('ho-host',`<div class="row"><span>Kernel</span><span class="spacer mono dim">${esc(dl.declarations||749)} decls / ${esc(dl.axioms||14)} axioms / ${esc(dl.sorries||163)} sorries \u00b7 ${esc(dl.commit||'c7c0ba17')}</span></div>`);
|
| 338 |
+
addHTML('ho-host',`<div class="row"><span>\u039b</span><span class="spacer badge b-err">${esc(dl.lambda||'Conjecture 1')}</span></div>`);
|
| 339 |
+
setOut('o-honest',d);}catch(e){setHTML('ho-host','<div class="row mono dim">retry: '+esc(e.message)+'</div>');}}
|
| 340 |
+
|
| 341 |
function go(view){
|
| 342 |
document.querySelectorAll('.nav-item').forEach(n=>n.classList.toggle('active',n.dataset.view===view));
|
| 343 |
const v=VIEWS[view];const c=el('content');
|