Dashboard Masticationpedia: differenze tra le versioni
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 | let sessionId = null; // id bozza locale se non c'è progetto | ||
let history = []; | 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 | |||
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