fix(acp): harden session-page connection and localize backend errors
- Session-page connect never triggers download/install; returns SdkNotInstalled immediately and prompts the user to install from Agent Settings instead - Binary agents now accept any cached version via find_best_cached_binary_for_agent so stale caches still connect - Bound Initialize handshake with a 60s timeout and convert it to AcpError::InitializeTimeout via a sentinel in run_connection - Spawn background task owns ConnectionManager map insertion and removes the entry on exit through an RAII guard that survives panics, preventing leaked stale entries - AcpError gains SdkNotInstalled and InitializeTimeout variants plus a stable code() identifier; AcpEvent::Error carries code so the frontend can render localized messages by key - Frontend preflight now runs for all connect sources; error event handler switches on code to show translated text for initialize_timeout, sdk_not_installed, platform_not_supported, process_exited, spawn_failed and download_failed - Remove ConnectionStatus::Downloading enum variant, all frontend branches, and i18n strings; drop obsolete autoLinkFailedTitle, autoLinkPreflightFailed, preflightCheckFailedDefault and preflightFailedTitle keys across 10 locales - Add backendErrors.* translations in 10 languages - Diagnostic logging: always log agent stderr plus binary path/size/args/env keys and Initialize timing; gate stdin/stdout JSON-RPC tracing behind CODEG_ACP_DEBUG to avoid persisting user content into OS log files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -299,32 +299,51 @@ async fn check_binary_environment(
|
||||
};
|
||||
checks.push(platform_check);
|
||||
|
||||
// Check binary cache
|
||||
// Check binary cache.
|
||||
//
|
||||
// Pass as long as *any* cached version is present — the session-page
|
||||
// connect path uses the best cached version via
|
||||
// `find_best_cached_binary_for_agent`, so an older-but-working cache
|
||||
// should still be considered "ready". If the cached version differs
|
||||
// from the registry's recommended version, we note it in the message
|
||||
// but still pass — the Settings page's version-badge flow is the
|
||||
// canonical place to surface "upgrade available".
|
||||
if platform_supported {
|
||||
let cache_check = match binary_cache::find_cached_binary_for_agent(agent_type, version, cmd)
|
||||
{
|
||||
Ok(Some(_)) => CheckItem {
|
||||
check_id: "binary_cached".into(),
|
||||
label: "Binary cache".into(),
|
||||
status: CheckStatus::Pass,
|
||||
message: "Binary is cached locally".into(),
|
||||
fixes: vec![],
|
||||
},
|
||||
Ok(None) => CheckItem {
|
||||
check_id: "binary_cached".into(),
|
||||
label: "Binary cache".into(),
|
||||
status: CheckStatus::Warn,
|
||||
message: "Binary not cached yet, will be downloaded on first connection".into(),
|
||||
fixes: vec![],
|
||||
},
|
||||
Err(_) => CheckItem {
|
||||
check_id: "binary_cached".into(),
|
||||
label: "Binary cache".into(),
|
||||
status: CheckStatus::Warn,
|
||||
message: "Cannot determine binary cache path".into(),
|
||||
fixes: vec![],
|
||||
},
|
||||
};
|
||||
let cache_check =
|
||||
match binary_cache::find_best_cached_binary_for_agent(agent_type, cmd) {
|
||||
Ok(Some((_, cached_version))) => {
|
||||
let message = if cached_version == version {
|
||||
"Binary is cached locally".to_string()
|
||||
} else {
|
||||
format!(
|
||||
"Binary {cached_version} is cached locally (recommended: {version})"
|
||||
)
|
||||
};
|
||||
CheckItem {
|
||||
check_id: "binary_cached".into(),
|
||||
label: "Binary cache".into(),
|
||||
status: CheckStatus::Pass,
|
||||
message,
|
||||
fixes: vec![],
|
||||
}
|
||||
}
|
||||
Ok(None) => CheckItem {
|
||||
check_id: "binary_cached".into(),
|
||||
label: "Binary cache".into(),
|
||||
status: CheckStatus::Warn,
|
||||
message:
|
||||
"Binary is not installed. Download it from Agent Settings before connecting."
|
||||
.into(),
|
||||
fixes: vec![],
|
||||
},
|
||||
Err(_) => CheckItem {
|
||||
check_id: "binary_cached".into(),
|
||||
label: "Binary cache".into(),
|
||||
status: CheckStatus::Warn,
|
||||
message: "Cannot determine binary cache path".into(),
|
||||
fixes: vec![],
|
||||
},
|
||||
};
|
||||
checks.push(cache_check);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user