Refactor: Renomeacao e modernizacao completa para Pedagog / PedagogIA

This commit is contained in:
2026-08-31 10:34:33 +00:00
parent 00341ebf64
commit f3350b0969
16 changed files with 225 additions and 176 deletions
+56 -56
View File
@@ -216,16 +216,16 @@ const initApp = () => {
const searchClearAll = document.getElementById('searchClearAll');
const sidebarTags = document.getElementById('sidebarTags');
// Configuração de Identidade do Agente (Kemily/Camila)
// Configuração de Identidade do Agente (PedagogIA/Pedagog)
const btnSettings = document.getElementById('btnSettings');
const settingsModal = document.getElementById('settingsModal');
const closeSettingsModal = document.getElementById('closeSettingsModal');
const btnSaveSettings = document.getElementById('btnSaveSettings');
const settingAgentName = document.getElementById('settingAgentName');
const previewKemilyAvatar = document.getElementById('previewKemilyAvatar');
const uploadKemilyAvatar = document.getElementById('uploadKemilyAvatar');
const previewCamilaAvatar = document.getElementById('previewCamilaAvatar');
const uploadCamilaAvatar = document.getElementById('uploadCamilaAvatar');
const previewIaAvatar = document.getElementById('previewIaAvatar');
const uploadIaAvatar = document.getElementById('uploadIaAvatar');
const previewUserAvatar = document.getElementById('previewUserAvatar');
const uploadUserAvatar = document.getElementById('uploadUserAvatar');
const welcomeTitle = document.getElementById('welcomeTitle');
const welcomeAvatarImg = document.getElementById('welcomeAvatarImg');
const sidebarAvatarImg = document.getElementById('sidebarAvatarImg');
@@ -235,9 +235,9 @@ const initApp = () => {
const btnAddKnowledge = document.getElementById('btnAddKnowledge');
window.agentConfig = {
agentName: "Kemily",
kemilyAvatarUrl: "assets/kemily.png",
camilaAvatarUrl: "assets/camila_prof.png",
agentName: "PedagogIA",
iaAvatarUrl: "assets/pedagog_ia.png",
userAvatarUrl: "assets/pedagog_user.png",
temperaturePreset: 'equilibrado'
};
@@ -264,22 +264,22 @@ const initApp = () => {
const updateAgentIdentityUI = () => {
if (welcomeTitle) {
welcomeTitle.innerText = `Olá! Sou sua assistente virtual e me chamo ${window.agentConfig.agentName}. Como posso ajudar?`;
welcomeTitle.innerText = `Olá! Sou sua assistente virtual e me chamo ${window.agentConfig.agentName || 'PedagogIA'}. Como posso ajudar?`;
}
if (welcomeAvatarImg) {
welcomeAvatarImg.src = window.agentConfig.kemilyAvatarUrl;
welcomeAvatarImg.src = window.agentConfig.iaAvatarUrl || window.agentConfig.kemilyAvatarUrl || 'assets/pedagog_ia.png';
}
if (sidebarAvatarImg) {
sidebarAvatarImg.src = window.agentConfig.camilaAvatarUrl;
sidebarAvatarImg.src = window.agentConfig.userAvatarUrl || window.agentConfig.camilaAvatarUrl || 'assets/pedagog_user.png';
}
if (settingAgentName) {
settingAgentName.value = window.agentConfig.agentName;
settingAgentName.value = window.agentConfig.agentName || 'PedagogIA';
}
if (previewKemilyAvatar) {
previewKemilyAvatar.src = window.agentConfig.kemilyAvatarUrl;
if (previewIaAvatar) {
previewIaAvatar.src = window.agentConfig.iaAvatarUrl || window.agentConfig.kemilyAvatarUrl || 'assets/pedagog_ia.png';
}
if (previewCamilaAvatar) {
previewCamilaAvatar.src = window.agentConfig.camilaAvatarUrl;
if (previewUserAvatar) {
previewUserAvatar.src = window.agentConfig.userAvatarUrl || window.agentConfig.camilaAvatarUrl || 'assets/pedagog_user.png';
}
// Atualiza seleção de temperatura
renderTemperatureOptions();
@@ -472,17 +472,17 @@ const initApp = () => {
};
// Variáveis temporárias para avatares (em base64 ou URLs novas)
let newKemilyAvatarData = null;
let newCamilaAvatarData = null;
let newIaAvatarData = null;
let newUserAvatarData = null;
// Eventos do Modal
if (btnSettings) {
btnSettings.addEventListener('click', () => {
newKemilyAvatarData = null;
newCamilaAvatarData = null;
if (settingAgentName) settingAgentName.value = window.agentConfig.agentName;
if (previewKemilyAvatar) previewKemilyAvatar.src = window.agentConfig.kemilyAvatarUrl;
if (previewCamilaAvatar) previewCamilaAvatar.src = window.agentConfig.camilaAvatarUrl;
newIaAvatarData = null;
newUserAvatarData = null;
if (settingAgentName) settingAgentName.value = window.agentConfig.agentName || 'PedagogIA';
if (previewIaAvatar) previewIaAvatar.src = window.agentConfig.iaAvatarUrl || window.agentConfig.kemilyAvatarUrl || 'assets/pedagog_ia.png';
if (previewUserAvatar) previewUserAvatar.src = window.agentConfig.userAvatarUrl || window.agentConfig.camilaAvatarUrl || 'assets/pedagog_user.png';
renderTemperatureOptions();
loadConhecimento();
settingsModal.style.display = 'flex';
@@ -529,18 +529,18 @@ const initApp = () => {
}
};
if (uploadKemilyAvatar) {
uploadKemilyAvatar.addEventListener('change', () => {
handleAvatarFileSelect(uploadKemilyAvatar, previewKemilyAvatar, (base64) => {
newKemilyAvatarData = base64;
if (uploadIaAvatar) {
uploadIaAvatar.addEventListener('change', () => {
handleAvatarFileSelect(uploadIaAvatar, previewIaAvatar, (base64) => {
newIaAvatarData = base64;
});
});
}
if (uploadCamilaAvatar) {
uploadCamilaAvatar.addEventListener('change', () => {
handleAvatarFileSelect(uploadCamilaAvatar, previewCamilaAvatar, (base64) => {
newCamilaAvatarData = base64;
if (uploadUserAvatar) {
uploadUserAvatar.addEventListener('change', () => {
handleAvatarFileSelect(uploadUserAvatar, previewUserAvatar, (base64) => {
newUserAvatarData = base64;
});
});
}
@@ -552,31 +552,31 @@ const initApp = () => {
btnSaveSettings.innerText = 'Salvando...';
try {
let kemilyUrl = window.agentConfig.kemilyAvatarUrl;
let camilaUrl = window.agentConfig.camilaAvatarUrl;
let iaUrl = window.agentConfig.iaAvatarUrl || window.agentConfig.kemilyAvatarUrl || 'assets/pedagog_ia.png';
let userUrl = window.agentConfig.userAvatarUrl || window.agentConfig.camilaAvatarUrl || 'assets/pedagog_user.png';
// Se houver novas imagens, faz upload
if (newKemilyAvatarData) {
if (newIaAvatarData) {
const res = await fetch('/api/upload-avatar', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ avatarType: 'kemily', base64Data: newKemilyAvatarData })
body: JSON.stringify({ avatarType: 'ia', base64Data: newIaAvatarData })
});
if (res.ok) {
const data = await res.json();
kemilyUrl = data.url;
iaUrl = data.url;
}
}
if (newCamilaAvatarData) {
if (newUserAvatarData) {
const res = await fetch('/api/upload-avatar', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ avatarType: 'camila', base64Data: newCamilaAvatarData })
body: JSON.stringify({ avatarType: 'user', base64Data: newUserAvatarData })
});
if (res.ok) {
const data = await res.json();
camilaUrl = data.url;
userUrl = data.url;
}
}
@@ -587,8 +587,8 @@ const initApp = () => {
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
agentName: settingAgentName.value,
kemilyAvatarUrl: kemilyUrl,
camilaAvatarUrl: camilaUrl,
iaAvatarUrl: iaUrl,
userAvatarUrl: userUrl,
temperaturePreset: selectedTempPreset
})
});
@@ -615,10 +615,10 @@ const initApp = () => {
loadAgentConfig();
// Variáveis de Estado
let chats = JSON.parse(localStorage.getItem('camila_chats')) || [];
let chats = JSON.parse(localStorage.getItem('pedagog_chats') || localStorage.getItem('camila_chats')) || [];
// Migração: adicionar campos tags e pinned a chats antigos
chats = chats.map(c => ({ ...c, tags: c.tags || [], pinned: c.pinned || false }));
let currentChatId = localStorage.getItem('camila_current_chat_id') || null;
let currentChatId = localStorage.getItem('pedagog_current_chat_id') || localStorage.getItem('camila_current_chat_id') || null;
let isGenerating = false;
let searchQuery = '';
let activeTag = 'all';
@@ -638,7 +638,7 @@ const initApp = () => {
const applyTheme = (theme) => {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('camila_theme', theme);
localStorage.setItem('pedagog_theme', theme);
if (theme === 'light') {
iconThemeSun.style.display = 'none';
iconThemeMoon.style.display = 'block';
@@ -649,7 +649,7 @@ const initApp = () => {
};
// Init theme from localStorage or system preference
const savedTheme = localStorage.getItem('camila_theme');
const savedTheme = localStorage.getItem('pedagog_theme') || localStorage.getItem('camila_theme');
if (savedTheme) {
applyTheme(savedTheme);
} else {
@@ -1283,11 +1283,11 @@ const initApp = () => {
// ==========================================================================
const saveChats = () => {
localStorage.setItem('camila_chats', JSON.stringify(chats));
localStorage.setItem('pedagog_chats', JSON.stringify(chats));
if (currentChatId) {
localStorage.setItem('camila_current_chat_id', currentChatId);
localStorage.setItem('pedagog_current_chat_id', currentChatId);
} else {
localStorage.removeItem('camila_current_chat_id');
localStorage.removeItem('pedagog_current_chat_id');
}
};
@@ -1563,7 +1563,7 @@ const initApp = () => {
if (isGenerating) return;
currentChatId = null;
localStorage.removeItem('camila_current_chat_id');
localStorage.removeItem('pedagog_current_chat_id');
welcomeContainer.style.display = 'flex';
conversationList.innerHTML = '';
@@ -1599,8 +1599,8 @@ const initApp = () => {
row.className = `message-row ${role}`;
const avatarHtml = isUser
? `<div class="avatar user-avatar user-avatar-img-wrapper"><img src="${window.agentConfig?.camilaAvatarUrl || 'assets/camila_prof.png'}" alt="Camila" class="user-avatar-img"></div>`
: `<div class="avatar bot-avatar bot-avatar-img-wrapper"><img src="${window.agentConfig?.kemilyAvatarUrl || 'assets/kemily.png'}" alt="${window.agentConfig?.agentName || 'Kemily'}" class="bot-avatar-img"></div>`;
? `<div class="avatar user-avatar user-avatar-img-wrapper"><img src="${window.agentConfig?.userAvatarUrl || window.agentConfig?.camilaAvatarUrl || 'assets/pedagog_user.png'}" alt="Usuário" class="user-avatar-img"></div>`
: `<div class="avatar bot-avatar bot-avatar-img-wrapper"><img src="${window.agentConfig?.iaAvatarUrl || window.agentConfig?.kemilyAvatarUrl || 'assets/pedagog_ia.png'}" alt="${window.agentConfig?.agentName || 'PedagogIA'}" class="bot-avatar-img"></div>`;
let contentHtml = '';
if (isUser) {
@@ -1991,7 +1991,7 @@ const initApp = () => {
botRow.innerHTML = `
<div class="message-icon">
<div class="avatar bot-avatar bot-avatar-img-wrapper"><img src="${window.agentConfig?.kemilyAvatarUrl || 'assets/kemily.png'}" alt="${window.agentConfig?.agentName || 'Kemily'}" class="bot-avatar-img"></div>
<div class="avatar bot-avatar bot-avatar-img-wrapper"><img src="${window.agentConfig?.iaAvatarUrl || window.agentConfig?.kemilyAvatarUrl || 'assets/pedagog_ia.png'}" alt="${window.agentConfig?.agentName || 'PedagogIA'}" class="bot-avatar-img"></div>
</div>
<div class="message-content-wrapper">
<div class="message-content">
@@ -2713,7 +2713,7 @@ const initApp = () => {
showRecordState('processing');
try {
const turmaData = localStorage.getItem('camila_turma') || '[]';
const turmaData = localStorage.getItem('pedagog_turma') || localStorage.getItem('camila_turma') || '[]';
const res = await fetch('/api/observacao/analisar', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
@@ -2923,7 +2923,7 @@ const initApp = () => {
let especialKidsNames = [];
if (isSpecialObsMode) {
const turma = JSON.parse(localStorage.getItem('camila_turma') || '[]');
const turma = JSON.parse(localStorage.getItem('pedagog_turma') || localStorage.getItem('camila_turma') || '[]');
especialKidsNames = turma.filter(c => c.especial).map(c => (c.nome || '').toLowerCase().trim()).filter(Boolean);
if (especialKidsNames.length === 0) {
obsList.innerHTML = '<div class="obs-empty">Nenhuma criança com "Educação Especial" cadastrada na Minha Turma.</div>';
@@ -3051,7 +3051,7 @@ const initApp = () => {
try {
const res = await fetch('/api/alunos');
currentAlunos = await res.json();
localStorage.setItem('camila_turma', JSON.stringify(currentAlunos));
localStorage.setItem('pedagog_turma', JSON.stringify(currentAlunos));
return currentAlunos;
} catch(e) { console.error(e); return []; }
};
@@ -4981,7 +4981,7 @@ Se algum dado não for mencionado, deixe a string vazia ou false para boolean.`
}
// Renderizar quadrinhos na tela (todos, incluindo os anteriores caso tenha sido extensão)
comicsResultTitle.textContent = scriptData.title || comicsResultTitle.textContent || 'Fábrica de Quadrinhos Camila';
comicsResultTitle.textContent = scriptData.title || comicsResultTitle.textContent || 'Fábrica de Quadrinhos Pedagog';
comicsGridContainer.innerHTML = '';
generatedPanelsData.forEach((panel, index) => {
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

+13 -13
View File
@@ -146,10 +146,10 @@
<div class="sidebar-footer">
<div class="user-profile">
<div class="avatar user-avatar sidebar-avatar-wrapper">
<img src="assets/camila_prof.png" alt="Camila Reifonas" class="sidebar-avatar-img" id="sidebarAvatarImg">
<img src="assets/pedagog_user.png" alt="Pedagog" class="sidebar-avatar-img" id="sidebarAvatarImg">
</div>
<div class="user-info">
<span class="user-name">Camila Reifonas</span>
<span class="user-name">Pedagog</span>
<span class="user-status">Online</span>
</div>
<button class="btn-settings" id="btnSettings" title="Configurações do Agente" style="background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 8px; border-radius: 8px; display: flex; align-items: center; justify-content: center; transition: color var(--transition-fast), background-color var(--transition-fast); margin-right: 4px;">
@@ -226,10 +226,10 @@
<div class="welcome-container" id="welcomeContainer">
<div class="welcome-logo">
<div class="logo-outer welcome-avatar-wrapper">
<img src="assets/kemily.png" alt="Kemily AI" class="welcome-avatar-img" id="welcomeAvatarImg">
<img src="assets/pedagog_ia.png" alt="PedagogIA" class="welcome-avatar-img" id="welcomeAvatarImg">
</div>
</div>
<h2 id="welcomeTitle">Olá! Sou sua assistente virtual e me chamo Kemily. Como posso ajudar?</h2>
<h2 id="welcomeTitle">Olá! Sou sua assistente virtual e me chamo PedagogIA. Como posso ajudar?</h2>
</div>
@@ -422,25 +422,25 @@
<div id="tabIdentidade" class="settings-tab-content active">
<div class="settings-group">
<label for="settingAgentName">Nome da Assistente</label>
<input type="text" id="settingAgentName" placeholder="Ex: Kemily">
<small style="color: var(--text-muted); margin-top: 4px; display: block;">Nome que aparece para a Camila na conversa</small>
<input type="text" id="settingAgentName" placeholder="Ex: PedagogIA">
<small style="color: var(--text-muted); margin-top: 4px; display: block;">Nome que aparece para a usuária na conversa</small>
</div>
<div class="settings-group">
<label>Avatar da Assistente</label>
<div class="avatar-preview-container">
<img id="previewKemilyAvatar" src="assets/kemily.png" alt="Assistante Preview" class="preview-avatar-img">
<input type="file" id="uploadKemilyAvatar" accept="image/*" style="display: none;">
<button type="button" class="btn-change-avatar" onclick="document.getElementById('uploadKemilyAvatar').click()">Escolher Imagem</button>
<img id="previewIaAvatar" src="assets/pedagog_ia.png" alt="Assistente Preview" class="preview-avatar-img">
<input type="file" id="uploadIaAvatar" accept="image/*" style="display: none;">
<button type="button" class="btn-change-avatar" onclick="document.getElementById('uploadIaAvatar').click()">Escolher Imagem</button>
</div>
</div>
<div class="settings-group">
<label>Avatar da Camila (Usuária)</label>
<label>Avatar do Usuário</label>
<div class="avatar-preview-container">
<img id="previewCamilaAvatar" src="assets/camila_prof.png" alt="Camila Preview" class="preview-avatar-img">
<input type="file" id="uploadCamilaAvatar" accept="image/*" style="display: none;">
<button type="button" class="btn-change-avatar" onclick="document.getElementById('uploadCamilaAvatar').click()">Escolher Imagem</button>
<img id="previewUserAvatar" src="assets/pedagog_user.png" alt="Usuário Preview" class="preview-avatar-img">
<input type="file" id="uploadUserAvatar" accept="image/*" style="display: none;">
<button type="button" class="btn-change-avatar" onclick="document.getElementById('uploadUserAvatar').click()">Escolher Imagem</button>
</div>
</div>
</div>
+3 -3
View File
@@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Camila - Entrar</title>
<title>Pedagog - Entrar</title>
<!-- Google Fonts Outfit & Inter -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@ -21,10 +21,10 @@
<div class="login-card">
<div class="login-header">
<div class="avatar-profile-wrapper">
<img src="assets/camila_prof.png" alt="Camila Reifonas" class="avatar-profile-img">
<img src="assets/pedagog_user.png" alt="Pedagog" class="avatar-profile-img">
<div class="avatar-profile-pulse"></div>
</div>
<h1>CamiIA</h1>
<h1>Pedagog</h1>
<p>Insira a senha de acesso para entrar no workspace</p>
</div>
+1 -1
View File
@@ -2361,7 +2361,7 @@ code {
color: #fdba74;
}
/* Modo Texto/História: Estilos e Cores (Verde Kemily) */
/* Modo Texto/História: Estilos e Cores (Verde PedagogIA) */
.btn-prompt-mode.mode-text {
border-color: rgba(16, 163, 127, 0.4);
color: #34d399;
+7 -5
View File
@@ -1,12 +1,14 @@
const CACHE_NAME = 'camila-ai-v10';
const CACHE_NAME = 'pedagog-ai-v11';
const urlsToCache = [
'/',
'/index.html',
'/style.css',
'/app.js',
'/manifest.json',
'/icon-192.png',
'/icon-512.png'
'/assets/icon-192.png',
'/assets/icon-512.png',
'/assets/pedagog_user.png',
'/assets/pedagog_ia.png'
];
// Instalação - abre cache e armazena os arquivos iniciais
@@ -14,7 +16,7 @@ self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
console.log('Camila AI SW: Armazenando cache inicial');
console.log('Pedagog AI SW: Armazenando cache inicial');
return cache.addAll(urlsToCache);
})
.then(() => self.skipWaiting())
@@ -28,7 +30,7 @@ self.addEventListener('activate', (event) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
console.log('Camila AI SW: Removendo cache antigo:', cacheName);
console.log('Pedagog AI SW: Removendo cache antigo:', cacheName);
return caches.delete(cacheName);
}
})