Saltar al contenido principal

Modelo de dominio

El modelo de datos de Inbox Autónomo tiene nueve recursos de primer nivel más algunas tablas internas (tokens revocados, certificados de cliente revocados). Todo es multi-tenant por Workspace — cada fila pertenece a exactamente un workspace, y cada solicitud a la API se filtra automáticamente por el workspace derivado del claim sub del JWT.

Diagrama de relaciones​

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

Recursos de un vistazo​

RecursoPropósitoCiclo de vida
WorkspaceRaíz multi-tenant, refleja una cuenta KobanaCreado vía el hook de aprovisionamiento de kobana-app
InboxUna dirección de correo enrutable + política de procesamientoCreado vía API; se desactiva en lugar de eliminarse
EmailUn mensaje recibido + estado de procesamientoCreado por la ingesta de SES o por POST /emails
AgentUna configuración de LLM (modelo, system prompt, skills)Creado vía API
AgentRunUna única ejecución de un agente sobre un correoCreado por el worker; solo lectura vía API
WebhookUna suscripción a uno o más slugs de SystemEventCreado vía API
WebhookDeliveryUn intento de hacer POST de un payload de webhookCreado por el dispatcher; solo lectura vía API
SystemEventUn registro inmutable de un evento de dominioEmitido por handlers/workers; solo lectura vía API

Campos compartidos​

Todo recurso expone:

CampoTipoNotas
idUUID v4Identificador interno.
created_atISO 8601Establecido en la creación.
updated_atISO 8601Actualizado por Prisma en cada cambio.
deleted_atISO 8601 | nullMarcador de soft-delete.

Algunos recursos exponen adicionalmente:

CampoTipoNotas
external_idUUID v4Identificador estable del sistema de origen (Workspace, Inbox, Agent).
metadataJSONMetadata gestionada por el sistema.
custom_metadataJSONFormato libre, nunca inspeccionado por el sistema.

Soft delete​

Los recursos que admiten eliminación son soft-deleted: se establece deleted_at, pero la fila permanece en Postgres. Las queries filtran por WHERE deleted_at IS NULL mediante un middleware de Prisma. Recrear una fila que entra en conflicto con una soft-deleted (p. ej. el mismo email en Inbox) devuelve 409 conflict — restaura el original vía herramientas internas en lugar de recrearlo.

Idempotencia y unicidad​

RecursoConstraint único
Workspaceexternal_id
Inboxemail (global, no por workspace)
Emailmessage_id (el messageId del SES)
Agentexternal_id
Webhook— (el label no es único)

La unicidad de Email.message_id es lo que hace idempotente al handler de ingesta de SES: SNS puede reintentar la misma notificación, pero el segundo insert choca con la unique constraint y el handler devuelve 200 de inmediato.