ai_foundActionSequence = function (rootNode) {
  const { gameId } = rootNode;

  // pick highest scoring sequence
  Logger.module('AI').debug(`ai_foundActionSequence() -> *Master:* Selecting best sequence out of ${rootNode.evaluatedSequences.length} sequences.`);
  const sequence = _.max(rootNode.evaluatedSequences, (sequence) => sequence.score);
  Logger.module('AI').debug(`ai_foundActionSequence() -> *Master:* Sequence selected with score = ${sequence.score} and # of actions = ${sequence.actions.length}`);
  Logger.module('AI').debug('ai_foundActionSequence() -> *Master:* ', sequence.actions);
  // clear queue of matching game sessions
  if (ai_cluster_evaluationQueue.length > 0) {
    ai_cluster_evaluationQueue = _.reject(ai_cluster_evaluationQueue, (gameSession) => getGameId(gameSession) == gameId);
  }

  // delete root node from record
  delete ai_cluster_rootNodesByGameId[gameId];

  // delete resolve from record
  const resolve = ai_cluster_findActionSequenceResolveByGameId[gameId];
  delete ai_cluster_findActionSequenceResolveByGameId[gameId];

  // resolve with best sequence and root node
  resolve({
    sequence,
    rootNode,
  });
}
Called when a best action sequence is found and triggers the find action sequence resolve.
NOTE: passes resolve a results object consisting of {sequence: sequence object, rootNode: root node object}
@param {Object} rootNode