Pular para o conteúdo

Visão Geral da Arquitetura

O Juca segue uma arquitetura de hub — um frontend enxuto com um orquestrador leve que delega a inteligência de backend a agentes externos. A interface é composta inteiramente de Blocks tipados renderizados em um WorkCanvas.

O Juca é construído sobre cinco padrões principais:

PadrãoImplementaçãoFinalidade
Server Components + Server ActionsNext.js 16 App RouterBusca de dados e mutações sem gerenciamento de estado no cliente
Block System11 tipos de block, funções factoryComposição uniforme de UI — todo conteúdo é um Block
Tool Registrysrc/lib/unified/tools/Direciona intenções do usuário para funções handler especializadas
Adapter Patternsrc/lib/adapters/ (planejado)Interface unificada para chamar qualquer agente backend (Valter, Leci, futuros)
Feature Flagssrc/lib/featureFlags.tsRollout progressivo de funcionalidades via parâmetros de URL ou localStorage

A arquitetura pré-pivô era um monolito fullstack onde o Juca continha seu próprio motor de busca, pipeline de LLM, grafo de conhecimento e lógica de validação. Esse backend está sendo migrado para a API Valter, deixando o Juca como um hub frontend enxuto.

graph TB
subgraph "Frontend — React 19"
AppShell["AppShell"]
Sidebar["SessionSidebar"]
PhaseRail["PhaseRail"]
Canvas["WorkCanvas"]
Composer["Composer"]
Blocks["Block Components<br/>(11 tipos)"]
SlideOver["SlideOver<br/>(visualizador Integra)"]
end
subgraph "Camada de Servidor — Next.js 16"
Actions["Server Actions<br/>briefing · sessão · mensagem"]
Routes["Rotas de API<br/>(~55 endpoints)"]
SSE["SSE Stream<br/>/api/v2/stream"]
Auth["NextAuth v5<br/>Google OAuth + E-mail"]
end
subgraph "Orquestração"
Intent["Detector de Intenção"]
Tools["Tool Registry<br/>juris · ratio · analyzer<br/>compare · insights"]
Clarify["Política de Clarificação"]
end
subgraph "Agentes Externos"
Valter["Valter API<br/>Jurisprudência STJ<br/>Busca · KG · LLM · Verificação"]
Leci["Leci API<br/>Legislação Federal<br/>(futuro)"]
end
subgraph "Camada de Dados"
SQLite["SQLite<br/>Sessões · Blocks"]
end
AppShell --> Sidebar
AppShell --> PhaseRail
AppShell --> Canvas
Canvas --> Blocks
Canvas --> Composer
Canvas --> SlideOver
Composer --> Actions
Actions --> Intent
Intent --> Clarify
Intent --> Tools
Tools -->|"REST API"| Valter
Tools -.->|"REST API (futuro)"| Leci
Tools --> SSE
Actions --> SQLite
SSE --> Canvas
Auth --> Actions
Auth --> Routes

O Juca possui seis pontos de entrada na aplicação:

Ponto de EntradaLocalizaçãoFinalidade
Web Appsrc/app/page.tsxServer Component que carrega sessões e renderiza AppClient
Rotas de APIsrc/app/api/*/route.ts~55 endpoints REST (muitos transitórios, migrando para o Valter)
SSE Streamsrc/app/api/v2/stream/route.tsStreaming de progresso em tempo real via Server-Sent Events
Server Actionssrc/actions/Mutações de briefing, sessão, mensagem e recalculação
Instrumentaçãosrc/instrumentation.tsPré-aquece caches (KG, Corpus, BM25) + configuração de OTel na inicialização
Dockerscripts/entrypoint.shBootstrap do container para deploy no Railway

Uma interação típica de usuário segue este caminho:

Usuário digita consulta no Composer
→ Server Action recebe o input
→ Detector de Intenção classifica a consulta
→ Tool Registry seleciona o handler (ex.: JurisTool, AnalyzerTool)
→ Tool chama a REST API do Valter (/v1/retrieve, /v1/verify, etc.)
→ Resposta transformada pelo Block Factory
→ createDiagnosisData(), createPrecedentData(), etc.
→ Blocks persistidos no SQLite via getBlocksDB().addBlock()
→ SSE transmite eventos de block para o cliente
→ WorkCanvas renderiza os novos blocks em tempo real

Com o pivô para hub, as responsabilidades ficam claramente divididas:

ResponsabilidadeDonoObservações
Renderização de UIJuca (React 19)Block System, WorkCanvas, Composer
Persistência de sessãoJuca (SQLite)Sessões, blocks, preferências do usuário. Migrará para Postgres.
OrquestraçãoJuca (leve)Detecção de Intenção, Tool Registry, Política de Clarificação
SSE streamingJucaProgresso em tempo real via /api/v2/stream
AutenticaçãoJucaNextAuth v5 (Google OAuth + magic links)
Busca jurídicaValter/v1/retrieve, /v1/similar_cases
Processamento LLMValterPipeline multi-modelo Gerar → Criticar → Revisar
Grafo de ConhecimentoValter/v1/graph/* (Neo4j Aura, 28,5K nós, 207K arestas)
Verificação de citaçõesValter/v1/verify
Legislação federalLeci (futuro)Ainda não disponível — apenas schema do banco

A arquitetura reflete várias decisões deliberadas. Veja os Architecture Decision Records para contexto completo:

DecisãoEscolhaJustificativa
Hub frontend em vez de monolitoHub + agentes externosEvitar duplicar as capacidades do Valter no Juca
Block System em vez de painéis11 blocks tipadosComposição uniforme, mais fácil de testar, funciona com SSE
SQLite em vez de PostgresSQLite por enquantoZero configuração para dev solo; migrar na v0.6+
Server Actions em vez de chamadas de APINext.js Server ActionsMenos saltos de rede, auth integrado, TypeScript end-to-end
Tailwind v4 CSS-firstDesign tokens em globals.cssAlinhado com as boas práticas do Tailwind v4