Pular para o conteúdo

Gerenciamento de Sessão

Toda conversa no Juca é uma sessão — um contêiner persistente de blocos ordenados. As sessões são armazenadas no SQLite, listadas na SessionSidebar e carregadas no WorkCanvas.

Uma sessão é composta por:

CampoTipoPropósito
idTEXT (PK)Identificador único da sessão
user_idTEXTDono da sessão
titleTEXTTítulo de exibição (gerado automaticamente ou definido pelo usuário)
statusTEXTEstado da sessão
created_atTEXTTimestamp de criação
updated_atTEXTTimestamp da última modificação
message_countINTEGERNúmero de mensagens/blocos
metadataTEXT (JSON)Estado de fase, preferências, etc.

As sessões contêm mensagens (blocos) em uma tabela filha:

CampoTipoPropósito
idTEXT (PK)Identificador do bloco
session_idTEXT (FK)Sessão pai (deleção em CASCADE)
roleTEXTPapel do bloco (user, assistant, system)
contentTEXTConteúdo do bloco (JSON)
timestampTEXTHora de criação
metadataTEXT (JSON)Tipo do bloco, fase, etc.

As operações de sessão são centralizadas em src/lib/db/sessions.ts (classe SessionsDB):

// Configuração do banco de dados
const db = new Database(process.env.SQLITE_PATH || './data/juca.db');
db.pragma('journal_mode = WAL'); // Write-Ahead Logging para concorrência
db.pragma('foreign_keys = ON'); // Impõe integridade referencial

Todo acesso a sessões de outras partes do código passa por este módulo — acesso direto ao SQLite a partir de componentes ou rotas de API não é permitido.

O componente SessionSidebar (src/components/shell/SessionSidebar.tsx) exibe o histórico de sessões do usuário:

  • Lista sessões ordenadas por updated_at DESC
  • Exibe título, data e status de fase para cada sessão
  • Clicar carrega os blocos da sessão no WorkCanvas
  • Suporta a criação de novas sessões

As mutações de sessão acontecem por meio de Server Actions em src/actions/:

Arquivo de ActionFunções PrincipaisPropósito
session.tsCriar, carregar, deletar sessõesOperações CRUD
briefing.tsTransições de fase, avaliaçõesEstado específico do Briefing
message.tsAdicionar mensagens/blocosCriação de conteúdo

Todas as actions usam requireActionAuth() de src/actions/utils.ts:

// Toda server action começa com autenticação
const user = await requireActionAuth();
// Em modo dev (ENABLE_DEV_AUTH=true), retorna:
// { id: 'dev-user', email: 'dev@localhost', name: 'Dev User', role: 'admin' }