betterwithage Claude Opus 4.7 commited on
Commit
ee3c4a7
·
verified ·
1 Parent(s): 9b1a6ad

deploy(hf): sync szl-holdings/a11oy@main derived COPY set

Browse files

Reusable Dockerfile-COPY-derived deploy from szl-holdings/a11oy main.
Files: 1050 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).

Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

Files changed (1) hide show
  1. console/index.html +169 -52
console/index.html CHANGED
@@ -173,6 +173,50 @@ details.raw[open] summary{color:var(--muted);}
173
  .tl-graphbox{height:380px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
174
  .ln-dagbox{height:440px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  </style>
177
  </head>
178
  <body>
@@ -195,58 +239,11 @@ details.raw[open] summary{color:var(--muted);}
195
  <div class="app">
196
  <aside class="side">
197
  <div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
198
- <div class="nav-group">Operate</div>
199
- <div class="nav-item active" data-view="command" onclick="go('command')"><span class="ico">◎</span>Command Center</div>
200
- <div class="nav-item" data-view="ask" onclick="go('ask')"><span class="ico">✦</span>Ask &amp; Act</div>
201
- <div class="nav-item" data-view="operate" onclick="go('operate')"><span class="ico">▸</span>Governed Run-Loop</div>
202
- <div class="nav-item" data-view="demo" onclick="go('demo')"><span class="ico">⊞</span>Run a Demo</div>
203
- <div class="nav-item" data-view="fleet" onclick="go('fleet')"><span class="ico">⊟</span>System Health</div>
204
- <div class="nav-item" data-view="mesh" onclick="go('mesh')"><span class="ico">⊹</span>Live System Map</div>
205
- <div class="nav-group">The Brain (3D)</div>
206
- <div class="nav-item" data-view="organism" onclick="go('organism')"><span class="ico">❋</span>Living Organism</div>
207
- <div class="nav-item" data-view="ayni" onclick="go('ayni')"><span class="ico">♺</span>Reciprocity</div>
208
- <div class="nav-item" data-view="chain" onclick="go('chain')"><span class="ico">⛓</span>Receipt Chain</div>
209
- <div class="nav-item" data-view="pulse" onclick="go('pulse')"><span class="ico">◍</span>Global Pulse</div>
210
- <div class="nav-item" data-view="trustspace" onclick="go('trustspace')"><span class="ico">⁂</span>Trust Space</div>
211
- <div class="nav-item" data-view="ontology" onclick="go('ontology')"><span class="ico">⌗</span>Service Map</div>
212
- <div class="nav-group">Knowledge Base</div>
213
- <div class="nav-item" data-view="knowledge" onclick="go('knowledge')"><span class="ico">⬡</span>Knowledge Ontology</div>
214
- <div class="nav-item" data-view="kbformulas" onclick="go('kbformulas')"><span class="ico">∑</span>Formulas</div>
215
- <div class="nav-item" data-view="policies" onclick="go('policies')"><span class="ico">▤</span>Vertical Policies</div>
216
- <div class="nav-group">Decide &amp; Govern</div>
217
- <div class="nav-item" data-view="lambda" onclick="go('lambda')"><span class="ico">◔</span>Trust Score</div>
218
- <div class="nav-item" data-view="decision" onclick="go('decision')"><span class="ico">◈</span>Governed Decision</div>
219
- <div class="nav-item" data-view="gates" onclick="go('gates')"><span class="ico">⊠</span>Safety Gates</div>
220
- <div class="nav-item" data-view="feed" onclick="go('feed')"><span class="ico">∿</span>Live Decisions</div>
221
- <div class="nav-item" data-view="govern" onclick="go('govern')"><span class="ico">✓</span>Readiness &amp; Compliance</div>
222
- <div class="nav-item" data-view="chat" onclick="go('chat')"><span class="ico">✦</span>Governed AI Chat</div>
223
- <div class="nav-item" data-view="forecast" onclick="go('forecast')"><span class="ico">↗</span>Forecast</div>
224
- <div class="nav-group">Prove &amp; Verify</div>
225
- <div class="nav-item" data-view="receipts" onclick="go('receipts')"><span class="ico">⎙</span>Signed Receipts</div>
226
- <div class="nav-item" data-view="arena" onclick="go('arena')"><span class="ico">⊜</span>Eval Arena</div>
227
- <div class="nav-item" data-view="threats" onclick="go('threats')"><span class="ico">☠</span>Threat Library</div>
228
- <div class="nav-group">World &amp; Threat Intel</div>
229
- <div class="nav-item" data-view="cve" onclick="go('cve')"><span class="ico">⚠</span>CVE Watch</div>
230
- <div class="nav-item" data-view="kev" onclick="go('kev')"><span class="ico">⊕</span>Known-Exploited</div>
231
- <div class="nav-item" data-view="attack" onclick="go('attack')"><span class="ico">⚔</span>Adversary Techniques</div>
232
- <div class="nav-group">Business &amp; Ecosystem</div>
233
- <div class="nav-item" data-view="business" onclick="go('business')"><span class="ico">◑</span>Business Observability</div>
234
- <div class="nav-item" data-view="verticals" onclick="go('verticals')"><span class="ico">▦</span>Vertical-Pack Ecosystem</div>
235
- <div class="nav-group">Models &amp; Tools</div>
236
- <div class="nav-item" data-view="llm" onclick="go('llm')"><span class="ico">⚇</span>Model Router</div>
237
- <div class="nav-item" data-view="mcp" onclick="go('mcp')"><span class="ico">⚙</span>Agent Tools</div>
238
- <div class="nav-item" data-view="honest" onclick="go('honest')"><span class="ico">⊘</span>What We Claim</div>
239
- <div class="nav-group">Leader-Grade (NEW)</div>
240
- <div class="nav-item" data-view="ledger3d" onclick="go('ledger3d')"><span class="ico">◈</span>Trust Ledger</div>
241
- <div class="nav-item" data-view="lineage" onclick="go('lineage')"><span class="ico">⚛</span>Knowledge Lineage</div>
242
- <div class="nav-item" data-view="mission" onclick="go('mission')"><span class="ico">⬢</span>Mission Health</div>
243
- <div class="nav-item" data-view="replay" onclick="go('replay')"><span class="ico">◷</span>Reasoning Replay</div>
244
- <div class="nav-group">Doctrine</div>
245
- <div class="nav-item" data-view="gpd" onclick="go('gpd')"><span class="ico">⟁</span>Governed Post-Determinism</div>
246
- <div class="nav-group">Experimental (CI-green)</div>
247
- <div class="nav-item" data-view="experimental" onclick="go('experimental')"><span class="ico">⚗</span>Experimental Tier</div>
248
- <div class="nav-item" onclick="window.open('/proven-formulas','_blank')" style="cursor:pointer"><span class="ico">∿</span>Wave9/10 Formulas ↗</div>
249
- <div class="nav-item" onclick="window.open('/frontier','_blank')" style="cursor:pointer"><span class="ico">◌</span>Frontier Showcase ↗</div>
250
  <div class="side-foot">Trust score = research conjecture<br>8 formulas formally proven<br>SLSA L1 honest · L2 build-attested (Rekor) · L3+ roadmap · 5 services<br>Verifiable receipts · honest by design<br><span style="color:#c9a05f;font-size:9px">+ 80+ EXPERIMENTAL · CI-green</span></div>
251
  </aside>
252
 
@@ -1592,6 +1589,7 @@ function go(view){
1592
  v.render(el('vbody'));
1593
  if(history.replaceState)history.replaceState(null,'','#'+view);
1594
  if(window.innerWidth<=820)document.querySelector('.side').classList.remove('open');
 
1595
  }
1596
  const start=(location.hash||'#command').slice(1);
1597
  go(VIEWS[start]?start:'command');
@@ -1945,5 +1943,124 @@ async function operate_run(){
1945
  window.operate_run=operate_run;
1946
 
1947
  </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1948
  </body>
1949
  </html>
 
173
  .tl-graphbox{height:380px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
174
  .ln-dagbox{height:440px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
175
 
176
+
177
+ /* ===== IA REDESIGN — domain rail + flagships + command palette ===== */
178
+ /* Collapses the flat ~40-item nav into a persistent 7-domain rail + a featured
179
+ flagship row + a fuzzy ⌘K palette. Every view stays reachable. Static CSS. */
180
+ .cmdk-btn{display:flex;align-items:center;gap:.5rem;width:100%;margin:.1rem 0 .3rem;padding:.55rem .6rem;border-radius:8px;
181
+ border:1px solid var(--gold-line);background:var(--panel);color:var(--paragraph);font-family:var(--mono);font-size:11px;cursor:pointer;transition:.15s;letter-spacing:.03em;text-align:left;}
182
+ .cmdk-btn:hover{border-color:var(--teal-line);color:var(--cream);background:var(--teal-soft);}
183
+ .cmdk-btn .ico{font-size:13px;color:var(--teal);}
184
+ .cmdk-btn .kbd{margin-left:auto;font-size:9px;color:var(--dim);border:1px solid var(--gold-line);border-radius:4px;padding:.05rem .32rem;}
185
+ /* flagships (max 5) */
186
+ .featured{display:grid;grid-template-columns:1fr 1fr;gap:.42rem;margin:.15rem .05rem .35rem;}
187
+ .flag-card{display:flex;align-items:center;gap:.45rem;padding:.5rem .55rem;border-radius:8px;cursor:pointer;
188
+ border:1px solid var(--gold-line);background:linear-gradient(135deg,rgba(201,183,135,.07),rgba(95,179,163,.05));
189
+ color:var(--cream);font-size:11.5px;transition:.15s;border-left:2px solid var(--gold-line);}
190
+ .flag-card:hover{border-color:var(--teal-line);background:var(--teal-soft);}
191
+ .flag-card.active{border-color:var(--teal);border-left-color:var(--teal);color:var(--teal);}
192
+ .flag-card .ico{font-size:12px;color:var(--gold);}
193
+ .flag-card.full{grid-column:1 / -1;}
194
+ /* domain rail (accordion) */
195
+ .dom{display:flex;align-items:center;gap:.55rem;padding:.5rem .6rem;border-radius:7px;cursor:pointer;color:var(--cream);
196
+ font-size:12.5px;font-weight:500;transition:.15s;border:1px solid transparent;}
197
+ .dom:hover{background:var(--gold-soft);}
198
+ .dom.open{color:var(--teal);}
199
+ .dom .ico{width:16px;text-align:center;color:var(--teal);font-size:13px;}
200
+ .dom .count{font-family:var(--mono);font-size:9px;color:var(--dim);margin-left:.15rem;}
201
+ .dom .chev{margin-left:auto;color:var(--dim);font-size:10px;transition:transform .15s;}
202
+ .dom.open .chev{transform:rotate(90deg);color:var(--teal);}
203
+ .domidx{display:none;margin:.05rem 0 .45rem .55rem;padding-left:.35rem;border-left:1px solid var(--gold-line);}
204
+ .domidx.open{display:block;}
205
+ /* ⌘K command palette overlay */
206
+ .pal-ov{position:fixed;inset:0;z-index:200;background:rgba(4,4,4,.72);backdrop-filter:blur(3px);display:none;align-items:flex-start;justify-content:center;}
207
+ .pal-ov.open{display:flex;}
208
+ .palette{margin-top:9vh;width:min(640px,92vw);background:var(--panel);border:1px solid var(--teal-line);border-radius:12px;overflow:hidden;box-shadow:0 24px 80px rgba(0,0,0,.6);}
209
+ .palette input{width:100%;box-sizing:border-box;padding:1rem 1.1rem;background:var(--panel2);border:none;border-bottom:1px solid var(--gold-line);
210
+ color:var(--cream);font-family:var(--mono);font-size:14px;outline:none;}
211
+ .palette input::placeholder{color:var(--dim);}
212
+ .pal-hint{display:flex;gap:1rem;flex-wrap:wrap;padding:.4rem 1.1rem;font-family:var(--mono);font-size:9px;color:var(--dim);letter-spacing:.1em;text-transform:uppercase;border-bottom:1px solid var(--gold-soft);}
213
+ .pal-list{max-height:56vh;overflow:auto;padding:.4rem;}
214
+ .pal-item{display:flex;align-items:center;gap:.7rem;padding:.55rem .7rem;border-radius:8px;cursor:pointer;color:var(--paragraph);font-size:13px;}
215
+ .pal-item .ico{width:16px;text-align:center;color:var(--teal);}
216
+ .pal-item .dom-tag{margin-left:auto;font-family:var(--mono);font-size:9px;color:var(--dim);letter-spacing:.08em;text-transform:uppercase;}
217
+ .pal-item.sel,.pal-item:hover{background:var(--teal-soft);color:var(--cream);}
218
+ .pal-empty{padding:1.2rem;text-align:center;color:var(--dim);font-family:var(--mono);font-size:11px;}
219
+
220
  </style>
221
  </head>
222
  <body>
 
239
  <div class="app">
240
  <aside class="side">
241
  <div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
242
+ <button class="cmdk-btn" onclick="openPalette()" title="Search every view — ⌘K / Ctrl-K"><span class="ico">⌕</span>Search all views<span class="kbd">⌘K</span></button>
243
+ <div class="nav-group">Flagships</div>
244
+ <div class="featured" id="featured"></div>
245
+ <div class="nav-group">Domains</div>
246
+ <div class="rail" id="rail"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  <div class="side-foot">Trust score = research conjecture<br>8 formulas formally proven<br>SLSA L1 honest · L2 build-attested (Rekor) · L3+ roadmap · 5 services<br>Verifiable receipts · honest by design<br><span style="color:#c9a05f;font-size:9px">+ 80+ EXPERIMENTAL · CI-green</span></div>
248
  </aside>
249
 
 
1589
  v.render(el('vbody'));
1590
  if(history.replaceState)history.replaceState(null,'','#'+view);
1591
  if(window.innerWidth<=820)document.querySelector('.side').classList.remove('open');
1592
+ if(window.syncRail)window.syncRail(view);
1593
  }
1594
  const start=(location.hash||'#command').slice(1);
1595
  go(VIEWS[start]?start:'command');
 
1943
  window.operate_run=operate_run;
1944
 
1945
  </script>
1946
+ <div class="pal-ov" id="pal-ov" onclick="if(event.target===this)closePalette()">
1947
+ <div class="palette" role="dialog" aria-label="Command palette — search all views">
1948
+ <input id="pal-input" type="text" placeholder="Search all views… type to filter · ↑↓ move · ↵ open · Esc close" autocomplete="off" spellcheck="false" aria-label="Search all views"/>
1949
+ <div class="pal-hint"><span>⌘K / Ctrl-K</span><span>↑↓ navigate</span><span>↵ open</span><span>Esc close</span></div>
1950
+ <div class="pal-list" id="pal-list"></div>
1951
+ </div>
1952
+ </div>
1953
+
1954
+ <script>
1955
+ /* ============================================================================
1956
+ IA REDESIGN — persistent 7-domain rail + 5 flagships + ⌘K command palette
1957
+ Collapses the flat ~40-item nav WITHOUT removing any view. Every VIEWS entry
1958
+ stays reachable via its domain index panel AND the fuzzy palette. External
1959
+ links (/proven-formulas, /frontier) are preserved in the Doctrine domain and
1960
+ the palette. Static HTML/JS only — no framework. Honest labels + doctrine bar
1961
+ are untouched. Palantir/Anduril command-center IA: hierarchy + persistent
1962
+ context over a flat wall of pills.
1963
+ ============================================================================ */
1964
+ (function(){
1965
+ const DOMAINS=[
1966
+ {id:'ops',icon:'◎',label:'Ops & Fleet',full:'Operations & Fleet — command center, governed run-loop, service health & live system maps',views:['command','ask','operate','demo','fleet','mesh','mission','business']},
1967
+ {id:'brain',icon:'❋',label:'Brain & Memory',full:'Brain & Memory — living organism, knowledge ontology, receipt chain, lineage, pulse & trust space',views:['organism','knowledge','chain','pulse','trustspace','ontology','kbformulas','lineage']},
1968
+ {id:'reason',icon:'⚇',label:'Reasoning & Agents',full:'Reasoning & Agents — model router, agent tools, governed chat, eval arena, replay & forecast',views:['llm','mcp','chat','arena','replay','forecast']},
1969
+ {id:'govern',icon:'⊠',label:'Governance & Assurance',full:'Governance & Assurance — governed decisions, safety gates, policies, readiness, live decisions & reciprocity',views:['govern','decision','lambda','gates','feed','policies','ayni']},
1970
+ {id:'proof',icon:'⎙',label:'Proof & Attestation',full:'Proof & Attestation — signed receipts & the verifiable trust ledger',views:['receipts','ledger3d']},
1971
+ {id:'threat',icon:'⚔',label:'World & Threat Intel',full:'World & Threat Intel — threat library, CVE watch, known-exploited & adversary techniques',views:['threats','cve','kev','attack']},
1972
+ {id:'doctrine',icon:'⟁',label:'Doctrine & Frontier',full:'Doctrine & Frontier — what we claim, governed post-determinism, vertical-pack ecosystem & experimental tier',views:['honest','gpd','verticals','experimental'],ext:[{label:'Wave9/10 Formulas',href:'/proven-formulas',icon:'∿'},{label:'Frontier Showcase',href:'/frontier',icon:'◌'}]}
1973
+ ];
1974
+ const FLAGSHIPS=[
1975
+ {view:'command',label:'Ops Command',hero:true,tip:'Command Center — one pane of glass over the whole governed-AI platform'},
1976
+ {view:'organism',label:'Living Body',tip:'Living Organism — the platform as one breathing 3D organism'},
1977
+ {view:'knowledge',label:'Knowledge Graph',tip:'Knowledge Ontology — axioms → theorems → formulas, loaded live'},
1978
+ {view:'govern',label:'Governance',tip:'Readiness & Compliance — governed decisions & assurance posture'},
1979
+ {view:'chain',label:'Proof Chain',tip:'Receipt Chain — SHA-256 hash-chained proof-of-governance'}
1980
+ ];
1981
+ window.__IA_DOMAINS=DOMAINS;
1982
+ const V=function(){return window.VIEWS||{};};
1983
+ const T=function(id){var v=V()[id];return (v&&v.title)||id;};
1984
+ const SUB=function(id){var v=V()[id];return (v&&v.sub)||'';};
1985
+ const domOf={}; DOMAINS.forEach(function(d){d.views.forEach(function(v){domOf[v]=d;});});
1986
+ // orphan safety net: any VIEWS key not placed in a domain is appended to the
1987
+ // last domain so no view can ever become unreachable if the registry drifts.
1988
+ try{Object.keys(V()).forEach(function(v){if(!domOf[v]){var last=DOMAINS[DOMAINS.length-1];last.views.push(v);domOf[v]=last;}});}catch(e){}
1989
+ function attr(s){return String(s==null?'':s).replace(/"/g,'&quot;');}
1990
+ function navItem(v){
1991
+ var tip=(T(v)+' — '+SUB(v)).slice(0,190);
1992
+ return '<div class="nav-item" data-view="'+v+'" title="'+attr(tip)+'" onclick="go(\''+v+'\')"><span class="ico">▸</span>'+T(v)+'</div>';
1993
+ }
1994
+ function buildRail(){
1995
+ var feat=document.getElementById('featured');
1996
+ if(feat)feat.innerHTML=FLAGSHIPS.map(function(f){
1997
+ return '<div class="flag-card'+(f.hero?' full':'')+'" data-view="'+f.view+'" title="'+attr(f.tip)+'" onclick="go(\''+f.view+'\')"><span class="ico">★</span>'+f.label+'</div>';
1998
+ }).join('');
1999
+ var rail=document.getElementById('rail');
2000
+ if(rail)rail.innerHTML=DOMAINS.map(function(d){
2001
+ var items=d.views.map(navItem).join('');
2002
+ var ext=(d.ext||[]).map(function(e){return '<div class="nav-item" title="opens '+attr(e.href)+' in a new tab" onclick="window.open(\''+e.href+'\',\'_blank\')" style="cursor:pointer"><span class="ico">'+e.icon+'</span>'+e.label+' ↗</div>';}).join('');
2003
+ var n=d.views.length+(d.ext?d.ext.length:0);
2004
+ return '<div class="dom" data-dom="'+d.id+'" title="'+attr(d.full)+'" onclick="toggleDom(\''+d.id+'\')"><span class="ico">'+d.icon+'</span>'+d.label+'<span class="count">'+n+'</span><span class="chev">▸</span></div>'
2005
+ +'<div class="domidx" id="domidx-'+d.id+'">'+items+ext+'</div>';
2006
+ }).join('');
2007
+ }
2008
+ window.toggleDom=function(id){
2009
+ var p=document.getElementById('domidx-'+id);
2010
+ var willOpen=p&&!p.classList.contains('open');
2011
+ document.querySelectorAll('.domidx').forEach(function(x){x.classList.toggle('open',willOpen&&x.id==='domidx-'+id);});
2012
+ document.querySelectorAll('.dom').forEach(function(h){h.classList.toggle('open',willOpen&&h.dataset.dom===id);});
2013
+ };
2014
+ function openDomFor(view){
2015
+ var d=domOf[view];if(!d)return;
2016
+ document.querySelectorAll('.domidx').forEach(function(p){p.classList.toggle('open',p.id==='domidx-'+d.id);});
2017
+ document.querySelectorAll('.dom').forEach(function(h){h.classList.toggle('open',h.dataset.dom===d.id);});
2018
+ }
2019
+ window.syncRail=function(view){
2020
+ document.querySelectorAll('.side .nav-item, .flag-card').forEach(function(n){n.classList.toggle('active',n.dataset.view===view);});
2021
+ openDomFor(view);
2022
+ };
2023
+
2024
+ /* ---- ⌘K command palette (fuzzy over ALL views + external links) ---- */
2025
+ var PAL=[],selIdx=0;
2026
+ function palItems(){
2027
+ var arr=[];
2028
+ DOMAINS.forEach(function(d){
2029
+ d.views.forEach(function(v){arr.push({type:'view',id:v,label:T(v),dom:d.label,icon:'▸',hay:(v+' '+T(v)+' '+d.label+' '+SUB(v)).toLowerCase()});});
2030
+ (d.ext||[]).forEach(function(e){arr.push({type:'ext',href:e.href,label:e.label+' ↗',dom:d.label,icon:e.icon,hay:(e.label+' '+e.href+' '+d.label).toLowerCase()});});
2031
+ });
2032
+ return arr;
2033
+ }
2034
+ function renderPal(q){
2035
+ var list=document.getElementById('pal-list');if(!list)return;
2036
+ var terms=(q||'').trim().toLowerCase().split(/\s+/).filter(Boolean);
2037
+ PAL=palItems().filter(function(it){return terms.every(function(t){return it.hay.indexOf(t)>=0;});});
2038
+ selIdx=0;
2039
+ if(!PAL.length){list.innerHTML='<div class="pal-empty">no matching view</div>';return;}
2040
+ list.innerHTML=PAL.map(function(it,i){return '<div class="pal-item'+(i===0?' sel':'')+'" data-i="'+i+'" onmouseover="palHover('+i+')" onclick="palGo('+i+')"><span class="ico">'+it.icon+'</span>'+attr(it.label)+'<span class="dom-tag">'+attr(it.dom)+'</span></div>';}).join('');
2041
+ }
2042
+ window.palHover=function(i){selIdx=i;document.querySelectorAll('.pal-item').forEach(function(e,j){e.classList.toggle('sel',j===i);});};
2043
+ window.palGo=function(i){var it=PAL[i];if(!it)return;closePalette();if(it.type==='ext')window.open(it.href,'_blank');else go(it.id);};
2044
+ window.openPalette=function(){var ov=document.getElementById('pal-ov');if(!ov)return;ov.classList.add('open');var inp=document.getElementById('pal-input');if(inp){inp.value='';renderPal('');setTimeout(function(){inp.focus();},20);}};
2045
+ window.closePalette=function(){var ov=document.getElementById('pal-ov');if(ov)ov.classList.remove('open');};
2046
+ document.addEventListener('keydown',function(e){
2047
+ if((e.metaKey||e.ctrlKey)&&(e.key==='k'||e.key==='K')){e.preventDefault();openPalette();return;}
2048
+ var ov=document.getElementById('pal-ov');if(!ov||!ov.classList.contains('open'))return;
2049
+ if(e.key==='Escape'){closePalette();}
2050
+ else if(e.key==='ArrowDown'){e.preventDefault();selIdx=Math.min(selIdx+1,PAL.length-1);palHover(selIdx);var s=document.querySelector('.pal-item.sel');if(s)s.scrollIntoView({block:'nearest'});}
2051
+ else if(e.key==='ArrowUp'){e.preventDefault();selIdx=Math.max(selIdx-1,0);palHover(selIdx);var s2=document.querySelector('.pal-item.sel');if(s2)s2.scrollIntoView({block:'nearest'});}
2052
+ else if(e.key==='Enter'){e.preventDefault();palGo(selIdx);}
2053
+ });
2054
+
2055
+ function init(){
2056
+ buildRail();
2057
+ var cur=(location.hash||'#command').slice(1);
2058
+ window.syncRail(V()[cur]?cur:'command');
2059
+ var inp=document.getElementById('pal-input');if(inp)inp.addEventListener('input',function(e){renderPal(e.target.value);});
2060
+ }
2061
+ if(document.readyState!=='loading')init();else document.addEventListener('DOMContentLoaded',init);
2062
+ })();
2063
+ </script>
2064
+
2065
  </body>
2066
  </html>