Pular para o conteúdo principal

Modelo de domínio

O modelo de dados do Inbox Autônomo tem nove recursos first-class mais algumas tabelas internas (tokens revogados, certs cliente revogados). Tudo é multi-tenant por Workspace — toda linha pertence a exatamente um workspace, e toda requisição da API é automaticamente filtrada pelo workspace derivado do claim sub do JWT.

Diagrama de relacionamentos​

Workspace
│
┌───────────┬─────────┼─────────┬───────────┐
▼ ▼ ▼ ▼ ▼
Inbox Email Agent Webhook SystemEvent
│ │ │ │
│ │ │ └── WebhookDelivery
│ │ │
│ └── AgentRun ──┘
│
└── (Agent associado opcional)

Recursos em resumo​

RecursoPropósitoCiclo de vida
WorkspaceRaiz multi-tenant, espelha uma conta KobanaCriado via hook de provisionamento do kobana-app
InboxEndereço de e-mail roteável + política de processamentoCriado via API; desativado em vez de deletado
EmailMensagem recebida + estado de processamentoCriado pela ingestão SES ou por POST /emails
AgentConfiguração de LLM (modelo, system prompt, skills)Criado via API
AgentRunUma execução de um agente sobre um e-mailCriado pelo worker; read-only via API
WebhookAssinatura para um ou mais slugs de SystemEventCriado via API
WebhookDeliveryUma tentativa de POST de payload de webhookCriado pelo dispatcher; read-only via API
SystemEventRegistro imutável de um evento de domínioEmitido por handlers/workers; read-only via API

Campos compartilhados​

Todo recurso expõe:

CampoTipoNotas
idUUID v4Identificador interno.
created_atISO 8601Definido na criação.
updated_atISO 8601Atualizado pelo Prisma em cada mudança.
deleted_atISO 8601 | nullMarcador de soft-delete.

Alguns recursos adicionalmente expõem:

CampoTipoNotas
external_idUUID v4Identificador estável do sistema de origem (Workspace, Inbox, Agent).
metadataJSONMetadata gerenciada pelo sistema.
custom_metadataJSONFree-form, nunca inspecionada pelo sistema.

Soft delete​

Recursos que suportam deleção são soft-deletados: deleted_at é setado, mas a linha permanece no Postgres. Queries filtram por WHERE deleted_at IS NULL via middleware Prisma. Tentar criar um recurso que conflita com um soft-deletado (ex.: mesmo email em Inbox) retorna 409 conflict — restaure o original via tooling interno em vez de recriar.

Idempotência e unicidade​

RecursoConstraint unique
Workspaceexternal_id
Inboxemail (global, não por-workspace)
Emailmessage_id (o messageId do SES)
Agentexternal_id
Webhook— (label não é unique)

A unicidade de Email.message_id é o que torna o handler de ingestão SES idempotente: o SNS pode reentregar a mesma notificação, mas o segundo insert bate na unique constraint e o handler retorna 200 imediatamente.