My advice is that of decomposing the engine in libraries designed with the principles of middlewares: fully decoupled, configurable, robust, reusable, testable. Then, build an entity/component framework at a higher level with a common API for creating, destroying, updating and synchronizing components of any type.
With that in mind, you would first develop an AI library with support for steering behaviours, waypoints, pathfinding etc. Have a look at commercial or open source AI libraries for inspiration. Among other things, the AI library is responsible for allocating, destroying, loading, saving and updating AI primitives. AI data and code, being fully decoupled, are optimal and do not suffer from the usual pitfalls of overly generic code.
Then, as part of the entity framework, you would have one component system per AI primitive: an AIAgentComponentSystem, an AIWaypointComponentSystem etc. These systems internally communicate with the AI library. They also synchronize AI components with other components like the TransformationComponent; coupling is at the entity level, not the library level.
In your case, an entity moving around the scene following a path could be configured as follows:
<entity name="player">
<component class="Transformation"/>
<component class="AIAgent"/>
<wayPoint>ID</wayPoint>
</component>
<component class="Mesh"/>
<component class="Script"/>
</entity>
The AIAgent component internally owns an AI Agent managed by the AI library. It syncs the agent position with the Transformation component which is then syncronized with the Mesh component for visualization. The Script component contains game logic and allows you to configure the pathfinding at run-time based on game events (i.e: switch pathfinding on/off or pass control to physics).
Then, if desirable, you would have an entity per AI waypoint:
<entity name="waypoint 0">
<component class="AIWayPoint">
<ID>423432423</ID>
<file>waypoint0.dat</file>
</component>
</entity>
Note that waypoints do not necessarily have to have an associated component if you do not need to manipulate them with the component API.
Please let me know if you need further clarifications as I've written this in a rush.