code: def add(self, logdir: str, save: bool, root_dir: str) -> None:
      logdir = util.to_forward_slash_path(logdir)
      root_dir = util.to_forward_slash_path(root_dir)
      if logdir in self._logdirs:
          return
      namespace = self._calculate_namespace(logdir, root_dir)
      # TODO(jhr): implement the deferred tbdirwatcher to find namespace
  
      if not self._consumer:
          self._consumer = TBEventConsumer(
              self, self._watcher_queue, self._run_proto, self._settings
          )
          self._consumer.start()
  
      tbdir_watcher = TBDirWatcher(
          self,
          logdir,
          save,
          namespace,
          self._watcher_queue,
          self._force,
      )
      self._logdirs[logdir] = tbdir_watcher
      tbdir_watcher.start()
  
imports: import glob
  import logging
  import os
  import queue
  import socket
  import sys
  import threading
  import time
  from typing import TYPE_CHECKING, Any, Dict, List, Optional
  import wandb
  from wandb import util
  from wandb.sdk.interface.interface import GlobStr
  from wandb.sdk.lib import filesystem
  from wandb.viz import CustomChart
  from .None import run
label_desc: Use image node_id 3 for calling the TBWatcher obj's underlying member method code with example usage: obj.add(logdir, save, root_dir) without return types