优化agent连接逻辑

This commit is contained in:
xintaofei
2026-03-18 10:16:15 +08:00
parent 624518fbea
commit 9b2522505b

View File

@@ -91,6 +91,25 @@ async fn detect_global_cmd_version(cmd: &str) -> Option<String> {
normalize_version_candidate(&raw) normalize_version_candidate(&raw)
} }
/// Check whether a command is available on the system PATH.
/// Uses `which` on unix and `where` on windows — lightweight and does not
/// invoke the target binary itself, avoiding side-effects or slow startups.
async fn is_cmd_available(cmd: &str) -> bool {
#[cfg(unix)]
let check_cmd = "which";
#[cfg(windows)]
let check_cmd = "where";
crate::process::tokio_command(check_cmd)
.arg(cmd)
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.status()
.await
.map(|s| s.success())
.unwrap_or(false)
}
async fn detect_local_version(agent_type: AgentType) -> Option<String> { async fn detect_local_version(agent_type: AgentType) -> Option<String> {
let meta = registry::get_agent_meta(agent_type); let meta = registry::get_agent_meta(agent_type);
match meta.distribution { match meta.distribution {
@@ -1036,9 +1055,12 @@ pub async fn acp_connect(
runtime_env.insert("OPENCLAW_RESET_SESSION".into(), "1".into()); runtime_env.insert("OPENCLAW_RESET_SESSION".into(), "1".into());
} }
if let registry::AgentDistribution::Npx { cmd, package, .. } = meta.distribution { if let registry::AgentDistribution::Npx { cmd, .. } = meta.distribution {
if detect_global_cmd_version(cmd).await.is_none() { if !is_cmd_available(cmd).await {
install_npm_global_package(package).await?; return Err(AcpError::protocol(format!(
"{} SDK is not installed. Please install it in Agent Settings.",
meta.name
)));
} }
} }