Línea de tiempo del contacto, tareas vinculadas y extracción de datos con IA
Tres cosas nuevas en el dominio de contactos, todas aditivas:
GET /contacts/{id}/timeline(contacts:read,met.contacts.timeline()): la historia del contacto en una sola lista — cambios de campo, eventos de sistema (estado, asignación), notas internas y tareas de seguimiento. Cada entrada trae untypediscriminador (field_change,system_event,note,task,contact_created), así que no hay que inferir nada de la forma del dato. No incluye los mensajes de la conversación: para eso estámessages(). Cursor:before=created_atde la última entrada recibida.- Tareas vinculadas al contacto:
POST /workspaces/{ws}/tasksaceptacontact_id, yGET /workspaces/{ws}/tasks?contact_id=devuelve las de un contacto. La respuesta sigue siendo un array plano — no cambiamos la forma de un endpoint ya publicado. Las tareas traen responsable, fecha límite, pasos y comentarios del módulo de Tareas: no hay entidad nueva. POST /contacts/{id}/extract(contacts:write): completa con IA los campos vacíos del contacto con lo que se dijo en la conversación. Dos cosas importantes: consume energía (aparece en tu ledger comocrm_extraction) y es fill-only — nunca pisa un dato existente. Está apagada por defecto: si el workspace no la habilitó en Ajustes, el endpoint devuelvefilled: []sin llamar al modelo ni cobrarte.
También, si construiste automatizaciones: se retiró del catálogo el disparador contact.status_changed. Estaba deshabilitado y ningún evento lo emitía nunca — no se podía usar, así que no hay nada que migrar. Para reaccionar a un cambio de estado o de etapa, usa contact.field_updated con el campo correspondiente ($status o etapa), que funciona hoy.