AbstractRunner
Creates a runner from explicit fields, not using an App.
The supplied pluginManager is closed by close. Two runners sharing one manager therefore means closing either disables the other's plugins; construct it with PluginManager.skipClosingPlugins set to prevent closing the plugins by this runner.
Throws
if any agent in agent's tree sets a mode, which needs the root passed as a node.
Creates a runner from an App, deriving its App.appName, App.rootAgent, App.plugins, and App.resumabilityConfig.
This is the recommended way to configure plugins and resumability: the App is the single source of truth. The field-based primary constructor still accepts a pluginManager and resumabilityConfig for backward compatibility.
App.eventsCompactionConfig is resolved at construction, failing fast if a default summarizer is required but the root agent is not an LlmAgent.
Throws
if the root can't run: a single-turn root, a root passed as a node whose agent tree has a name a node path can't carry, or a mode in an agent root's tree.