Let's start with the simplest part.
Create a CharacterController node. It uses a controlled_character variable to decide what character node is being controlled. It issues action commands to the controlled_character. Make one for each controller detected.
Create a CharacterAI node that uses a goal-oriented finite state machine to select the next action command(s).
Each character nodes decide how to do those action commands (they might ignore the command if they can't do the action).