xertica-ui 1.3.1 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/AssistenteXertica.tsx +58 -91
- package/components/assistant-utils.ts +101 -0
- package/components/ui/xertica-assistant.tsx +53 -2
- package/contexts/AssistenteContext.tsx +6 -0
- package/dist/components/AssistenteXertica.d.ts +10 -1
- package/dist/components/assistant-utils.d.ts +4 -0
- package/dist/components/ui/xertica-assistant.d.ts +22 -3
- package/dist/contexts/AssistenteContext.d.ts +5 -0
- package/dist/index.es.js +127 -73
- package/dist/index.umd.js +127 -73
- package/package.json +1 -1
|
@@ -120,88 +120,40 @@ interface AssistenteXerticaProps {
|
|
|
120
120
|
isFullPage?: boolean;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
import type { Message, Conversa, SearchResult, SearchSource, SearchCommand, Sugestao } from '../contexts/AssistenteContext';
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
123
|
+
import type { Message, Conversa, SearchResult, SearchSource, SearchCommand, Sugestao, MockResponse } from '../contexts/AssistenteContext';
|
|
124
|
+
import { sugestoesPadrao, sugestoesRicas, gerarResposta } from './assistant-utils';
|
|
125
|
+
|
|
126
|
+
// ... (existing code)
|
|
127
|
+
|
|
128
|
+
interface AssistenteXerticaProps {
|
|
129
|
+
isExpanded: boolean;
|
|
130
|
+
onToggle: () => void;
|
|
131
|
+
onToggleWithTab?: (tab: 'chat' | 'historico' | 'favoritos') => void;
|
|
132
|
+
isFullPage?: boolean;
|
|
133
|
+
demoMode?: boolean;
|
|
134
|
+
customResponses?: MockResponse[];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ... (existing code)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
139
141
|
|
|
140
142
|
// Respostas simuladas da IA
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (mensagemLower.includes('próximo projeto') || mensagemLower.includes('próxima tarefa')) {
|
|
158
|
-
return 'Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (mensagemLower.includes('desempenho') || mensagemLower.includes('performance') || mensagemLower.includes('melhor')) {
|
|
162
|
-
return 'Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parab��ns!\n\nQuer ver métricas detalhadas?';
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (mensagemLower.includes('olá') || mensagemLower.includes('oi') || mensagemLower.includes('bom dia') || mensagemLower.includes('boa tarde') || mensagemLower.includes('boa noite')) {
|
|
166
|
-
return 'Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.';
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (mensagemLower.includes('obrigado') || mensagemLower.includes('obrigada')) {
|
|
170
|
-
return 'Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!';
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Respostas para ações especiais
|
|
174
|
-
if (mensagemLower.includes('criar documento')) {
|
|
175
|
-
const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, '').trim();
|
|
176
|
-
return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (mensagemLower.includes('gerar podcast')) {
|
|
180
|
-
const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, '').trim();
|
|
181
|
-
return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (mensagemLower.includes('pesquisar')) {
|
|
185
|
-
const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, '').trim();
|
|
186
|
-
return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (mensagemLower.includes('arquivo') || mensagemLower.includes('documento')) {
|
|
190
|
-
return 'Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!';
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Resposta genérica inteligente
|
|
194
|
-
const respostasGenericas = [
|
|
195
|
-
'Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?',
|
|
196
|
-
'Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?',
|
|
197
|
-
'Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?',
|
|
198
|
-
'Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?'
|
|
199
|
-
];
|
|
200
|
-
|
|
201
|
-
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage = false }: AssistenteXerticaProps) {
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
export function AssistenteXertica({
|
|
150
|
+
isExpanded,
|
|
151
|
+
onToggle,
|
|
152
|
+
onToggleWithTab,
|
|
153
|
+
isFullPage = false,
|
|
154
|
+
demoMode = false,
|
|
155
|
+
customResponses = []
|
|
156
|
+
}: AssistenteXerticaProps) {
|
|
205
157
|
const navigate = useNavigate();
|
|
206
158
|
const { geminiApiKey, isApiKeyValid } = useApiKey();
|
|
207
159
|
const {
|
|
@@ -398,10 +350,10 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
|
|
|
398
350
|
setIsTyping(true);
|
|
399
351
|
|
|
400
352
|
try {
|
|
401
|
-
let
|
|
353
|
+
let novaMensagemParcial: Partial<Message> = {};
|
|
402
354
|
|
|
403
|
-
// Se a chave da API for válida, usar Gemini
|
|
404
|
-
if (isApiKeyValid && geminiApiKey) {
|
|
355
|
+
// Se a chave da API for válida e não estiver em modo demo, usar Gemini
|
|
356
|
+
if (isApiKeyValid && geminiApiKey && !demoMode) {
|
|
405
357
|
// Construir histórico da conversa para o Gemini
|
|
406
358
|
const conversaAtiva = conversas.find(c => c.id === conversaAtual);
|
|
407
359
|
const historico: GeminiMessage[] = [];
|
|
@@ -444,7 +396,8 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
|
|
|
444
396
|
}
|
|
445
397
|
|
|
446
398
|
try {
|
|
447
|
-
|
|
399
|
+
const respostaTexto = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
|
|
400
|
+
novaMensagemParcial = { content: respostaTexto };
|
|
448
401
|
} catch (error) {
|
|
449
402
|
console.error('Erro ao chamar API Gemini:', error);
|
|
450
403
|
// Usar a mensagem de erro do utilitário se disponível
|
|
@@ -460,27 +413,41 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
|
|
|
460
413
|
description: 'Sua chave foi reportada como vazada. Gere uma nova em Google AI Studio.',
|
|
461
414
|
duration: 6000,
|
|
462
415
|
});
|
|
463
|
-
|
|
416
|
+
novaMensagemParcial = {
|
|
417
|
+
content: `🔐 **Chave de API Desativada por Segurança**\n\n${errorMessage}\n\n**Como resolver:**\n1. Acesse [Google AI Studio](https://aistudio.google.com/apikey)\n2. Gere uma nova chave de API\n3. Configure a nova chave em **Configurações > API**\n\n⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`
|
|
418
|
+
};
|
|
464
419
|
} else {
|
|
465
420
|
toast.error('Erro ao processar mensagem', {
|
|
466
421
|
description: 'Verifique sua chave de API nas Configurações.',
|
|
467
422
|
duration: 4000,
|
|
468
423
|
});
|
|
469
|
-
|
|
424
|
+
novaMensagemParcial = {
|
|
425
|
+
content: `**Erro ao processar sua mensagem**\n\n${errorMessage}\n\n💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`
|
|
426
|
+
};
|
|
470
427
|
}
|
|
471
428
|
}
|
|
472
429
|
} else {
|
|
473
|
-
// Fallback para respostas simuladas se não houver API key
|
|
430
|
+
// Fallback para respostas simuladas se não houver API key ou em modo demo
|
|
474
431
|
await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 1000));
|
|
475
|
-
|
|
432
|
+
|
|
433
|
+
// Passar customResponses para gerarResposta
|
|
434
|
+
const resultadoMock = gerarResposta(mensagemUsuario, customResponses);
|
|
435
|
+
|
|
436
|
+
if (typeof resultadoMock === 'string') {
|
|
437
|
+
novaMensagemParcial = { content: resultadoMock };
|
|
438
|
+
} else {
|
|
439
|
+
// Se for objeto (MockResponse), usar diretamente
|
|
440
|
+
novaMensagemParcial = resultadoMock;
|
|
441
|
+
}
|
|
476
442
|
}
|
|
477
443
|
|
|
478
444
|
const novaMensagem: Message = {
|
|
479
445
|
id: Date.now().toString() + '-ia',
|
|
480
446
|
type: 'assistant',
|
|
481
|
-
content:
|
|
447
|
+
content: '', // Valor padrão se não vier no partial
|
|
482
448
|
timestamp: new Date(),
|
|
483
|
-
isFavorite: false
|
|
449
|
+
isFavorite: false,
|
|
450
|
+
...novaMensagemParcial
|
|
484
451
|
};
|
|
485
452
|
|
|
486
453
|
setConversas(prev => prev.map(conv => {
|
|
@@ -489,7 +456,7 @@ export function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFul
|
|
|
489
456
|
return {
|
|
490
457
|
...conv,
|
|
491
458
|
mensagens: novasMensagens,
|
|
492
|
-
ultimaMensagem:
|
|
459
|
+
ultimaMensagem: (novaMensagem.content || '').substring(0, 50) + '...',
|
|
493
460
|
timestamp: new Date().toLocaleString('pt-BR')
|
|
494
461
|
};
|
|
495
462
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Message, MockResponse, Sugestao } from '../contexts/AssistenteContext';
|
|
2
|
+
import { BarChart3, ImageIcon, Table as TableIcon, FileText } from 'lucide-react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
export const sugestoesPadrao: Sugestao[] = [
|
|
6
|
+
{ id: '1', texto: 'O que posso pedir para você fazer?' },
|
|
7
|
+
{ id: '2', texto: 'O que você faz?' },
|
|
8
|
+
{ id: '3', texto: 'Com quais projetos devo me preocupar agora?' },
|
|
9
|
+
{ id: '4', texto: 'Qual meu próximo projeto?' },
|
|
10
|
+
{ id: '5', texto: 'Qual projetos está tendo o melhor desempenho?' }
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
export const sugestoesRicas: Sugestao[] = [
|
|
14
|
+
{ id: 'rich-1', texto: 'Ver exemplo de Gráfico', icon: React.createElement(BarChart3, { className: "w-4 h-4 mr-2" }) },
|
|
15
|
+
{ id: 'rich-2', texto: 'Ver exemplo de Imagem', icon: React.createElement(ImageIcon, { className: "w-4 h-4 mr-2" }) },
|
|
16
|
+
{ id: 'rich-3', texto: 'Ver exemplo de Tabela', icon: React.createElement(TableIcon, { className: "w-4 h-4 mr-2" }) },
|
|
17
|
+
{ id: 'rich-4', texto: 'Ver exemplo de Documento', icon: React.createElement(FileText, { className: "w-4 h-4 mr-2" }) }
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
// Respostas simuladas da IA
|
|
21
|
+
export const gerarResposta = (mensagemUsuario: string, customResponses?: MockResponse[]): string | Partial<Message> => {
|
|
22
|
+
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
23
|
+
|
|
24
|
+
// 1. Verificar respostas customizadas primeiro
|
|
25
|
+
if (customResponses && customResponses.length > 0) {
|
|
26
|
+
for (const mock of customResponses) {
|
|
27
|
+
const trigger = mock.trigger;
|
|
28
|
+
let match = false;
|
|
29
|
+
|
|
30
|
+
if (trigger instanceof RegExp) {
|
|
31
|
+
match = trigger.test(mensagemUsuario);
|
|
32
|
+
} else {
|
|
33
|
+
match = mensagemLower.includes(trigger.toLowerCase());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (match) {
|
|
37
|
+
return mock.response;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const mensagemOriginal = mensagemUsuario;
|
|
43
|
+
|
|
44
|
+
if (mensagemLower.includes('o que') && (mensagemLower.includes('fazer') || mensagemLower.includes('pedir'))) {
|
|
45
|
+
return 'Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (mensagemLower.includes('o que você faz') || mensagemLower.includes('quem é você')) {
|
|
49
|
+
return 'Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (mensagemLower.includes('projeto') && (mensagemLower.includes('preocupar') || mensagemLower.includes('atenção'))) {
|
|
53
|
+
return 'Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (mensagemLower.includes('próximo projeto') || mensagemLower.includes('próxima tarefa')) {
|
|
57
|
+
return 'Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (mensagemLower.includes('desempenho') || mensagemLower.includes('performance') || mensagemLower.includes('melhor')) {
|
|
61
|
+
return 'Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parabéns!\n\nQuer ver métricas detalhadas?';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (mensagemLower.includes('olá') || mensagemLower.includes('oi') || mensagemLower.includes('bom dia') || mensagemLower.includes('boa tarde') || mensagemLower.includes('boa noite')) {
|
|
65
|
+
return 'Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (mensagemLower.includes('obrigado') || mensagemLower.includes('obrigada')) {
|
|
69
|
+
return 'Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Respostas para ações especiais
|
|
73
|
+
if (mensagemLower.includes('criar documento')) {
|
|
74
|
+
const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, '').trim();
|
|
75
|
+
return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (mensagemLower.includes('gerar podcast')) {
|
|
79
|
+
const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, '').trim();
|
|
80
|
+
return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (mensagemLower.includes('pesquisar')) {
|
|
84
|
+
const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, '').trim();
|
|
85
|
+
return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (mensagemLower.includes('arquivo') || mensagemLower.includes('documento')) {
|
|
89
|
+
return 'Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Resposta genérica inteligente
|
|
93
|
+
const respostasGenericas = [
|
|
94
|
+
'Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?',
|
|
95
|
+
'Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?',
|
|
96
|
+
'Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?',
|
|
97
|
+
'Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?'
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
101
|
+
};
|
|
@@ -81,12 +81,12 @@ function AssistantTooltipContent({
|
|
|
81
81
|
/**
|
|
82
82
|
* Tipos de mensagem suportados pelo assistente
|
|
83
83
|
*/
|
|
84
|
-
export type MessageType = 'user' | 'assistant';
|
|
84
|
+
export type MessageType = 'user' | 'assistant' | 'system';
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
87
|
* Tipos de anexo que podem ser incluídos em mensagens
|
|
88
88
|
*/
|
|
89
|
-
export type AttachmentType = 'file' | 'audio' | 'image' | 'document' | 'podcast' | 'search';
|
|
89
|
+
export type AttachmentType = 'file' | 'audio' | 'image' | 'video' | 'document' | 'podcast' | 'search';
|
|
90
90
|
|
|
91
91
|
/**
|
|
92
92
|
* Tipo de busca que pode ser realizada
|
|
@@ -141,6 +141,15 @@ export interface Message {
|
|
|
141
141
|
searchResults?: SearchResult[];
|
|
142
142
|
searchSources?: SearchSource[];
|
|
143
143
|
searchCommands?: SearchCommand[];
|
|
144
|
+
chartData?: any[];
|
|
145
|
+
chartConfig?: any;
|
|
146
|
+
tableData?: {
|
|
147
|
+
caption?: string;
|
|
148
|
+
headers: string[];
|
|
149
|
+
rows: (string | React.ReactNode)[][];
|
|
150
|
+
};
|
|
151
|
+
evaluation?: 'like' | 'dislike';
|
|
152
|
+
evaluationReason?: string;
|
|
144
153
|
}
|
|
145
154
|
|
|
146
155
|
/**
|
|
@@ -177,6 +186,9 @@ export type AssistantTab = 'chat' | 'historico' | 'favoritos';
|
|
|
177
186
|
// Props do Componente
|
|
178
187
|
// ============================================================================
|
|
179
188
|
|
|
189
|
+
import type { MockResponse } from '../../contexts/AssistenteContext';
|
|
190
|
+
import { gerarResposta } from '../assistant-utils';
|
|
191
|
+
|
|
180
192
|
export interface XerticaAssistantProps {
|
|
181
193
|
/**
|
|
182
194
|
* Modo de exibição do assistente
|
|
@@ -207,6 +219,16 @@ export interface XerticaAssistantProps {
|
|
|
207
219
|
*/
|
|
208
220
|
showApiWarning?: boolean;
|
|
209
221
|
|
|
222
|
+
/**
|
|
223
|
+
* Ativa o modo de demonstração (sem API key)
|
|
224
|
+
*/
|
|
225
|
+
demoMode?: boolean;
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Respostas customizadas para o modo de demonstração
|
|
229
|
+
*/
|
|
230
|
+
customResponses?: MockResponse[];
|
|
231
|
+
|
|
210
232
|
/**
|
|
211
233
|
* Chave da API do Gemini (se disponível)
|
|
212
234
|
*/
|
|
@@ -330,6 +352,8 @@ export function XerticaAssistant({
|
|
|
330
352
|
height,
|
|
331
353
|
className = '',
|
|
332
354
|
mobileFloating = false,
|
|
355
|
+
demoMode = false,
|
|
356
|
+
customResponses = []
|
|
333
357
|
}: XerticaAssistantProps) {
|
|
334
358
|
// ============================================================================
|
|
335
359
|
// State Management
|
|
@@ -435,10 +459,37 @@ export function XerticaAssistant({
|
|
|
435
459
|
|
|
436
460
|
setMensagens(prev => [...prev, novaMensagem]);
|
|
437
461
|
|
|
462
|
+
|
|
438
463
|
if (onSendMessage) {
|
|
439
464
|
onSendMessage(mensagem);
|
|
440
465
|
}
|
|
441
466
|
|
|
467
|
+
if (demoMode) {
|
|
468
|
+
// Simular resposta no modo demo se não houver handler externo ou se o handler for apenas para log/side-effect
|
|
469
|
+
// Mas cuidado para não duplicar se onSendMessage também gerar resposta.
|
|
470
|
+
// Assumindo que demoMode é autossuficiente.
|
|
471
|
+
const mensagemAtual = mensagem;
|
|
472
|
+
setTimeout(() => {
|
|
473
|
+
const resposta = gerarResposta(mensagemAtual, customResponses);
|
|
474
|
+
|
|
475
|
+
let novaMensagemIA: Message = {
|
|
476
|
+
id: `msg-${Date.now()}-ia`,
|
|
477
|
+
type: 'assistant',
|
|
478
|
+
content: '',
|
|
479
|
+
timestamp: new Date(),
|
|
480
|
+
isFavorite: false
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
if (typeof resposta === 'string') {
|
|
484
|
+
novaMensagemIA.content = resposta;
|
|
485
|
+
} else {
|
|
486
|
+
novaMensagemIA = { ...novaMensagemIA, ...resposta };
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
setMensagens(prev => [...prev, novaMensagemIA]);
|
|
490
|
+
}, 1000 + Math.random() * 1000);
|
|
491
|
+
}
|
|
492
|
+
|
|
442
493
|
setMensagem('');
|
|
443
494
|
};
|
|
444
495
|
|
|
@@ -33,6 +33,12 @@ export interface Message {
|
|
|
33
33
|
evaluationReason?: string;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
export interface MockResponse {
|
|
37
|
+
trigger: string | RegExp;
|
|
38
|
+
response: string | Partial<Message>;
|
|
39
|
+
delay?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
36
42
|
export interface Conversa {
|
|
37
43
|
id: string;
|
|
38
44
|
titulo: string;
|
|
@@ -4,5 +4,14 @@ interface AssistenteXerticaProps {
|
|
|
4
4
|
onToggleWithTab?: (tab: 'chat' | 'historico' | 'favoritos') => void;
|
|
5
5
|
isFullPage?: boolean;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
import type { MockResponse } from '../contexts/AssistenteContext';
|
|
8
|
+
interface AssistenteXerticaProps {
|
|
9
|
+
isExpanded: boolean;
|
|
10
|
+
onToggle: () => void;
|
|
11
|
+
onToggleWithTab?: (tab: 'chat' | 'historico' | 'favoritos') => void;
|
|
12
|
+
isFullPage?: boolean;
|
|
13
|
+
demoMode?: boolean;
|
|
14
|
+
customResponses?: MockResponse[];
|
|
15
|
+
}
|
|
16
|
+
export declare function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage, demoMode, customResponses }: AssistenteXerticaProps): import("react/jsx-runtime").JSX.Element;
|
|
8
17
|
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Message, MockResponse, Sugestao } from '../contexts/AssistenteContext';
|
|
2
|
+
export declare const sugestoesPadrao: Sugestao[];
|
|
3
|
+
export declare const sugestoesRicas: Sugestao[];
|
|
4
|
+
export declare const gerarResposta: (mensagemUsuario: string, customResponses?: MockResponse[]) => string | Partial<Message>;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
/**
|
|
2
3
|
* Tipos de mensagem suportados pelo assistente
|
|
3
4
|
*/
|
|
4
|
-
export type MessageType = 'user' | 'assistant';
|
|
5
|
+
export type MessageType = 'user' | 'assistant' | 'system';
|
|
5
6
|
/**
|
|
6
7
|
* Tipos de anexo que podem ser incluídos em mensagens
|
|
7
8
|
*/
|
|
8
|
-
export type AttachmentType = 'file' | 'audio' | 'image' | 'document' | 'podcast' | 'search';
|
|
9
|
+
export type AttachmentType = 'file' | 'audio' | 'image' | 'video' | 'document' | 'podcast' | 'search';
|
|
9
10
|
/**
|
|
10
11
|
* Tipo de busca que pode ser realizada
|
|
11
12
|
*/
|
|
@@ -55,6 +56,15 @@ export interface Message {
|
|
|
55
56
|
searchResults?: SearchResult[];
|
|
56
57
|
searchSources?: SearchSource[];
|
|
57
58
|
searchCommands?: SearchCommand[];
|
|
59
|
+
chartData?: any[];
|
|
60
|
+
chartConfig?: any;
|
|
61
|
+
tableData?: {
|
|
62
|
+
caption?: string;
|
|
63
|
+
headers: string[];
|
|
64
|
+
rows: (string | React.ReactNode)[][];
|
|
65
|
+
};
|
|
66
|
+
evaluation?: 'like' | 'dislike';
|
|
67
|
+
evaluationReason?: string;
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
60
70
|
* Interface para uma conversa salva
|
|
@@ -82,6 +92,7 @@ export type AssistantMode = 'collapsed' | 'expanded' | 'fullPage';
|
|
|
82
92
|
* Abas disponíveis no assistente
|
|
83
93
|
*/
|
|
84
94
|
export type AssistantTab = 'chat' | 'historico' | 'favoritos';
|
|
95
|
+
import type { MockResponse } from '../../contexts/AssistenteContext';
|
|
85
96
|
export interface XerticaAssistantProps {
|
|
86
97
|
/**
|
|
87
98
|
* Modo de exibição do assistente
|
|
@@ -107,6 +118,14 @@ export interface XerticaAssistantProps {
|
|
|
107
118
|
* @default true
|
|
108
119
|
*/
|
|
109
120
|
showApiWarning?: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Ativa o modo de demonstração (sem API key)
|
|
123
|
+
*/
|
|
124
|
+
demoMode?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Respostas customizadas para o modo de demonstração
|
|
127
|
+
*/
|
|
128
|
+
customResponses?: MockResponse[];
|
|
110
129
|
/**
|
|
111
130
|
* Chave da API do Gemini (se disponível)
|
|
112
131
|
*/
|
|
@@ -193,4 +212,4 @@ export interface XerticaAssistantProps {
|
|
|
193
212
|
* />
|
|
194
213
|
* ```
|
|
195
214
|
*/
|
|
196
|
-
export declare function XerticaAssistant({ mode, isExpanded: controlledIsExpanded, onToggle, defaultTab, showApiWarning, apiKey, onNavigateSettings, onNavigateFullPage, userName, initialMessages, savedConversations, suggestions: propSuggestions, onSendMessage, onFileAttach, isProcessing, width, height, className, mobileFloating, }: XerticaAssistantProps): import("react/jsx-runtime").JSX.Element;
|
|
215
|
+
export declare function XerticaAssistant({ mode, isExpanded: controlledIsExpanded, onToggle, defaultTab, showApiWarning, apiKey, onNavigateSettings, onNavigateFullPage, userName, initialMessages, savedConversations, suggestions: propSuggestions, onSendMessage, onFileAttach, isProcessing, width, height, className, mobileFloating, demoMode, customResponses }: XerticaAssistantProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -28,6 +28,11 @@ export interface Message {
|
|
|
28
28
|
evaluation?: 'like' | 'dislike';
|
|
29
29
|
evaluationReason?: string;
|
|
30
30
|
}
|
|
31
|
+
export interface MockResponse {
|
|
32
|
+
trigger: string | RegExp;
|
|
33
|
+
response: string | Partial<Message>;
|
|
34
|
+
delay?: number;
|
|
35
|
+
}
|
|
31
36
|
export interface Conversa {
|
|
32
37
|
id: string;
|
|
33
38
|
titulo: string;
|
package/dist/index.es.js
CHANGED
|
@@ -19687,6 +19687,80 @@ function TooltipContent({
|
|
|
19687
19687
|
}
|
|
19688
19688
|
) });
|
|
19689
19689
|
}
|
|
19690
|
+
const sugestoesPadrao = [
|
|
19691
|
+
{ id: "1", texto: "O que posso pedir para você fazer?" },
|
|
19692
|
+
{ id: "2", texto: "O que você faz?" },
|
|
19693
|
+
{ id: "3", texto: "Com quais projetos devo me preocupar agora?" },
|
|
19694
|
+
{ id: "4", texto: "Qual meu próximo projeto?" },
|
|
19695
|
+
{ id: "5", texto: "Qual projetos está tendo o melhor desempenho?" }
|
|
19696
|
+
];
|
|
19697
|
+
const sugestoesRicas = [
|
|
19698
|
+
{ id: "rich-1", texto: "Ver exemplo de Gráfico", icon: React__default.createElement(ChartColumn, { className: "w-4 h-4 mr-2" }) },
|
|
19699
|
+
{ id: "rich-2", texto: "Ver exemplo de Imagem", icon: React__default.createElement(Image$1, { className: "w-4 h-4 mr-2" }) },
|
|
19700
|
+
{ id: "rich-3", texto: "Ver exemplo de Tabela", icon: React__default.createElement(Table$1, { className: "w-4 h-4 mr-2" }) },
|
|
19701
|
+
{ id: "rich-4", texto: "Ver exemplo de Documento", icon: React__default.createElement(FileText, { className: "w-4 h-4 mr-2" }) }
|
|
19702
|
+
];
|
|
19703
|
+
const gerarResposta = (mensagemUsuario, customResponses) => {
|
|
19704
|
+
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
19705
|
+
if (customResponses && customResponses.length > 0) {
|
|
19706
|
+
for (const mock of customResponses) {
|
|
19707
|
+
const trigger = mock.trigger;
|
|
19708
|
+
let match2 = false;
|
|
19709
|
+
if (trigger instanceof RegExp) {
|
|
19710
|
+
match2 = trigger.test(mensagemUsuario);
|
|
19711
|
+
} else {
|
|
19712
|
+
match2 = mensagemLower.includes(trigger.toLowerCase());
|
|
19713
|
+
}
|
|
19714
|
+
if (match2) {
|
|
19715
|
+
return mock.response;
|
|
19716
|
+
}
|
|
19717
|
+
}
|
|
19718
|
+
}
|
|
19719
|
+
const mensagemOriginal = mensagemUsuario;
|
|
19720
|
+
if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
|
|
19721
|
+
return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
|
|
19722
|
+
}
|
|
19723
|
+
if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
|
|
19724
|
+
return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
|
|
19725
|
+
}
|
|
19726
|
+
if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
|
|
19727
|
+
return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
|
|
19728
|
+
}
|
|
19729
|
+
if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
|
|
19730
|
+
return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
|
|
19731
|
+
}
|
|
19732
|
+
if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
|
|
19733
|
+
return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parabéns!\n\nQuer ver métricas detalhadas?";
|
|
19734
|
+
}
|
|
19735
|
+
if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
|
|
19736
|
+
return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
|
|
19737
|
+
}
|
|
19738
|
+
if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
|
|
19739
|
+
return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
|
|
19740
|
+
}
|
|
19741
|
+
if (mensagemLower.includes("criar documento")) {
|
|
19742
|
+
const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
|
|
19743
|
+
return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
|
|
19744
|
+
}
|
|
19745
|
+
if (mensagemLower.includes("gerar podcast")) {
|
|
19746
|
+
const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
|
|
19747
|
+
return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
|
|
19748
|
+
}
|
|
19749
|
+
if (mensagemLower.includes("pesquisar")) {
|
|
19750
|
+
const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
|
|
19751
|
+
return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
|
|
19752
|
+
}
|
|
19753
|
+
if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
|
|
19754
|
+
return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
|
|
19755
|
+
}
|
|
19756
|
+
const respostasGenericas = [
|
|
19757
|
+
"Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
|
|
19758
|
+
"Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
|
|
19759
|
+
"Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
|
|
19760
|
+
"Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
|
|
19761
|
+
];
|
|
19762
|
+
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
19763
|
+
};
|
|
19690
19764
|
const __vite_import_meta_env__$2 = {};
|
|
19691
19765
|
function AssistantTooltipContent$1({
|
|
19692
19766
|
className,
|
|
@@ -19737,7 +19811,9 @@ function XerticaAssistant({
|
|
|
19737
19811
|
width,
|
|
19738
19812
|
height,
|
|
19739
19813
|
className = "",
|
|
19740
|
-
mobileFloating = false
|
|
19814
|
+
mobileFloating = false,
|
|
19815
|
+
demoMode = false,
|
|
19816
|
+
customResponses = []
|
|
19741
19817
|
}) {
|
|
19742
19818
|
const isFullPage = mode === "fullPage";
|
|
19743
19819
|
const [internalIsExpanded, setInternalIsExpanded] = useState(controlledIsExpanded ?? true);
|
|
@@ -19802,6 +19878,25 @@ function XerticaAssistant({
|
|
|
19802
19878
|
if (onSendMessage) {
|
|
19803
19879
|
onSendMessage(mensagem);
|
|
19804
19880
|
}
|
|
19881
|
+
if (demoMode) {
|
|
19882
|
+
const mensagemAtual = mensagem;
|
|
19883
|
+
setTimeout(() => {
|
|
19884
|
+
const resposta = gerarResposta(mensagemAtual, customResponses);
|
|
19885
|
+
let novaMensagemIA = {
|
|
19886
|
+
id: `msg-${Date.now()}-ia`,
|
|
19887
|
+
type: "assistant",
|
|
19888
|
+
content: "",
|
|
19889
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
19890
|
+
isFavorite: false
|
|
19891
|
+
};
|
|
19892
|
+
if (typeof resposta === "string") {
|
|
19893
|
+
novaMensagemIA.content = resposta;
|
|
19894
|
+
} else {
|
|
19895
|
+
novaMensagemIA = { ...novaMensagemIA, ...resposta };
|
|
19896
|
+
}
|
|
19897
|
+
setMensagens((prev) => [...prev, novaMensagemIA]);
|
|
19898
|
+
}, 1e3 + Math.random() * 1e3);
|
|
19899
|
+
}
|
|
19805
19900
|
setMensagem("");
|
|
19806
19901
|
};
|
|
19807
19902
|
const handleToggleFavorite = (messageId) => {
|
|
@@ -56387,67 +56482,14 @@ function AssistantTooltipContent({
|
|
|
56387
56482
|
}
|
|
56388
56483
|
) });
|
|
56389
56484
|
}
|
|
56390
|
-
|
|
56391
|
-
|
|
56392
|
-
|
|
56393
|
-
|
|
56394
|
-
|
|
56395
|
-
|
|
56396
|
-
]
|
|
56397
|
-
|
|
56398
|
-
{ id: "rich-1", texto: "Ver exemplo de Gráfico", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartColumn, { className: "w-4 h-4 mr-2" }) },
|
|
56399
|
-
{ id: "rich-2", texto: "Ver exemplo de Imagem", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "w-4 h-4 mr-2" }) },
|
|
56400
|
-
{ id: "rich-3", texto: "Ver exemplo de Tabela", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Table$1, { className: "w-4 h-4 mr-2" }) },
|
|
56401
|
-
{ id: "rich-4", texto: "Ver exemplo de Documento", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4 mr-2" }) }
|
|
56402
|
-
];
|
|
56403
|
-
const gerarResposta = (mensagemUsuario) => {
|
|
56404
|
-
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
56405
|
-
const mensagemOriginal = mensagemUsuario;
|
|
56406
|
-
if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
|
|
56407
|
-
return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
|
|
56408
|
-
}
|
|
56409
|
-
if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
|
|
56410
|
-
return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
|
|
56411
|
-
}
|
|
56412
|
-
if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
|
|
56413
|
-
return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
|
|
56414
|
-
}
|
|
56415
|
-
if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
|
|
56416
|
-
return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
|
|
56417
|
-
}
|
|
56418
|
-
if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
|
|
56419
|
-
return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parab��ns!\n\nQuer ver métricas detalhadas?";
|
|
56420
|
-
}
|
|
56421
|
-
if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
|
|
56422
|
-
return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
|
|
56423
|
-
}
|
|
56424
|
-
if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
|
|
56425
|
-
return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
|
|
56426
|
-
}
|
|
56427
|
-
if (mensagemLower.includes("criar documento")) {
|
|
56428
|
-
const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
|
|
56429
|
-
return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
|
|
56430
|
-
}
|
|
56431
|
-
if (mensagemLower.includes("gerar podcast")) {
|
|
56432
|
-
const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
|
|
56433
|
-
return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
|
|
56434
|
-
}
|
|
56435
|
-
if (mensagemLower.includes("pesquisar")) {
|
|
56436
|
-
const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
|
|
56437
|
-
return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
|
|
56438
|
-
}
|
|
56439
|
-
if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
|
|
56440
|
-
return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
|
|
56441
|
-
}
|
|
56442
|
-
const respostasGenericas = [
|
|
56443
|
-
"Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
|
|
56444
|
-
"Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
|
|
56445
|
-
"Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
|
|
56446
|
-
"Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
|
|
56447
|
-
];
|
|
56448
|
-
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
56449
|
-
};
|
|
56450
|
-
function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage = false }) {
|
|
56485
|
+
function AssistenteXertica({
|
|
56486
|
+
isExpanded,
|
|
56487
|
+
onToggle,
|
|
56488
|
+
onToggleWithTab,
|
|
56489
|
+
isFullPage = false,
|
|
56490
|
+
demoMode = false,
|
|
56491
|
+
customResponses = []
|
|
56492
|
+
}) {
|
|
56451
56493
|
const navigate = useNavigate();
|
|
56452
56494
|
const { geminiApiKey, isApiKeyValid } = useApiKey();
|
|
56453
56495
|
const {
|
|
@@ -56633,8 +56675,8 @@ function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage =
|
|
|
56633
56675
|
const simularRespostaIA = async (mensagemUsuario) => {
|
|
56634
56676
|
setIsTyping(true);
|
|
56635
56677
|
try {
|
|
56636
|
-
let
|
|
56637
|
-
if (isApiKeyValid && geminiApiKey) {
|
|
56678
|
+
let novaMensagemParcial = {};
|
|
56679
|
+
if (isApiKeyValid && geminiApiKey && !demoMode) {
|
|
56638
56680
|
const conversaAtiva2 = conversas.find((c2) => c2.id === conversaAtual);
|
|
56639
56681
|
const historico = [];
|
|
56640
56682
|
const systemPrompt = buildSystemPrompt();
|
|
@@ -56664,7 +56706,8 @@ function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage =
|
|
|
56664
56706
|
});
|
|
56665
56707
|
}
|
|
56666
56708
|
try {
|
|
56667
|
-
|
|
56709
|
+
const respostaTexto = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
|
|
56710
|
+
novaMensagemParcial = { content: respostaTexto };
|
|
56668
56711
|
} catch (error) {
|
|
56669
56712
|
console.error("Erro ao chamar API Gemini:", error);
|
|
56670
56713
|
const errorMessage = error instanceof Error ? error.message : "❌ Erro desconhecido";
|
|
@@ -56674,7 +56717,8 @@ function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage =
|
|
|
56674
56717
|
description: "Sua chave foi reportada como vazada. Gere uma nova em Google AI Studio.",
|
|
56675
56718
|
duration: 6e3
|
|
56676
56719
|
});
|
|
56677
|
-
|
|
56720
|
+
novaMensagemParcial = {
|
|
56721
|
+
content: `🔐 **Chave de API Desativada por Segurança**
|
|
56678
56722
|
|
|
56679
56723
|
${errorMessage}
|
|
56680
56724
|
|
|
@@ -56683,29 +56727,39 @@ ${errorMessage}
|
|
|
56683
56727
|
2. Gere uma nova chave de API
|
|
56684
56728
|
3. Configure a nova chave em **Configurações > API**
|
|
56685
56729
|
|
|
56686
|
-
⚠️ **Importante:** Não compartilhe sua chave de API publicamente
|
|
56730
|
+
⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`
|
|
56731
|
+
};
|
|
56687
56732
|
} else {
|
|
56688
56733
|
ue$1.error("Erro ao processar mensagem", {
|
|
56689
56734
|
description: "Verifique sua chave de API nas Configurações.",
|
|
56690
56735
|
duration: 4e3
|
|
56691
56736
|
});
|
|
56692
|
-
|
|
56737
|
+
novaMensagemParcial = {
|
|
56738
|
+
content: `**Erro ao processar sua mensagem**
|
|
56693
56739
|
|
|
56694
56740
|
${errorMessage}
|
|
56695
56741
|
|
|
56696
|
-
💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API
|
|
56742
|
+
💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`
|
|
56743
|
+
};
|
|
56697
56744
|
}
|
|
56698
56745
|
}
|
|
56699
56746
|
} else {
|
|
56700
56747
|
await new Promise((resolve) => setTimeout(resolve, 1e3 + Math.random() * 1e3));
|
|
56701
|
-
|
|
56748
|
+
const resultadoMock = gerarResposta(mensagemUsuario, customResponses);
|
|
56749
|
+
if (typeof resultadoMock === "string") {
|
|
56750
|
+
novaMensagemParcial = { content: resultadoMock };
|
|
56751
|
+
} else {
|
|
56752
|
+
novaMensagemParcial = resultadoMock;
|
|
56753
|
+
}
|
|
56702
56754
|
}
|
|
56703
56755
|
const novaMensagem = {
|
|
56704
56756
|
id: Date.now().toString() + "-ia",
|
|
56705
56757
|
type: "assistant",
|
|
56706
|
-
content:
|
|
56758
|
+
content: "",
|
|
56759
|
+
// Valor padrão se não vier no partial
|
|
56707
56760
|
timestamp: /* @__PURE__ */ new Date(),
|
|
56708
|
-
isFavorite: false
|
|
56761
|
+
isFavorite: false,
|
|
56762
|
+
...novaMensagemParcial
|
|
56709
56763
|
};
|
|
56710
56764
|
setConversas((prev) => prev.map((conv) => {
|
|
56711
56765
|
if (conv.id === conversaAtual) {
|
|
@@ -56713,7 +56767,7 @@ ${errorMessage}
|
|
|
56713
56767
|
return {
|
|
56714
56768
|
...conv,
|
|
56715
56769
|
mensagens: novasMensagens,
|
|
56716
|
-
ultimaMensagem:
|
|
56770
|
+
ultimaMensagem: (novaMensagem.content || "").substring(0, 50) + "...",
|
|
56717
56771
|
timestamp: (/* @__PURE__ */ new Date()).toLocaleString("pt-BR")
|
|
56718
56772
|
};
|
|
56719
56773
|
}
|
package/dist/index.umd.js
CHANGED
|
@@ -19706,6 +19706,80 @@
|
|
|
19706
19706
|
}
|
|
19707
19707
|
) });
|
|
19708
19708
|
}
|
|
19709
|
+
const sugestoesPadrao = [
|
|
19710
|
+
{ id: "1", texto: "O que posso pedir para você fazer?" },
|
|
19711
|
+
{ id: "2", texto: "O que você faz?" },
|
|
19712
|
+
{ id: "3", texto: "Com quais projetos devo me preocupar agora?" },
|
|
19713
|
+
{ id: "4", texto: "Qual meu próximo projeto?" },
|
|
19714
|
+
{ id: "5", texto: "Qual projetos está tendo o melhor desempenho?" }
|
|
19715
|
+
];
|
|
19716
|
+
const sugestoesRicas = [
|
|
19717
|
+
{ id: "rich-1", texto: "Ver exemplo de Gráfico", icon: React.createElement(ChartColumn, { className: "w-4 h-4 mr-2" }) },
|
|
19718
|
+
{ id: "rich-2", texto: "Ver exemplo de Imagem", icon: React.createElement(Image$1, { className: "w-4 h-4 mr-2" }) },
|
|
19719
|
+
{ id: "rich-3", texto: "Ver exemplo de Tabela", icon: React.createElement(Table$1, { className: "w-4 h-4 mr-2" }) },
|
|
19720
|
+
{ id: "rich-4", texto: "Ver exemplo de Documento", icon: React.createElement(FileText, { className: "w-4 h-4 mr-2" }) }
|
|
19721
|
+
];
|
|
19722
|
+
const gerarResposta = (mensagemUsuario, customResponses) => {
|
|
19723
|
+
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
19724
|
+
if (customResponses && customResponses.length > 0) {
|
|
19725
|
+
for (const mock of customResponses) {
|
|
19726
|
+
const trigger = mock.trigger;
|
|
19727
|
+
let match2 = false;
|
|
19728
|
+
if (trigger instanceof RegExp) {
|
|
19729
|
+
match2 = trigger.test(mensagemUsuario);
|
|
19730
|
+
} else {
|
|
19731
|
+
match2 = mensagemLower.includes(trigger.toLowerCase());
|
|
19732
|
+
}
|
|
19733
|
+
if (match2) {
|
|
19734
|
+
return mock.response;
|
|
19735
|
+
}
|
|
19736
|
+
}
|
|
19737
|
+
}
|
|
19738
|
+
const mensagemOriginal = mensagemUsuario;
|
|
19739
|
+
if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
|
|
19740
|
+
return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
|
|
19741
|
+
}
|
|
19742
|
+
if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
|
|
19743
|
+
return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
|
|
19744
|
+
}
|
|
19745
|
+
if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
|
|
19746
|
+
return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
|
|
19747
|
+
}
|
|
19748
|
+
if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
|
|
19749
|
+
return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
|
|
19750
|
+
}
|
|
19751
|
+
if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
|
|
19752
|
+
return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parabéns!\n\nQuer ver métricas detalhadas?";
|
|
19753
|
+
}
|
|
19754
|
+
if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
|
|
19755
|
+
return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
|
|
19756
|
+
}
|
|
19757
|
+
if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
|
|
19758
|
+
return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
|
|
19759
|
+
}
|
|
19760
|
+
if (mensagemLower.includes("criar documento")) {
|
|
19761
|
+
const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
|
|
19762
|
+
return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
|
|
19763
|
+
}
|
|
19764
|
+
if (mensagemLower.includes("gerar podcast")) {
|
|
19765
|
+
const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
|
|
19766
|
+
return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
|
|
19767
|
+
}
|
|
19768
|
+
if (mensagemLower.includes("pesquisar")) {
|
|
19769
|
+
const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
|
|
19770
|
+
return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
|
|
19771
|
+
}
|
|
19772
|
+
if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
|
|
19773
|
+
return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
|
|
19774
|
+
}
|
|
19775
|
+
const respostasGenericas = [
|
|
19776
|
+
"Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
|
|
19777
|
+
"Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
|
|
19778
|
+
"Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
|
|
19779
|
+
"Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
|
|
19780
|
+
];
|
|
19781
|
+
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
19782
|
+
};
|
|
19709
19783
|
const __vite_import_meta_env__$2 = {};
|
|
19710
19784
|
function AssistantTooltipContent$1({
|
|
19711
19785
|
className,
|
|
@@ -19756,7 +19830,9 @@
|
|
|
19756
19830
|
width,
|
|
19757
19831
|
height,
|
|
19758
19832
|
className = "",
|
|
19759
|
-
mobileFloating = false
|
|
19833
|
+
mobileFloating = false,
|
|
19834
|
+
demoMode = false,
|
|
19835
|
+
customResponses = []
|
|
19760
19836
|
}) {
|
|
19761
19837
|
const isFullPage = mode === "fullPage";
|
|
19762
19838
|
const [internalIsExpanded, setInternalIsExpanded] = React.useState(controlledIsExpanded ?? true);
|
|
@@ -19821,6 +19897,25 @@
|
|
|
19821
19897
|
if (onSendMessage) {
|
|
19822
19898
|
onSendMessage(mensagem);
|
|
19823
19899
|
}
|
|
19900
|
+
if (demoMode) {
|
|
19901
|
+
const mensagemAtual = mensagem;
|
|
19902
|
+
setTimeout(() => {
|
|
19903
|
+
const resposta = gerarResposta(mensagemAtual, customResponses);
|
|
19904
|
+
let novaMensagemIA = {
|
|
19905
|
+
id: `msg-${Date.now()}-ia`,
|
|
19906
|
+
type: "assistant",
|
|
19907
|
+
content: "",
|
|
19908
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
19909
|
+
isFavorite: false
|
|
19910
|
+
};
|
|
19911
|
+
if (typeof resposta === "string") {
|
|
19912
|
+
novaMensagemIA.content = resposta;
|
|
19913
|
+
} else {
|
|
19914
|
+
novaMensagemIA = { ...novaMensagemIA, ...resposta };
|
|
19915
|
+
}
|
|
19916
|
+
setMensagens((prev) => [...prev, novaMensagemIA]);
|
|
19917
|
+
}, 1e3 + Math.random() * 1e3);
|
|
19918
|
+
}
|
|
19824
19919
|
setMensagem("");
|
|
19825
19920
|
};
|
|
19826
19921
|
const handleToggleFavorite = (messageId) => {
|
|
@@ -56406,67 +56501,14 @@ ${colorConfig.map(([key, itemConfig]) => {
|
|
|
56406
56501
|
}
|
|
56407
56502
|
) });
|
|
56408
56503
|
}
|
|
56409
|
-
|
|
56410
|
-
|
|
56411
|
-
|
|
56412
|
-
|
|
56413
|
-
|
|
56414
|
-
|
|
56415
|
-
|
|
56416
|
-
|
|
56417
|
-
{ id: "rich-1", texto: "Ver exemplo de Gráfico", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartColumn, { className: "w-4 h-4 mr-2" }) },
|
|
56418
|
-
{ id: "rich-2", texto: "Ver exemplo de Imagem", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "w-4 h-4 mr-2" }) },
|
|
56419
|
-
{ id: "rich-3", texto: "Ver exemplo de Tabela", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Table$1, { className: "w-4 h-4 mr-2" }) },
|
|
56420
|
-
{ id: "rich-4", texto: "Ver exemplo de Documento", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4 mr-2" }) }
|
|
56421
|
-
];
|
|
56422
|
-
const gerarResposta = (mensagemUsuario) => {
|
|
56423
|
-
const mensagemLower = mensagemUsuario.toLowerCase();
|
|
56424
|
-
const mensagemOriginal = mensagemUsuario;
|
|
56425
|
-
if (mensagemLower.includes("o que") && (mensagemLower.includes("fazer") || mensagemLower.includes("pedir"))) {
|
|
56426
|
-
return "Posso ajudar você com diversas tarefas! Posso:\n\n• Analisar dados e métricas dos seus projetos\n• Responder perguntas sobre performance e resultados\n• Sugerir otimizações e melhorias\n• Gerar relatórios e documentação\n• Ajudar no planejamento de sprints\n• E muito mais!\n\nQual tarefa você gostaria de realizar primeiro?";
|
|
56427
|
-
}
|
|
56428
|
-
if (mensagemLower.includes("o que você faz") || mensagemLower.includes("quem é você")) {
|
|
56429
|
-
return "Olá! Sou o Assistente Xertica, uma IA desenvolvida para ajudar você a gerenciar projetos, analisar dados e otimizar processos. Estou aqui 24/7 para responder suas perguntas e auxiliar nas suas tarefas diárias.\n\nPosso processar documentos, analisar áudios e imagens, além de fornecer insights baseados nos dados da plataforma.";
|
|
56430
|
-
}
|
|
56431
|
-
if (mensagemLower.includes("projeto") && (mensagemLower.includes("preocupar") || mensagemLower.includes("atenção"))) {
|
|
56432
|
-
return "Com base na análise dos seus projetos ativos, recomendo focar nos seguintes:\n\n1. **Projeto Alpha** - 15% acima do prazo, requer atenção imediata\n2. **Sistema Beta** - Performance crítica, necessita otimização\n3. **Mobile Gamma** - Aguardando aprovações há 5 dias\n\nGostaria de mais detalhes sobre algum deles?";
|
|
56433
|
-
}
|
|
56434
|
-
if (mensagemLower.includes("próximo projeto") || mensagemLower.includes("próxima tarefa")) {
|
|
56435
|
-
return "Seu próximo projeto prioritário é o **Sistema de Analytics V2**.\n\n📅 Início previsto: Próxima segunda-feira\n👥 Time: 5 desenvolvedores\n⏱️ Duração estimada: 3 sprints\n\nJá preparei um roadmap inicial. Gostaria de revisar?";
|
|
56436
|
-
}
|
|
56437
|
-
if (mensagemLower.includes("desempenho") || mensagemLower.includes("performance") || mensagemLower.includes("melhor")) {
|
|
56438
|
-
return "Analisando os dados de performance dos últimos 30 dias:\n\n🏆 **Melhor Performance:**\n• Projeto Dashboard 2.0: +35% eficiência\n• Sistema CRM: -40% tempo de resposta\n• App Mobile: 4.8★ rating (+0.5)\n\n📊 Todos estão acima das metas estabelecidas. Parab��ns!\n\nQuer ver métricas detalhadas?";
|
|
56439
|
-
}
|
|
56440
|
-
if (mensagemLower.includes("olá") || mensagemLower.includes("oi") || mensagemLower.includes("bom dia") || mensagemLower.includes("boa tarde") || mensagemLower.includes("boa noite")) {
|
|
56441
|
-
return "Olá! 👋 Como posso ajudar você hoje? Estou pronto para auxiliar com análises, relatórios ou responder suas dúvidas sobre os projetos.";
|
|
56442
|
-
}
|
|
56443
|
-
if (mensagemLower.includes("obrigado") || mensagemLower.includes("obrigada")) {
|
|
56444
|
-
return "Por nada! Estou aqui sempre que precisar. 😊 Se tiver mais alguma dúvida ou precisar de ajuda, é só chamar!";
|
|
56445
|
-
}
|
|
56446
|
-
if (mensagemLower.includes("criar documento")) {
|
|
56447
|
-
const tema = mensagemOriginal.replace(/📄 \[Criar documento\]/gi, "").trim();
|
|
56448
|
-
return `📝 Documento criado com sucesso!\\n\\nGerei um documento completo sobre "${tema}" com as seguintes seções:\\n\\n• Introdução e contexto\\n• Análise detalhada\\n• Dados e métricas relevantes\\n• Conclusões e recomendações\\n• Próximos passos\\n\\nO documento está pronto para revisão e pode ser editado conforme necessário. Gostaria de adicionar ou modificar alguma seção?`;
|
|
56449
|
-
}
|
|
56450
|
-
if (mensagemLower.includes("gerar podcast")) {
|
|
56451
|
-
const tema = mensagemOriginal.replace(/🎙️ \[Gerar podcast\]/gi, "").trim();
|
|
56452
|
-
return `🎙️ Preparando podcast sobre "${tema}"...\\n\\nEstou processando o conteúdo e gerando um roteiro de podcast profissional com:\\n\\n• Introdução envolvente\\n• Desenvolvimento do tema\\n• Exemplos práticos\\n• Conclusão e insights\\n\\nO áudio será gerado em instantes. Aguarde...`;
|
|
56453
|
-
}
|
|
56454
|
-
if (mensagemLower.includes("pesquisar")) {
|
|
56455
|
-
const termo = mensagemOriginal.replace(/🔍 \[Pesquisar\]/gi, "").trim();
|
|
56456
|
-
return `🔍 Resultados da pesquisa sobre "${termo}"\\n\\n**Encontrei as seguintes informações relevantes:**\\n\\n1. **Documentação interna** - 12 resultados\\n Guias e manuais relacionados ao tema\\n\\n2. **Projetos relacionados** - 8 projetos\\n Incluindo Analytics v2 e Dashboard Pro\\n\\n3. **Discussões em equipe** - 15 menções\\n Últimas conversas sobre o assunto\\n\\nGostaria de ver mais detalhes sobre algum desses resultados?`;
|
|
56457
|
-
}
|
|
56458
|
-
if (mensagemLower.includes("arquivo") || mensagemLower.includes("documento")) {
|
|
56459
|
-
return "Entendi que você deseja trabalhar com arquivos. Posso analisar diversos tipos de documentos:\n\n📄 Documentos de texto (PDF, DOCX)\n📊 Planilhas (XLSX, CSV)\n📈 Relatórios e apresentações\n\nBasta enviá-los usando o botão de anexo (📎) e terei prazer em analisá-los para você!";
|
|
56460
|
-
}
|
|
56461
|
-
const respostasGenericas = [
|
|
56462
|
-
"Entendo sua questão. Com base nos dados disponíveis na plataforma Xertica, posso fornecer análises detalhadas sobre esse tema. Poderia me dar mais contexto para que eu possa ajudá-lo melhor?",
|
|
56463
|
-
"Interessante! Deixe-me processar isso... Com base no seu histórico e nos dados do sistema, recomendo que possamos explorar essa questão em mais detalhes. O que especificamente você gostaria de saber?",
|
|
56464
|
-
"Ótima pergunta! Para te dar a melhor resposta possível, preciso entender melhor o contexto. Você pode me fornecer mais informações sobre o que está buscando?",
|
|
56465
|
-
"Estou analisando sua solicitação. Baseado nos dados do sistema Xertica, posso te ajudar com isso. Você gostaria de uma análise rápida ou um relatório completo?"
|
|
56466
|
-
];
|
|
56467
|
-
return respostasGenericas[Math.floor(Math.random() * respostasGenericas.length)];
|
|
56468
|
-
};
|
|
56469
|
-
function AssistenteXertica({ isExpanded, onToggle, onToggleWithTab, isFullPage = false }) {
|
|
56504
|
+
function AssistenteXertica({
|
|
56505
|
+
isExpanded,
|
|
56506
|
+
onToggle,
|
|
56507
|
+
onToggleWithTab,
|
|
56508
|
+
isFullPage = false,
|
|
56509
|
+
demoMode = false,
|
|
56510
|
+
customResponses = []
|
|
56511
|
+
}) {
|
|
56470
56512
|
const navigate = useNavigate();
|
|
56471
56513
|
const { geminiApiKey, isApiKeyValid } = useApiKey();
|
|
56472
56514
|
const {
|
|
@@ -56652,8 +56694,8 @@ ${colorConfig.map(([key, itemConfig]) => {
|
|
|
56652
56694
|
const simularRespostaIA = async (mensagemUsuario) => {
|
|
56653
56695
|
setIsTyping(true);
|
|
56654
56696
|
try {
|
|
56655
|
-
let
|
|
56656
|
-
if (isApiKeyValid && geminiApiKey) {
|
|
56697
|
+
let novaMensagemParcial = {};
|
|
56698
|
+
if (isApiKeyValid && geminiApiKey && !demoMode) {
|
|
56657
56699
|
const conversaAtiva2 = conversas.find((c2) => c2.id === conversaAtual);
|
|
56658
56700
|
const historico = [];
|
|
56659
56701
|
const systemPrompt = buildSystemPrompt();
|
|
@@ -56683,7 +56725,8 @@ ${colorConfig.map(([key, itemConfig]) => {
|
|
|
56683
56725
|
});
|
|
56684
56726
|
}
|
|
56685
56727
|
try {
|
|
56686
|
-
|
|
56728
|
+
const respostaTexto = await callGeminiAPI(geminiApiKey, mensagemUsuario, historico);
|
|
56729
|
+
novaMensagemParcial = { content: respostaTexto };
|
|
56687
56730
|
} catch (error) {
|
|
56688
56731
|
console.error("Erro ao chamar API Gemini:", error);
|
|
56689
56732
|
const errorMessage = error instanceof Error ? error.message : "❌ Erro desconhecido";
|
|
@@ -56693,7 +56736,8 @@ ${colorConfig.map(([key, itemConfig]) => {
|
|
|
56693
56736
|
description: "Sua chave foi reportada como vazada. Gere uma nova em Google AI Studio.",
|
|
56694
56737
|
duration: 6e3
|
|
56695
56738
|
});
|
|
56696
|
-
|
|
56739
|
+
novaMensagemParcial = {
|
|
56740
|
+
content: `🔐 **Chave de API Desativada por Segurança**
|
|
56697
56741
|
|
|
56698
56742
|
${errorMessage}
|
|
56699
56743
|
|
|
@@ -56702,29 +56746,39 @@ ${errorMessage}
|
|
|
56702
56746
|
2. Gere uma nova chave de API
|
|
56703
56747
|
3. Configure a nova chave em **Configurações > API**
|
|
56704
56748
|
|
|
56705
|
-
⚠️ **Importante:** Não compartilhe sua chave de API publicamente
|
|
56749
|
+
⚠️ **Importante:** Não compartilhe sua chave de API publicamente.`
|
|
56750
|
+
};
|
|
56706
56751
|
} else {
|
|
56707
56752
|
ue$1.error("Erro ao processar mensagem", {
|
|
56708
56753
|
description: "Verifique sua chave de API nas Configurações.",
|
|
56709
56754
|
duration: 4e3
|
|
56710
56755
|
});
|
|
56711
|
-
|
|
56756
|
+
novaMensagemParcial = {
|
|
56757
|
+
content: `**Erro ao processar sua mensagem**
|
|
56712
56758
|
|
|
56713
56759
|
${errorMessage}
|
|
56714
56760
|
|
|
56715
|
-
💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API
|
|
56761
|
+
💡 **Dica:** Verifique se sua chave de API está configurada corretamente em **Configurações > API**.`
|
|
56762
|
+
};
|
|
56716
56763
|
}
|
|
56717
56764
|
}
|
|
56718
56765
|
} else {
|
|
56719
56766
|
await new Promise((resolve) => setTimeout(resolve, 1e3 + Math.random() * 1e3));
|
|
56720
|
-
|
|
56767
|
+
const resultadoMock = gerarResposta(mensagemUsuario, customResponses);
|
|
56768
|
+
if (typeof resultadoMock === "string") {
|
|
56769
|
+
novaMensagemParcial = { content: resultadoMock };
|
|
56770
|
+
} else {
|
|
56771
|
+
novaMensagemParcial = resultadoMock;
|
|
56772
|
+
}
|
|
56721
56773
|
}
|
|
56722
56774
|
const novaMensagem = {
|
|
56723
56775
|
id: Date.now().toString() + "-ia",
|
|
56724
56776
|
type: "assistant",
|
|
56725
|
-
content:
|
|
56777
|
+
content: "",
|
|
56778
|
+
// Valor padrão se não vier no partial
|
|
56726
56779
|
timestamp: /* @__PURE__ */ new Date(),
|
|
56727
|
-
isFavorite: false
|
|
56780
|
+
isFavorite: false,
|
|
56781
|
+
...novaMensagemParcial
|
|
56728
56782
|
};
|
|
56729
56783
|
setConversas((prev) => prev.map((conv) => {
|
|
56730
56784
|
if (conv.id === conversaAtual) {
|
|
@@ -56732,7 +56786,7 @@ ${errorMessage}
|
|
|
56732
56786
|
return {
|
|
56733
56787
|
...conv,
|
|
56734
56788
|
mensagens: novasMensagens,
|
|
56735
|
-
ultimaMensagem:
|
|
56789
|
+
ultimaMensagem: (novaMensagem.content || "").substring(0, 50) + "...",
|
|
56736
56790
|
timestamp: (/* @__PURE__ */ new Date()).toLocaleString("pt-BR")
|
|
56737
56791
|
};
|
|
56738
56792
|
}
|