Skip to content

Audit Log — registro de ações na plataforma

Toda ação relevante executada no flow-ai-core é registrada na tabela audit_logs do PostgreSQL. O sistema cobre eventos de autenticação, CRUD de entidades administrativas e tarefas de sistema (retenção de logs).


Visão geral

AspectoDecisão
StorageTabela audit_logs no mesmo PostgreSQL
EscritaFire-and-forget (não bloqueia a operação principal)
RetençãoAUDIT_LOG_RETENTION_DAYS dias (padrão: 90)
AcessoPermissão RBAC audit_logs:read
ScopingGrupos com routerIds só veem logs do(s) seu(s) router(s)

Schema

prisma
model AuditLog {
  id         String           @id @default(cuid())
  action     AuditAction
  entityType AuditEntityType?
  entityId   String?
  actorId    String?
  actor      User?            @relation(...)
  routerId   String?          // sem FK — preservado após deleção do Router
  status     AuditStatus      @default(success)
  changes    Json?
  metadata   Json?
  createdAt  DateTime         @default(now())
}

changes

AçãoFormato
CREATESnapshot do objeto criado (sem campos sensíveis)
UPDATE{ campo: { from, to } } — só campos alterados
DELETESnapshot do objeto deletado (sem campos sensíveis)
Auth / sistemanull

Campos sensíveis nunca entram em changes (lista SENSITIVE_FIELDS em utils/audit.ts): password, passwordHash, tokenHash, accessTokenEncrypted, metaAppSecretEncrypted, encryptionPrivateKeyEncrypted, encryptionPassphraseEncrypted, apiKeyEncrypted, valueEncrypted. Além disso, buildChanges() ignora createdAt e updatedAt.

metadata

Para eventos HTTP contém { ip, userAgent }. Alguns eventos de auth também incluem email no metadata (falha de LOGIN e PASSWORD_CHANGE, onde ainda não há actorId). Null para eventos de sistema sem contexto HTTP (ex: RETENTION_CLEANUP).


Enum AuditAction

ValorQuando é emitido
LOGINLogin bem-sucedido ou com falha via /auth/login e /auth/desk-login
TOKEN_REFRESHRenovação de tokens via /auth/refresh
LOGOUTLogout via /auth/logout
PASSWORD_CHANGETroca de senha via /auth/password-recovery/validate
CREATECriação de entidade auditada
UPDATEAtualização de entidade auditada
DELETEDeleção de entidade auditada
PUBLISHPublicação de flow (POST /flows/:id/publish)
UNPUBLISHReservado no enum — ainda não é emitido por nenhuma rota
CAMPAIGN_DISPATCHEDReservado no enum — ainda não é emitido por nenhuma rota
RETENTION_CLEANUPLimpeza automática de logs expirados

Nota: UNPUBLISH e CAMPAIGN_DISPATCHED existem apenas no enum e no filtro do endpoint de consulta; nenhuma rota grava esses eventos hoje. PUBLISH é emitido de fato, mas somente para FLOW (não há publicação de tool auditada).


Enum AuditEntityType

Lista completa (verbatim do schema.prisma):

prisma
enum AuditEntityType {
  USER
  ROUTER
  WHATSAPP_NUMBER
  FLOW
  PUBLISHED_FLOW
  TOOL
  PUBLISHED_TOOL
  AGENT
  AGENT_GROUP
  AI_AGENT
  DEPARTMENT
  QUEUE
  LLM_CREDENTIAL
  INTEGRATION_SERVER
  INTEGRATION_SERVER_ENDPOINT
  MESSAGE_TEMPLATE
  CAMPAIGN
  SCRIPT_TEMPLATE
  SYSTEM_PROMPT
  GUARDRAIL
  FLOW_VARIABLE
  ROUTER_VARIABLE
  API_CLIENT
  WEBCHAT_CHANNEL
}

Entidades efetivamente instrumentadas

Apesar de o enum listar 24 tipos, hoje apenas quatro rotas gravam audit logs de CRUD:

