          self.command = None
          self.args = None
          self.process = None
          self.train_stats = {"iterations": 0, "timestamp": None}
          self.consoleregex = {
              "loss": re.compile(r"([a-zA-Z_]+):.*?(\d+\.\d+)"),
              "tqdm": re.compile(r"(?P<dsc>.*?)(?P<pct>\d+%).*?(?P<itm>\S+/\S+)\W\["
                                 r"(?P<tme>\d+:\d+<.*),\W(?P<rte>.*)[a-zA-Z/]*\]"),
 
</s> remove         time_stats = {sess_id: {"start_time": min(timestamps),
                                "end_time": max(timestamps),
                                "datapoints": len(timestamps)}
 </s> add         time_stats = {sess_id: {"start_time": min(timestamps) if timestamps else 0,
                                "end_time": max(timestamps) if timestamps else 0,
                                "datapoints": len(timestamps) if timestamps else 0} </s> remove             return
 </s> add             return None
        self.thread = None  # Thread for LongRunningTask termination
          self.command = None
          self.args = None
          self.process = None
        self.thread = None  # Thread for LongRunningTask termination
          self.train_stats = {"iterations": 0, "timestamp": None}
          self.consoleregex = {
              "loss": re.compile(r"([a-zA-Z_]+):.*?(\d+\.\d+)"),
              "tqdm": re.compile(r"(?P<dsc>.*?)(?P<pct>\d+%).*?(?P<itm>\S+/\S+)\W\["
                                 r"(?P<tme>\d+:\d+<.*),\W(?P<rte>.*)[a-zA-Z/]*\]"),
keep keep add keep keep keep keep keep
 GUI responsiveness and feature updates

- Add error handling to LongRunningTask
- Analysis: Fix timestats bug for missing session data
- Training: Update training graph inside LongRunningTask
- Training: Smoothing Amount Slider geometry fix
- Training: Auto update Analysis tab on training start and save interval
- Scripts: Keep control of the UI when terminating by terminating using LongRunningTask 
lib/gui/wrapper.py