v2 - new interface, many new page for fine tuning

This commit is contained in:
pporcheret
2026-10-28 21:45:40 +01:00
parent a6169bcfdb
commit a17c3cb614
89 changed files with 8691 additions and 13 deletions
@@ -0,0 +1,93 @@
/* ALFRED_IDENTITY_GLASS_V1 — dynamic user-facing assistant branding.
Technical keys, service names, tool IDs and logs remain unchanged. */
(() => {
'use strict';
let active='',activeWake='';
const replace=(el,oldName,newName)=>{
if(!el || !el.firstChild || el.firstChild.nodeType!==3)return;
const value=el.firstChild.nodeValue||'';
const next=value.replace(/\bAlfred\b/g,newName);
if(next!==value)el.firstChild.nodeValue=next;
};
function apply(n,wake){
if(typeof n!=='string' || n.trim().length<2 || n.length>30)return;
active=n.trim();
if(typeof wake==='string'&&wake.trim())activeWake=wake.trim();
const letter=Array.from(active)[0]?.toLocaleUpperCase('fr-FR')||'A';
const main=document.getElementById('alfredMainV1');
if(main){
const logo=main.querySelector('.av-logo');
if(logo)logo.textContent=letter;
const title=document.getElementById('avName');
if(title)title.textContent=active;
const info=document.getElementById('avVoiceSubtitle');
if(info&&/Dites\s+[«"]/.test(info.textContent||''))info.textContent=`Dites « ${activeWake||active} » puis votre demande`;
const system=main.querySelector('.av-circle.system')?.parentElement?.querySelector('small');
if(system)system.textContent='Mini-PC '+active;
replace(document.querySelector('#avMoreDialog h2'),'',active);
const moreTitle=document.querySelector('#avMoreDialog h2');if(moreTitle)moreTitle.textContent='Outils '+active;
const comfyDesc=document.querySelector('#avComfyDialog p');if(comfyDesc)comfyDesc.textContent='Décris l’image à générer. '+active+' transmettra ta demande à Hermes.';
const submit=document.getElementById('avComfySubmit');if(submit)submit.textContent='Envoyer à '+active;
const hero=main.querySelector('.av-voice-hero');if(hero)hero.setAttribute('aria-label','Commande vocale '+active);
const oldConfig=main.querySelector('a[href="/config"][aria-label^="Configuration d"]');if(oldConfig)oldConfig.setAttribute('aria-label','Configuration de '+active);
const nav=document.querySelector('#avMoreDialog .av-more-grid');
if(nav && !nav.querySelector('a[href="/identity"]')){
const link=document.createElement('a');link.href='/identity';link.textContent='Identité de '+active;nav.append(link);
}else if(nav){const link=nav.querySelector('a[href="/identity"]');if(link)link.textContent='Identité de '+active;}
const legacyStage=document.getElementById('stage');if(legacyStage)legacyStage.setAttribute('aria-label','Réponse de '+active);
const legacyCamera=document.getElementById('cameraFeed');if(legacyCamera)legacyCamera.alt='Vidéo en direct de la caméra de '+active;
document.title=active+' · Accueil';
}
const brand=document.querySelector('.admin-header .brand');
if(brand){
const b=brand.querySelector('strong'),o=brand.querySelector('.brand-orb');
if(b)b.textContent=active;if(o)o.textContent=letter;
const loginOrb=document.querySelector('.auth-box .brand-orb');if(loginOrb)loginOrb.textContent=letter;
const authIntro=document.querySelector('.auth-box p');if(authIntro)authIntro.textContent=document.body.dataset.page==='surveillance'?('Connecte-toi pour consulter l’état de '+active+'.'):('Connecte-toi pour modifier la configuration de '+active+'.');
const help=document.querySelector('.ag-help');if(help)help.textContent=help.textContent.replace(/redémarrer Alfred/g,'redémarrer '+active);
const restartInfo=document.querySelector('.restart-panel p');if(restartInfo)restartInfo.textContent='Redémarrer '+active+' pour appliquer les paramètres enregistrés. Action protégée par mot de passe administrateur.';
const configLabel=document.getElementById('ALFRED_NAME');if(configLabel)configLabel.placeholder=active;
const hint=document.getElementById('pendingNotice');
if(hint){const strong=hint.querySelector('strong');if(strong)strong.textContent='Redémarre '+active;}
const restartButton=document.getElementById('restartButton');if(restartButton)restartButton.textContent='Redémarrer '+active;
document.title=active+' · '+(document.body.dataset.page==='surveillance'?'Surveillance':'Configuration');
const nav=brand.closest('.admin-header')?.querySelector('nav');
if(nav && !nav.querySelector('a[href="/identity"]')){
const a=document.createElement('a');a.href='/identity';a.textContent='Identité';
const logout=nav.querySelector('button');if(logout)nav.insertBefore(a,logout);else nav.append(a);
}
const rail=document.querySelector('.ag-rail');
if(rail && !rail.querySelector('a[href="/identity"]')){
const a=document.createElement('a');a.href='/identity';a.innerHTML='<span>✎</span>Identité';rail.append(a);
}
}
const legacyAudio=document.querySelector('body > main .subtitle');
if(legacyAudio){legacyAudio.textContent=active+' · Paramètres audio';document.title=active+' — Configuration audio';
const hints=document.querySelectorAll('body > main p.hint');if(hints[0])hints[0].textContent='Désactive les réponses vocales de '+active+'.';if(hints[1])hints[1].textContent='Suspend l’écoute et la détection du mot « '+(activeWake||active)+' ».';}
const logsTitle=document.getElementById('lgName');
if(logsTitle){
logsTitle.textContent=active;
const letterEl=document.getElementById('lgLetter');if(letterEl)letterEl.textContent=letter;
const eyebrow=document.querySelector('.lg-eyebrow');if(eyebrow)eyebrow.textContent='OBSERVABILITÉ · '+active.toLocaleUpperCase('fr-FR');
const nav=document.querySelector('.lg-nav');
if(nav&&!nav.querySelector('a[href="/identity"]')){const a=document.createElement('a');a.href='/identity';a.textContent='Identité';nav.append(a);}
document.title='Journaux · '+active;
}
}
async function refresh(){
try{const r=await fetch('/api/alfred/identity/name',{cache:'no-store'});if(!r.ok)return;const d=await r.json();apply(d.name,d.wake_word);}catch(_){}
}
const subtitle=document.getElementById('avVoiceSubtitle');
if(subtitle){
const observer=new MutationObserver(()=>{
if(active&&/Dites\s+[«"]/.test(subtitle.textContent||'')){
const desired=`Dites « ${activeWake||active} » puis votre demande`;
if(subtitle.textContent!==desired)subtitle.textContent=desired;
}
});
observer.observe(subtitle,{childList:true,characterData:true,subtree:true});
}
refresh();window.addEventListener('focus',refresh);
document.addEventListener('visibilitychange',()=>{if(!document.hidden)refresh();});
setInterval(()=>{if(!document.hidden)refresh();},10000);
})();