code: function FocusManager(options, components) {
    options = options || {};
  
    this._document = components.document || document;
    this._requisition = components.requisition;
  
    this._debug = options.debug || false;
    this._blurDelay = options.blurDelay || 150;
    this._window = this._document.defaultView;
  
    this._requisition.commandOutputManager.onOutput.add(this._outputted, this);
  
    this._blurDelayTimeout = null; // Result of setTimeout in delaying a blur
    this._monitoredElements = [];  // See addMonitoredElement()
  
    this._isError = false;
    this._hasFocus = false;
    this._helpRequested = false;
    this._recentOutput = false;
  
    this.onVisibilityChange = util.createEvent('FocusManager.onVisibilityChange');
  
    this._focused = this._focused.bind(this);
    this._document.addEventListener('focus', this._focused, true);
  
    eagerHelper.onChange.add(this._eagerHelperChanged, this);
  
    this.isTooltipVisible = undefined;
    this.isOutputVisible = undefined;
    this._checkShow();
  }
docs: FocusManager solves the problem of tracking focus among a set of nodes.
  The specific problem we are solving is when the hint element must be visible
  if either the command line or any of the inputs in the hint element has the
  focus, and invisible at other times, without hiding and showing the hint
  element even briefly as the focus changes between them.
  It does this simply by postponing the hide events by 250ms to see if
  something else takes focus.
  @param options Object containing user customization properties, including:
  - blurDelay (default=150ms)
  - debug (default=false)
  @param components Object that links to other UI components. GCLI provided:
  - document
  - requisition