mirror of
https://github.com/instructkr/claw-code.git
synced 2026-04-06 16:14:49 +08:00
Finish the remaining roadmap work by making direct CLI JSON output deterministic across the non-interactive surface, restoring the degraded-startup MCP test as a real workspace test, and adding branch-lock plus commit-lineage primitives so downstream lane consumers can distinguish superseded worktree commits from canonical lineage. Constraint: Keep the user-facing config namespace centered on .claw while preserving legacy fallback discovery for compatibility Constraint: Verification needed to stay clean-room and reproducible from the checked-in workspace alone Rejected: Leave the output-format contract implied by ad-hoc smoke runs only | too easy for direct CLI regressions to slip back into prose-only output Rejected: Keep commit provenance as free-form detail text | downstream consumers need structured branch/worktree/supersession metadata Confidence: medium Scope-risk: moderate Directive: Extend the JSON contract through the same direct CLI entrypoints instead of adding one-off serializers on parallel code paths Tested: python .github/scripts/check_doc_source_of_truth.py Tested: cd rust && cargo fmt --all --check Tested: cd rust && cargo test --workspace Tested: cd rust && cargo clippy -p commands -p tools -p rusty-claude-cli --all-targets --no-deps -- -D warnings Not-tested: full cargo clippy --workspace --all-targets -- -D warnings still reports unrelated pre-existing runtime lint debt outside this change set
166 lines
6.7 KiB
Rust
166 lines
6.7 KiB
Rust
//! 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;
|
|
pub mod branch_lock;
|
|
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;
|
|
#[cfg(test)]
|
|
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;
|
|
#[cfg(test)]
|
|
mod trust_resolver;
|
|
mod usage;
|
|
pub mod worker_boot;
|
|
|
|
pub use bash::{execute_bash, BashCommandInput, BashCommandOutput};
|
|
pub use bootstrap::{BootstrapPhase, BootstrapPlan};
|
|
pub use branch_lock::{detect_branch_lock_collisions, BranchLockCollision, BranchLockIntent};
|
|
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::{
|
|
dedupe_superseded_commit_events, LaneCommitProvenance, 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};
|
|
#[cfg(test)]
|
|
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::Mutex<()>> = std::sync::OnceLock::new();
|
|
LOCK.get_or_init(|| std::sync::Mutex::new(()))
|
|
.lock()
|
|
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
|
}
|