Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 45: Riga 45:
       <button id="mpai-new-chat" class="mpai-btn ghost">Nuova chat</button>
       <button id="mpai-new-chat" class="mpai-btn ghost">Nuova chat</button>
       <button id="mpai-clear" class="mpai-btn danger">Pulisci conversazione</button>
       <button id="mpai-clear" class="mpai-btn danger">Pulisci conversazione</button>
      <button id="mpai-save-as-project" class="mpai-btn">💾 Salva come progetto</button>
     </div>
     </div>
   </div>
   </div>
Riga 165: Riga 167:


<!-- ============ JS (tutto qui) ============ -->
<!-- ============ JS (tutto qui) ============ -->
<script>
<script>
/* -------- Fallback utili (non rompersi se mancano) -------- */
/* -------- Fallback utili (non rompersi se mancano) -------- */
Riga 194: Riga 197:
(function(){
(function(){
   // Stato
   // Stato
   let currentProject = null;
   let currentProject = null;     // progetto “reale” (server) o null
   let attachments = []; // [{file, name}]
   let sessionId = null;          // id bozza locale se non c'è progetto
   let history = [];     // [{role:'user'|'assistant'|'error', content:string}]
  let sessionMeta = null;       // {title, updated}
   let history = [];
  let attachments = [];
 


   // Shortcuts
   // Shortcuts
Riga 236: Riga 242:
     });
     });
   }
   }
// ======== Sessioni locali (bozze senza progetto) ========
function makeAutoTitle(s){
  if (!s) return 'Nuova conversazione';
  s = (s||'').replace(/\s+/g,' ').trim();
  const firstSentence = (s.split(/[.?!]/)[0] || s).trim();
  const short = firstSentence.split(' ').slice(0,8).join(' ');
  return (short.length > 60 ? short.slice(0,57)+'…' : short) || 'Nuova conversazione';
}
function ensureSession(){
  if (!sessionId){
    sessionId = 'sess-' + Date.now();
    sessionMeta = { title: 'Nuova conversazione', updated: Date.now() };
    localStorage.setItem('mpai.session.meta.'+sessionId, JSON.stringify(sessionMeta));
  }
}
function saveSession(){
  if (!sessionId) return;
  const key = 'mpai.session.hist.' + sessionId;
  localStorage.setItem(key, JSON.stringify(history.slice(-200)));
  sessionMeta.updated = Date.now();
  localStorage.setItem('mpai.session.meta.'+sessionId, JSON.stringify(sessionMeta));
}
function loadSession(id){
  sessionId = id;
  const key = 'mpai.session.hist.' + id;
  const raw = localStorage.getItem(key);
  history = raw ? JSON.parse(raw) : [];
  const metaRaw = localStorage.getItem('mpai.session.meta.'+id);
  sessionMeta = metaRaw ? JSON.parse(metaRaw) : {title:'Nuova conversazione', updated:Date.now()};
  chatEl.innerHTML = '';
  if (!history.length){
    appendMsg('assistant', 'Pronto! Dimmi cosa vuoi fare. Puoi allegare file sanificati.');
  } else {
    history.forEach(m => appendMsg(m.role, m.content));
  }
}
function resetToNewChat(){
  history = [];
  attachments = [];
  renderFiles();
  chatEl.innerHTML = '';
  if (currentProject){
    appendMsg('assistant','Nuova chat per "'+currentProject+'".');
    saveLocal();
  } else {
    sessionId = null; sessionMeta = null;
    ensureSession();
    appendMsg('assistant','Nuova conversazione.');
    saveSession();
  }
}


   // Progetti
   // Progetti
Riga 361: Riga 430:
   });
   });


  // Boot
// Boot
   loadProjects();
loadProjects();
 
// Se non c'è ancora un progetto attivo → crea una sessione locale "bozza"
if (!currentProject){
  ensureSession();
   loadSession(sessionId);
}
})();
})();
</script>
</script>
<!-- ============== /MASTICATIONPEDIA AI ============== -->
<!-- ============== /MASTICATIONPEDIA AI ============== -->



Versione delle 15:06, 27 set 2025

🔧 Dashboard Operativa – Masticationpedia

Centro di comando per progetti, API, file e backup

🧾 Apri Log Dashboard