//! Core runtime primitives for the `claw` CLI and supporting crates. //! //! This crate owns session persistence, permission evaluation, prompt assembly, //! MCP plumbing, tool-facing file operations, and the core conversation loop //! that drives interactive and one-shot turns. mod bash; pub mod bash_validation; mod bootstrap; mod compact; mod config; mod conversation; mod file_ops; pub mod green_contract; mod hooks; mod json; mod lane_events; pub mod lsp_client; mod mcp; mod mcp_client; pub mod mcp_lifecycle_hardened; mod mcp_stdio; pub mod mcp_tool_bridge; mod oauth; pub mod permission_enforcer; mod permissions; pub mod plugin_lifecycle; mod policy_engine; mod prompt; pub mod recovery_recipes; mod remote; pub mod sandbox; mod session; pub mod session_control; mod sse; pub mod stale_branch; pub mod summary_compression; pub mod task_packet; pub mod task_registry; pub mod team_cron_registry; pub mod trust_resolver; mod usage; pub mod worker_boot; pub use bash::{execute_bash, BashCommandInput, BashCommandOutput}; pub use bootstrap::{BootstrapPhase, BootstrapPlan}; pub use compact::{ compact_session, estimate_session_tokens, format_compact_summary, get_compact_continuation_message, should_compact, CompactionConfig, CompactionResult, }; pub use config::{ ConfigEntry, ConfigError, ConfigLoader, ConfigSource, McpConfigCollection, McpManagedProxyServerConfig, McpOAuthConfig, McpRemoteServerConfig, McpSdkServerConfig, McpServerConfig, McpStdioServerConfig, McpTransport, McpWebSocketServerConfig, OAuthConfig, ResolvedPermissionMode, RuntimeConfig, RuntimeFeatureConfig, RuntimeHookConfig, RuntimePermissionRuleConfig, RuntimePluginConfig, ScopedMcpServerConfig, CLAW_SETTINGS_SCHEMA_NAME, }; pub use conversation::{ auto_compaction_threshold_from_env, ApiClient, ApiRequest, AssistantEvent, AutoCompactionEvent, ConversationRuntime, PromptCacheEvent, RuntimeError, StaticToolExecutor, ToolError, ToolExecutor, TurnSummary, }; pub use file_ops::{ edit_file, glob_search, grep_search, read_file, write_file, EditFileOutput, GlobSearchOutput, GrepSearchInput, GrepSearchOutput, ReadFileOutput, StructuredPatchHunk, TextFilePayload, WriteFileOutput, }; pub use hooks::{ HookAbortSignal, HookEvent, HookProgressEvent, HookProgressReporter, HookRunResult, HookRunner, }; pub use lane_events::{ LaneEvent, LaneEventBlocker, LaneEventName, LaneEventStatus, LaneFailureClass, }; pub use mcp::{ mcp_server_signature, mcp_tool_name, mcp_tool_prefix, normalize_name_for_mcp, scoped_mcp_config_hash, unwrap_ccr_proxy_url, }; pub use mcp_client::{ McpClientAuth, McpClientBootstrap, McpClientTransport, McpManagedProxyTransport, McpRemoteTransport, McpSdkTransport, McpStdioTransport, }; pub use mcp_lifecycle_hardened::{ McpDegradedReport, McpErrorSurface, McpFailedServer, McpLifecyclePhase, McpLifecycleState, McpLifecycleValidator, McpPhaseResult, }; pub use mcp_stdio::{ spawn_mcp_stdio_process, JsonRpcError, JsonRpcId, JsonRpcRequest, JsonRpcResponse, ManagedMcpTool, McpDiscoveryFailure, McpInitializeClientInfo, McpInitializeParams, McpInitializeResult, McpInitializeServerInfo, McpListResourcesParams, McpListResourcesResult, McpListToolsParams, McpListToolsResult, McpReadResourceParams, McpReadResourceResult, McpResource, McpResourceContents, McpServerManager, McpServerManagerError, McpStdioProcess, McpTool, McpToolCallContent, McpToolCallParams, McpToolCallResult, McpToolDiscoveryReport, UnsupportedMcpServer, }; pub use oauth::{ clear_oauth_credentials, code_challenge_s256, credentials_path, generate_pkce_pair, generate_state, load_oauth_credentials, loopback_redirect_uri, parse_oauth_callback_query, parse_oauth_callback_request_target, save_oauth_credentials, OAuthAuthorizationRequest, OAuthCallbackParams, OAuthRefreshRequest, OAuthTokenExchangeRequest, OAuthTokenSet, PkceChallengeMethod, PkceCodePair, }; pub use permissions::{ PermissionContext, PermissionMode, PermissionOutcome, PermissionOverride, PermissionPolicy, PermissionPromptDecision, PermissionPrompter, PermissionRequest, }; pub use plugin_lifecycle::{ DegradedMode, DiscoveryResult, PluginHealthcheck, PluginLifecycle, PluginLifecycleEvent, PluginState, ResourceInfo, ServerHealth, ServerStatus, ToolInfo, }; pub use policy_engine::{ evaluate, DiffScope, GreenLevel, LaneBlocker, LaneContext, PolicyAction, PolicyCondition, PolicyEngine, PolicyRule, ReconcileReason, ReviewStatus, }; pub use prompt::{ load_system_prompt, prepend_bullets, ContextFile, ProjectContext, PromptBuildError, SystemPromptBuilder, FRONTIER_MODEL_NAME, SYSTEM_PROMPT_DYNAMIC_BOUNDARY, }; pub use recovery_recipes::{ attempt_recovery, recipe_for, EscalationPolicy, FailureScenario, RecoveryContext, RecoveryEvent, RecoveryRecipe, RecoveryResult, RecoveryStep, }; pub use remote::{ inherited_upstream_proxy_env, no_proxy_list, read_token, upstream_proxy_ws_url, RemoteSessionContext, UpstreamProxyBootstrap, UpstreamProxyState, DEFAULT_REMOTE_BASE_URL, DEFAULT_SESSION_TOKEN_PATH, DEFAULT_SYSTEM_CA_BUNDLE, NO_PROXY_HOSTS, UPSTREAM_PROXY_ENV_KEYS, }; pub use sandbox::{ build_linux_sandbox_command, detect_container_environment, detect_container_environment_from, resolve_sandbox_status, resolve_sandbox_status_for_request, ContainerEnvironment, FilesystemIsolationMode, LinuxSandboxCommand, SandboxConfig, SandboxDetectionInputs, SandboxRequest, SandboxStatus, }; pub use session::{ ContentBlock, ConversationMessage, MessageRole, Session, SessionCompaction, SessionError, SessionFork, }; pub use sse::{IncrementalSseParser, SseEvent}; pub use stale_branch::{ apply_policy, check_freshness, BranchFreshness, StaleBranchAction, StaleBranchEvent, StaleBranchPolicy, }; pub use task_packet::{validate_packet, TaskPacket, TaskPacketValidationError, ValidatedPacket}; pub use trust_resolver::{TrustConfig, TrustDecision, TrustEvent, TrustPolicy, TrustResolver}; pub use usage::{ format_usd, pricing_for_model, ModelPricing, TokenUsage, UsageCostEstimate, UsageTracker, }; pub use worker_boot::{ Worker, WorkerEvent, WorkerEventKind, WorkerEventPayload, WorkerFailure, WorkerFailureKind, WorkerPromptTarget, WorkerReadySnapshot, WorkerRegistry, WorkerStatus, WorkerTrustResolution, }; #[cfg(test)] pub(crate) fn test_env_lock() -> std::sync::MutexGuard<'static, ()> { static LOCK: std::sync::OnceLock> = std::sync::OnceLock::new(); LOCK.get_or_init(|| std::sync::Mutex::new(())) .lock() .unwrap_or_else(std::sync::PoisonError::into_inner) }