class_docstr: This class keeps track of services that can be employed by all objects of the agent-environment loop.
  
  Currently the context is populated by
  
  - Event service: Acts as backend of the PubSub service, collects all events from the env.
    The event service can also be directly facilitated by components outside the environment (e.g. agent, heuristics,
    state/observation mapping)
  - Episode ID: Generates and keeps track of the current episode ID
    Episode IDs are used for connecting logged statistics, events and recorded trajectory data together, making
    analysis and drill-down across these different levels possible.
  - Step ID: Tracks ID of the core env step we are currently in. Helps wrappers recognize core env steps in multi-step
    scenarios.
  - Post-step callbacks: Handles registration of post-step callbacks and provides a utility to run them (usually
                         triggered from the outer-most wrapper)
  - Step lifecycle flags: Flags partially managed from the wrapper stack, helping the wrappers to determine
                          where we are in the step lifecycle and which one is the outer-most one
code: def __init__(self):
      from maze.core.events.event_service import EventService
  
      self.event_service = EventService()
      self.step_id = 0
      self._episode_id = None
      self._last_cleared_events_at = self.step_id
  
      # Step lifecycle flags - partially managed by wrappers to help them orient in the step lifecycle
      self.step_in_progress = False  # True during the whole env.step
      self.step_is_initiating = False  # True while descending through the wrapper stack, until the env time increment
  
      self._post_step_callbacks = []
  
file_path: maze/maze/core/env/environment_context.py
imports: import uuid
  from typing import Callable
label_desc: Use image node_id 1 to create a new EnvironmentContext object  with example: obj = EnvironmentContext()