Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Painel Gerencial de Operações de Suporte - PrefTech. Identificação imediata de prioridades operacionais, SLAs e gargalos.
Translation pending
BusinessTypeScript · CSSGitHub @LucasNegrin1OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Desafio: resolver mais tickets, mais rápido, com tickets melhores desde a abertura.
O PrefTech junta duas peças:
| Objetivo do desafio | Como o PrefTech ataca | Indicador |
|---|---|---|
| Menos tickets | O bot tenta resolver pela base de conhecimento antes de abrir chamado. | atendimentos resolvidos sem ticket |
| Abertura melhor | O bot segue um checklist por categoria (incluindo impacto e prazo) e só abre o ticket com tudo preenchido e confirmado. | pedidos de complemento, resolução na 1ª análise |
git clone https://github.com/LucasNegrin1/HackathonAprova.git
cd HackathonAprova
npm install
Modo A, demonstração (sem nenhuma conta): pule para o passo 6. O painel mostra chamados de exemplo, e o bot faz o roteiro completo com regras por palavras-chave. Os tickets recebem um protocolo, mas não aparecem no painel, porque não há banco.
Modo B, completo (recomendado): faça os passos 4 e 5. São duas contas gratuitas: Supabase (banco) e Groq (IA do bot).
cp .env.example .env.local (no Windows: copy .env.example .env.local).GROQ_API_KEY no .env.local.Sem essa chave, o bot também funciona, mas define título e prioridade por palavras-chave e não sugere o texto melhorado.
.env.local, preencha:
NEXT_PUBLIC_SUPABASE_URL: em Project Settings > Data API (ex.: https://xxxx.supabase.co);NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY e SUPABASE_SECRET_KEY: em Project Settings > API Keys;SUPABASE_ACCESS_TOKEN: crie em https://supabase.com/dashboard/account/tokens.node --env-file=.env.local scripts/aplicar-sql.mjs supabase/migrations/20261024120000_fluxo_triagem.sql supabase/migrations/20261024130000_sugestao_agente.sql supabase/migrations/20261024140000_rebaixar_somente_na_fila.sql supabase/migrations/20261024150000_tipo_ajuste.sql supabase/migrations/20261024160000_dominios_email.sql supabase/seed.sql
Cada arquivo deve responder OK. Alternativa sem token: abra o SQL Editor do Supabase e rode cada arquivo de supabase/migrations/, na ordem do nome, e depois supabase/seed.sql.
node --env-file=.env.local scripts/importar-planilha.mjs tickets_suporte_150_balanceado.xlsx
npm run dev
Abra http://localhost:3000.
| Comando | Para quê |
|---|---|
npm run dev | Rodar em desenvolvimento |
npm run build e npm start | Rodar a versão de produção |
npm run test:db | Testar as regras do banco num Postgres em memória (não precisa de Supabase) |
npm run lint | Verificar o código |
.env.local estão vazias ou erradas. Reinicie o npm run dev depois de editar o arquivo.Roteiro fixo, conduzido pelo código (lib/fluxo.ts):
data-conta no widget, esta etapa é pulada.lib/catalogo.ts):
O prompt do modelo é o INSTRUCTIONS.md, com a definição de cada prioridade.
Modelo: usa o primeiro provedor com chave: XAI_API_KEY (Grok), GROQ_API_KEY (Groq, openai/gpt-oss-120b, com gpt-oss-20b e qwen3.8-27b de reserva quando estoura o limite gratuito) ou ANTHROPIC_API_KEY (Claude).
Em outros sites: o mesmo bot pode ser instalado no site de uma prefeitura com uma linha. data-conta fixa a conta do ticket:
<script src="https://SEU_HOST/widget.js" data-conta="Valfenda" async></script>
Componentes e CSS do projeto PrefTech Front Engine (React + Vite), trazidos para o Next.js. Os dados vêm de /api/gestao (lib/gestao.ts). Se a API falhar, o painel volta para o mock (data/mockSupportData.ts) e avisa.
| Painel | Supabase |
|---|---|
| Prioridade, conta, categoria, status, responsável | colunas de chamados |
| Parado há X dias | dias desde ultima_movimentacao_em |
| SLA restante | prazo da próxima ação desde a última movimentação: P1 4h, P2 8h, P3 24h, P4 72h (SLA_HORAS em lib/gestao.ts) |
| Backlog de produto / Vinculado a pai | status backlog_produto (sem SLA) / vinculado com o protocolo do pai |
| Revisão do gestor | P1 acima da cota (com justificativa) ou chamado escalado por estar parado |
| Sem prioridade (—) | chamado que veio sem prioridade definida da origem |
| Equipe | nomes, cargos e capacidade do cadastro do painel; contagens calculadas da fila real |
app/(preftech)/ # página inicial (/)
├── layout.tsx, page.tsx # fontes via next/font, escopo .preftech-root e o script do bot
├── App.tsx # casca do painel (ranking gerencial e filtros)
├── components/support/ # Sidebar, MetricsTopCards, PriorityTable, TeamWorkloadPanel, PendingIssuesSection
├── data/mockSupportData.ts # tipos do painel + dados de exemplo (fallback)
├── styles/tokens.css, index.css # design system; tokens e resets escopados em .preftech-root
└── engine/, components/views/ # Front Engine (Canvas, Schema JSON, Telemetria): ainda não roteado
app/widget/ # chat do bot (aberto pelo public/widget.js)
app/api/chat, app/api/gestao # bot e dados do painel
Os estilos do Vite (:root, html, body, button) foram escopados em .preftech-root. O Front Engine veio intacto, mas ainda sem rota. Como o lint dele era o oxlint, essas pastas estão fora do eslint.
As migrations em supabase/migrations/ implementam o fluxo do suporte no Postgres. As regras rodam em triggers e valem para qualquer cliente.
| Etapa | No banco |
|---|---|
| Chamado aberto (cliente informa impacto e prazo) | chamados.impacto_informado, prazo_informado |
| Sugestão ou nova parametrização → backlog | triar_chamado(id, 'sugestao' | 'parametrizacao') |
| Parecido com chamado aberto → vincular ao pai | vincular_chamado(filho, pai). O volume do grupo soma ao impacto (3+ vinculados = +1, 10+ = +2) |
| Impacto × urgência → P1 a P4 | trigger + tabela matriz_prioridade (editável) |
| Conta acima da cota de P1 | erro COTA_P1_EXCEDIDA, resolvido com rebaixar_p1() ou justificativa_p1 |
| Fila ordenada por prioridade | view fila_atendimento |
| Parado há mais de 10 dias | view chamados_parados + escalar_parados() |
| Resolver fecha os vinculados em lote | resolver_chamado(id, solucao) |
npm run test:db (Postgres em memória).node --env-file=.env.local scripts/aplicar-sql.mjs supabase/migrations/*.sql supabase/seed.sql (precisa de SUPABASE_ACCESS_TOKEN).node --env-file=.env.local scripts/importar-planilha.mjs tickets_suporte_150_balanceado.xlsx. Importa os 150 chamados fictícios pelas regras do banco e pode rodar de novo, porque substitui a importação anterior.data/db.json (memória + arquivo). Os tickets já ficam no Supabase.