/* ALFRED_HERMES_NEW_SESSION_V1 — reset sûr de la seule session conversationnelle Hermes. */ (() => { 'use strict'; function setup() { const grid = document.querySelector('#avMoreDialog .av-more-grid'); if (!grid || document.getElementById('avHermesNewSession')) return false; const button = document.createElement('button'); button.type = 'button'; button.id = 'avHermesNewSession'; button.className = 'av-hermes-new-session'; button.innerHTML = 'Nouvelle session Hermes'; grid.appendChild(button); const dialog = document.createElement('dialog'); dialog.id = 'avHermesSessionDialog'; dialog.className = 'av-hermes-session-dialog'; dialog.setAttribute('aria-labelledby', 'avHermesSessionTitle'); dialog.innerHTML = `

Nouvelle session Hermes

Repartir sans le contexte de l’ancienne conversation. La prochaine demande utilisera une nouvelle session avec les outils Hermes disponibles. La session actuelle sera sauvegardée.

Les outils, les Skills et les réglages de Dona restent inchangés. Aucune tâche Hermes n'est annulée.

`; document.body.appendChild(dialog); const msg = dialog.querySelector('#avHermesSessionMessage'); const confirm = dialog.querySelector('#avHermesSessionConfirm'); const cancel = dialog.querySelector('#avHermesSessionCancel'); let csrf = ''; let busy = false; function setMessage(text, error = false) { msg.textContent = text; msg.classList.toggle('is-error', error); } button.addEventListener('click', async () => { document.getElementById('avMoreDialog')?.close(); setMessage(''); confirm.hidden = false; cancel.textContent = 'Annuler'; dialog.showModal(); confirm.disabled = true; try { const response = await fetch('/api/control/auth', {credentials:'same-origin',cache:'no-store'}); if (!response.ok) throw new Error('Vérification administrateur impossible.'); const auth = await response.json(); if (!auth.authenticated || !auth.csrf) { setMessage('Connecte-toi d’abord en administrateur dans Configuration (/config), puis reviens ici.', true); confirm.hidden = true; cancel.textContent = 'Fermer'; const link = document.createElement('a'); link.href = '/config'; link.textContent = 'Ouvrir Configuration'; link.className = 'av-hermes-session-login'; const old = dialog.querySelector('.av-hermes-session-login'); old?.remove(); msg.after(link); } else { dialog.querySelector('.av-hermes-session-login')?.remove(); csrf = auth.csrf; confirm.disabled = false; } } catch (e) { setMessage(e.message, true); } }); cancel.addEventListener('click', () => { if (!busy) dialog.close(); }); confirm.addEventListener('click', async () => { if (busy || !csrf) return; busy = true; confirm.disabled = true; cancel.disabled = true; setMessage('Création de la nouvelle session…'); try { const response = await fetch('/api/control/hermes/new-session', { method:'POST', credentials:'same-origin', cache:'no-store', headers: {'X-Alfred-CSRF':csrf,'Content-Type':'application/json'}, body:'{}' }); const data = await response.json(); if (!response.ok || !data.ok) throw new Error(data.error || 'Erreur HTTP '+response.status); setMessage(data.message || 'Nouvelle session prête.'); confirm.hidden = true; cancel.textContent = 'Fermer'; } catch (e) { setMessage(e.message, true); } finally { busy = false; cancel.disabled = false; confirm.disabled = false; } }); return true; } function init() { if (setup()) return; const observer = new MutationObserver(() => { if (setup()) observer.disconnect(); }); observer.observe(document.body,{childList:true,subtree:true}); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init, {once:true}); else init(); })();