/* 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='✎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); })();