Produtos nenhum site
SESSÃO0 tok
IN0
OUT0
CUSTO$0.0000
TOTAL$0.0000
+ cost.toFixed(5) + ''; planDiv.querySelector('.bubble').appendChild(tokEl); } } catch(e) { typing.remove(); addMsg('ai', `Erro: ${e.message}. Verifique a API Key e tente novamente.`); } document.getElementById('sendBtn').disabled = false; inp.focus(); } function addMsg(role, content, exec) { const key = (S.active?.id||'_') + '_' + S.tab; if (!S.msgs[key]) S.msgs[key] = []; S.msgs[key].push({ role, content, exec }); appendMsg(role, content, exec, true); if (role === 'user') { S.history.unshift(content.substring(0,50)); if (S.history.length>20) S.history.pop(); } save(); } // ═══════════════════════════════════════════════════════ // USAGE TRACKING // ═══════════════════════════════════════════════════════ function getAcc() { try { return JSON.parse(localStorage.getItem('wpaiv2_usage')||'{"total":0,"in":0,"out":0,"calls":0,"log":[]}'); } catch(e) { return {total:0,in:0,out:0,calls:0,log:[]}; } } function saveAcc(a) { localStorage.setItem('wpaiv2_usage', JSON.stringify(a)); } function trackUsage(inT, outT, cost, cmd) { session.in += inT; session.out += outT; session.cost += cost; session.calls++; const acc = getAcc(); acc.in += inT; acc.out += outT; acc.total += cost; acc.calls++; acc.log.unshift({ ts:new Date().toLocaleString('pt-BR'), site:S.active?.name||'—', tab:S.tab, cmd:cmd.substring(0,50), in:inT, out:outT, cost:cost.toFixed(6) }); if (acc.log.length>100) acc.log = acc.log.slice(0,100); saveAcc(acc); updateStatusBar(); } function updateStatusBar() { const acc = getAcc(); document.getElementById('sTok').textContent = (session.in+session.out).toLocaleString()+' tok'; document.getElementById('sIn').textContent = session.in.toLocaleString(); document.getElementById('sOut').textContent = session.out.toLocaleString(); document.getElementById('sCost').textContent = '$'+session.cost.toFixed(4); document.getElementById('sTotal').textContent = '$'+acc.total.toFixed(4); } function resetSession() { session={in:0,out:0,cost:0,calls:0}; updateStatusBar(); } function openUsage() { const acc = getAcc(); const rows = acc.log.slice(0,20).map(l=>` ${l.ts} ${l.site} ${l.tab} ${l.cmd} ${Number(l.in).toLocaleString()} ${Number(l.out).toLocaleString()} $${l.cost} `).join(''); const m = document.createElement('div'); m.className='overlay open'; m.id='usageModal'; m.innerHTML=``; document.body.appendChild(m); m.addEventListener('click',e=>{ if(e.target===m) m.remove(); }); } // ═══════════════════════════════════════════════════════ // SITES / TABS / UTILS // ═══════════════════════════════════════════════════════ function selectSite(id) { S.active = S.sites.find(s=>s.id===id); document.getElementById('topSite').textContent = S.active?.name || 'nenhum site'; renderSites(); renderCtx(); renderMsgs(); } function selectTab(id) { S.tab = id; const m = MODULES.find(x=>x.id===id); document.getElementById('topTitle').textContent = m?.label || id; renderTabs(); renderQuick(); renderCtx(); renderMsgs(); } function openModal(id) { if (id==='settings') { document.getElementById('fApiKey').value = S.apiKey; document.getElementById('fModel').value = S.model; } document.getElementById(id).classList.add('open'); } function closeModal(id) { document.getElementById(id).classList.remove('open'); } function saveSite() { const name=document.getElementById('fName').value.trim(); const url=document.getElementById('fUrl').value.trim().replace(/\/$/,''); const key=document.getElementById('fKey').value.trim(); const sec=document.getElementById('fSec').value.trim(); const wpUser=document.getElementById('fWpUser').value.trim(); const wpPass=document.getElementById('fWpPass').value.trim(); if (!name||!url||!key||!sec) { alert('Nome, URL, Key e Secret são obrigatórios'); return; } const site = { id:Date.now().toString(), name, url, key, secret:sec, wpUser, wpPass }; S.sites.push(site); save(); renderSites(); selectSite(site.id); closeModal('addSite'); addMsg('ai', `Site **${name}** conectado! Pode começar a comandar.`); } function saveSettings() { S.apiKey = document.getElementById('fApiKey').value.trim(); S.model = document.getElementById('fModel').value; save(); closeModal('settings'); addMsg('ai', '✓ Configurações salvas.'); } function clearChat() { const key=(S.active?.id||'_')+'_'+S.tab; S.msgs[key]=[]; save(); renderMsgs(); } function setInput(t) { const i=document.getElementById('msgIn'); i.value=t; autoResize(i); i.focus(); } function autoResize(el) { el.style.height='auto'; el.style.height=Math.min(el.scrollHeight,100)+'px'; } function setupInput() { const i=document.getElementById('msgIn'); i.addEventListener('input',()=>autoResize(i)); i.addEventListener('keydown',e=>{ if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();send();} }); } document.querySelectorAll('.overlay').forEach(o=>o.addEventListener('click',e=>{ if(e.target===o) o.classList.remove('open'); })); // ═══════════════════════════════════════════════════════ // INIT // ═══════════════════════════════════════════════════════ function init() { load(); renderSites(); renderTabs(); renderQuick(); renderCtx(); renderMsgs(); updateStatusBar(); setupInput(); if (S.sites.length) selectSite(S.sites[0].id); selectTab(S.tab); } init();