94 lines
6.5 KiB
JavaScript
94 lines
6.5 KiB
JavaScript
/* 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);
|
||
})();
|