Seems like a lot of the classes can be used for the same thing another class is supposed to be useful for and these a kinda overloading of operations.... Like for example it seems that a QueryRouterEngine can also just act exactly as an Agent. That is because it kinda is an agent with maybe some exatra tooling? Seems to make things kinda hard to reason about without really getting into the code of the API.