entityTypeAções emitidasRota
USERCREATE, UPDATE, DELETEuser.routes.ts (PUT e PATCH ambos emitem UPDATE)
ROUTERCREATE, UPDATE, DELETErouter.routes.ts
FLOWCREATE, UPDATE, DELETE, PUBLISHflow.routes.ts
API_CLIENTCREATE, UPDATE, DELETEapi-client.routes.ts

Os demais entityType existem no enum (e são aceitos como filtro no endpoint de consulta), mas ainda não têm nenhuma rota que grave esses eventos.


Endpoint de consulta

GET /api/audit-logs

Permissão: audit_logs:read

Query params:

ParamTipoDescrição
actionenum AuditActionFiltra por tipo de ação
entityTypeenum AuditEntityTypeFiltra por tipo de entidade
actorIdstringFiltra por usuário que executou
routerIdstringFiltra por router
statussuccess | failureFiltra por resultado
fromISO 8601 datetimeData início
toISO 8601 datetimeData fim
cursorstring (cuid)Cursor para paginação
limitint 1–200Registros por página (padrão 50)

Resposta:

json
{
  "items": [
    {
      "id": "...",
      "action": "UPDATE",
      "entityType": "USER",
      "entityId": "...",
      "actorId": "...",
      "actor": { "id": "...", "name": "João", "email": "joao@..." },
      "routerId": null,
      "status": "success",
      "changes": { "name": { "from": "João", "to": "João Silva" } },
      "metadata": { "ip": "10.0.1.2", "userAgent": "Mozilla/..." },
      "createdAt": "2026-05-19T12:34:56.000Z"
    }
  ],
  "nextCursor": "clxxx..."
}

Scoping por router

Grupos RBAC com routerIds não vazios só enxergam audit logs cujo routerId está dentro do array. Admins (userRole=admin) e grupos globais veem tudo.


Retenção

O worker startAuditRetentionWorker roda em background no flow-ai-core via runPollingLoop. A cada hora executa dois ciclos de limpeza:

  1. audit_logs — deleta todos os registros com createdAt < now() - AUDIT_LOG_RETENTION_DAYS dias (padrão 90). Só quando remove pelo menos um registro (count > 0), grava um evento RETENTION_CLEANUP com changes = { deletedCount, cutoffDate } (sem actorId nem metadata).
  2. agent_turns — o mesmo worker também purga registros do AI Debugger com retenção fixa de 30 dias (AGENT_TURNS_RETENTION_DAYS). Essa limpeza não gera evento de audit log.
env
# Padrão: 90 dias (agent_turns usa 30 dias fixos)
AUDIT_LOG_RETENTION_DAYS=90

Arquivos relevantes

ArquivoPapel
packages/flow-ai-database/prisma/schema.prismaModelo AuditLog, enums AuditAction/EntityType/Status
packages/flow-ai-database/prisma/migrations/20260519000000_add_audit_logs/Migration que cria a tabela
services/flow-ai-core/src/services/audit-log.service.tsAuditLogServicewrite(), writeFromActor(), list()
services/flow-ai-core/src/utils/audit.tsextractActorContext(), buildChanges(), sanitizeEntity()
services/flow-ai-core/src/consumers/audit-retention.worker.tsWorker de retenção (poll a cada 1h)
services/flow-ai-core/src/http/routes/audit-log.routes.tsGET /audit-logs
services/flow-ai-core/src/services/factories/makeAuditLogService.tsFactory de DI do AuditLogService
services/flow-ai-core/src/http/routes/auth.routes.tsAudit de LOGIN/LOGOUT/TOKEN_REFRESH/PASSWORD_CHANGE
services/flow-ai-core/src/http/routes/user.routes.tsAudit de USER CREATE/UPDATE/DELETE
services/flow-ai-core/src/http/routes/router.routes.tsAudit de ROUTER CREATE/UPDATE/DELETE
services/flow-ai-core/src/http/routes/flow.routes.tsAudit de FLOW CREATE/UPDATE/DELETE/PUBLISH
services/flow-ai-core/src/http/routes/api-client.routes.tsAudit de API_CLIENT CREATE/UPDATE/DELETE

flow-ai — plataforma proprietária de atendimento via WhatsApp