Sokomine,
If you've managed to get an NPC to a door, the NPC must be given knowledge that there is a door there to then open. As such, the NPC must scan for usable objects, in this case a door, in order to be able to use said door.
Given your example above, once at the door, scan for usable objects (ie, the door), open the door, go through the door, (ie, walk the two/three blocks to ensure that NPC is on other side of door, then close the door. Once the NPC is inside, a concept that is unknowable to the NPC, then simply limit it's pathfinding to the area in question.
To get your NPC from outside the door, to inside, and then to bed, the only logical method is to limit the NPC's pathfinding to the building in which you are trying to get the NPC to enter. What I mean here, is that the NPC's pathfinding algorithm should not have access to the entirety of the world, but the limited space within which you are trying to get the NPC to navigate.
Dijkstra's algorithm does not use an infinite space, but a limited space. My guess, is that by limiting the area to navigate, you could easily get an NPC to navigate any number of random buildings, simply by limiting the NPC's ability to navigate within said building. Stairs become self evident to an NPC in this way, since the only way to get from ground level to any higher level within the building would be to use the stairs, even though the NPC has no concept of "stairs". The stairs only become a path from one level to the next. This also prevents the NPC programmer from having to hard code knowledge of said stairs, or any other concept for which the NPC would not learn.
AITechEye's
aliveai could easily then be used. Consider that you create a task/mission/job for the aliveai NPC's that is simply to use any given item, such as a door, chest, or even your own
citybuilder constructor objects. NPC's would need to learn how to use any given item/object, especially those item/objects that require more than just a punch to operate, like the simple door. Your citybuilder constructor objects would certainly need a mildly complex line of thinking for an NPC to navigate and understand.
Having played with your mg_villages and citybuilder mods, AITechEye's aliveai mod, and theFox's working_villages mod, this seems to become the only real solution.
My experiences with NPC's and navigating open worlds was to use named locations. Once at a named location, the NPC would scan the area for objects deemed usable for that area, so if inside a pub, the NPC would scan for chairs to sit, but if inside a factory, it would scan for usable machines. The NPC has no concept of, or knowledge of, it's current location, ie, that it is in a pub or factory. The NPC only knows that at a given location, there are only certain objects with which it should interact. In this way, multiple NPC's actually only interact with the objects with which it has knowledge at any given location. So the "customer" NPC uses a chair to sit down at the pub, but the server NPC does not use any of the chairs, instead using only those objects with which it should interact.
This also allows burli to focus on the pathfinding, while others can focus on the NPC's, and still others, on village building.