rlmesh.RunContext
What a run exposes to its hooks: the connected env, in either loop.
RunHooks.on_run_start() receives one. A Session is one on the
session loop; the native Model.run loop passes
its own. contract and num_envs are known once the env is connected
(before the first RunHooks.on_episode_start()); read resolves a
role over one observation the way Session.read() does, and
frame_sources lists the env’s image roles plus its render() thunk
when one is reachable (a native run reaches it only for a local env object).