I tend to subscribe to the theory that an entity is somewhat abstract and in the general sense doesn't really have much of any logic. If anything, an entity often exists as a wrapper around a complex set of systems that deliver specialized behavior based on outside factors.
For example, two entities are constructed in the same way but one perhaps has an AIController where-as the other has a PlayerController. The two different controller components dictate which systems the entity is controlled by.
In the case of the player, input from the keyboard/mouse get translated into actions and the player system reacts by setting appropriate MovementComponent attributes on the entity that has a PlayerController.
In the case of the AI, the various AI systems dispatch actions and the AI system reacts by setting appropriate MovementComponent attributes on the entity in which the AI logic is running for.
At this point, a seperate system is responsible for interpretating the information on the MovementComponent and causing the entity to actually move in the world simulation.
This very easily lends itself to situations where a player controlled entity may loose control of their entity due to some fear or mind control affect and now be controlled by some AI temporarily or allows a player to temporarily mind control an AI based entity for their own bidding all by simply swapping the controller being used on a given entity.
Want to add networking? Now you might introduce a NetworkController which takes input from network packets from the game server, sets appropriate entity state, and the movement system begins to navigate those entities in the world simulation.
Sometimes adding a single layer of indirection (such as the movement system above) can easily help decouple code and all the while provide a very flexible way to introduce additional behaviors or alter behaviors in the future without severe system impact.