Agrega detalle_tarea al agente de Telegram y doc comercial de uMind

- El bot solo tenía listar_tareas (resumen: título/estado/prioridad),
  sin forma de pedir la descripción completa ni el historial de
  comentarios de una tarea puntual. Nuevo tool detalle_tarea trae la
  tarea completa + comentarios (autor, contenido, adjuntos, fecha).
- UMIND_CASOS_DE_USO.html: documento comercial con casos de uso por
  tipo de negocio, argumentos de venta y límites actuales del
  producto, para ofrecer uMind a clientes.
This commit is contained in:
Lizandro GD
2026-08-07 16:24:43 +00:00
parent 5ee5880dc2
commit 4b9d4a9a5b
2 changed files with 299 additions and 1 deletions
+21 -1
View File
@@ -342,10 +342,14 @@ func agentTools() []agentTool {
}, []string{"ticket_id", "mensaje"})),
// ── Tareas ───────────────────────────────────────────────────────────
tool("listar_tareas", "Lista tareas del Kanban.",
tool("listar_tareas", "Lista tareas del Kanban (resumen: título, estado, prioridad, asignado — sin descripción completa ni historial de comentarios). Para ver el detalle completo de una tarea puntual usa detalle_tarea.",
obj(map[string]agentToolParam{
"estado": str("pendiente | en_progreso | completada | cancelada"),
}, nil)),
tool("detalle_tarea", "Trae el detalle completo de una tarea puntual: descripción completa y el historial de comentarios/interacciones (quién comentó, qué dijo, cuándo, y archivos adjuntos si los hay). Úsala cuando el usuario pida el cuerpo, la descripción o el historial de una tarea específica — listar_tareas no trae eso.",
obj(map[string]agentToolParam{
"id": num("ID de la tarea (usa listar_tareas si no lo sabes)"),
}, []string{"id"})),
tool("listar_usuarios", "Lista los usuarios internos del sistema (staff), para poder asignarles tareas.",
obj(map[string]agentToolParam{"search": str("Búsqueda por nombre")}, nil)),
tool("crear_tarea", "Crea una nueva tarea, opcionalmente asignada a alguien desde el inicio.",
@@ -1003,6 +1007,21 @@ func runTool(chatID int64, name string, a map[string]interface{}) (interface{},
}
return filtered, nil
case "detalle_tarea":
id := uint(getInt("id", 0))
if id == 0 {
return nil, fmt.Errorf("id requerido")
}
tarea, err := models.GetTareaByID(id)
if err != nil {
return nil, fmt.Errorf("tarea no encontrada: %w", err)
}
comentarios, err := models.GetComentariosByTarea(id)
if err != nil {
return nil, err
}
return map[string]interface{}{"tarea": tarea, "comentarios": comentarios}, nil
case "listar_usuarios":
users, _, err := models.AllUsersSistema(50, 0, getStr("search"))
if err != nil {
@@ -1514,6 +1533,7 @@ COMPORTAMIENTO:
Si logras identificar los datos necesarios (del documento o de lo que escribió el usuario), guarda directamente sin pedir confirmación — solo pregunta si de verdad no hay forma de determinar el cliente/proyecto/tarea o falta un dato imprescindible. No uses estas tools si el mensaje no menciona ningún documento adjunto
- Para registrar un proyecto nuevo con sus fases (el usuario puede describirlo en texto o mandarlo en un documento), primero usa crear_proyecto y luego llama a crear_fase_proyecto una vez por cada fase que corresponda — no hace falta preguntar confirmación entre cada fase
- Para asignar una tarea a alguien, resuelve el nombre con listar_usuarios y usa asignado_id en crear_tarea (si es nueva) o asignar_tarea (si ya existe) — la persona asignada recibe una notificación. Si además el usuario mandó un archivo junto con la instrucción de asignar, después de crear/asignar la tarea usa también adjuntar_documento_tarea para guardar ese archivo en la tarea
- Si preguntan por el detalle, la descripción completa o el historial/comentarios de una tarea específica, usa detalle_tarea (no listar_tareas, que solo da un resumen sin eso) — resuelve el id con listar_tareas primero si hace falta
COMANDOS ESPECIALES (el usuario puede escribirlos):
- /reset — olvidar el historial de esta conversación