Build the shared runtime for an OpenHarness session.
(
*,
prompt: str | None = None,
cwd: str | None = None,
model: str | None = None,
max_turns: int | None = None,
base_url: str | None = None,
system_prompt: str | None = None,
api_key: str | None = None,
api_format: str | None = None,
active_profile: str | None = None,
api_client: SupportsStreamingMessages | None = None,
permission_prompt: PermissionPrompt | None = None,
ask_user_prompt: AskUserPrompt | None = None,
restore_messages: list[dict] | None = None,
restore_tool_metadata: dict[str, object] | None = None,
enforce_max_turns: bool = True,
session_backend: SessionBackend | None = None,
permission_mode: str | None = None,
extra_skill_dirs: Iterable[str | Path] | None = None,
extra_plugin_roots: Iterable[str | Path] | None = None,
memory_backend: MemoryCommandBackend | None = None,
include_project_memory: bool = True,
)
| 203 | |
| 204 | |
| 205 | async def build_runtime( |
| 206 | *, |
| 207 | prompt: str | None = None, |
| 208 | cwd: str | None = None, |
| 209 | model: str | None = None, |
| 210 | max_turns: int | None = None, |
| 211 | base_url: str | None = None, |
| 212 | system_prompt: str | None = None, |
| 213 | api_key: str | None = None, |
| 214 | api_format: str | None = None, |
| 215 | active_profile: str | None = None, |
| 216 | api_client: SupportsStreamingMessages | None = None, |
| 217 | permission_prompt: PermissionPrompt | None = None, |
| 218 | ask_user_prompt: AskUserPrompt | None = None, |
| 219 | restore_messages: list[dict] | None = None, |
| 220 | restore_tool_metadata: dict[str, object] | None = None, |
| 221 | enforce_max_turns: bool = True, |
| 222 | session_backend: SessionBackend | None = None, |
| 223 | permission_mode: str | None = None, |
| 224 | extra_skill_dirs: Iterable[str | Path] | None = None, |
| 225 | extra_plugin_roots: Iterable[str | Path] | None = None, |
| 226 | memory_backend: MemoryCommandBackend | None = None, |
| 227 | include_project_memory: bool = True, |
| 228 | ) -> RuntimeBundle: |
| 229 | """Build the shared runtime for an OpenHarness session.""" |
| 230 | settings_overrides: dict[str, Any] = { |
| 231 | "model": model, |
| 232 | "max_turns": max_turns, |
| 233 | "base_url": base_url, |
| 234 | "system_prompt": system_prompt, |
| 235 | "api_key": api_key, |
| 236 | "api_format": api_format, |
| 237 | "active_profile": active_profile, |
| 238 | "permission_mode": permission_mode, |
| 239 | } |
| 240 | settings = load_settings().merge_cli_overrides(**settings_overrides) |
| 241 | cwd = str(Path(cwd).expanduser().resolve()) if cwd else str(Path.cwd()) |
| 242 | normalized_skill_dirs = tuple(str(Path(path).expanduser().resolve()) for path in (extra_skill_dirs or ())) |
| 243 | normalized_plugin_roots = tuple(str(Path(path).expanduser().resolve()) for path in (extra_plugin_roots or ())) |
| 244 | plugins = load_plugins(settings, cwd, extra_roots=normalized_plugin_roots) |
| 245 | if api_client: |
| 246 | resolved_api_client = api_client |
| 247 | else: |
| 248 | resolved_api_client = _resolve_api_client_from_settings(settings) |
| 249 | mcp_manager = McpClientManager(load_mcp_server_configs(settings, plugins)) |
| 250 | await mcp_manager.connect_all() |
| 251 | tool_registry = create_default_tool_registry(mcp_manager) |
| 252 | # Register plugin-provided tools |
| 253 | for plugin in plugins: |
| 254 | if plugin.enabled and plugin.tools: |
| 255 | for tool in plugin.tools: |
| 256 | tool_registry.register(tool) |
| 257 | provider = detect_provider(settings) |
| 258 | bridge_manager = get_bridge_manager() |
| 259 | app_state = AppStateStore( |
| 260 | AppState( |
| 261 | # Show the effective runtime model (after CLI/env/profile merges), |
| 262 | # not profile.last_model which may be stale. |