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:
xintaofei
2026-04-12 03:36:08 +08:00
parent 5bda7d06e9
commit 1c1738298b
25 changed files with 595 additions and 255 deletions

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "متصل",
"connecting": "جارٍ الاتصال...",
"downloading": "جارٍ التنزيل...",
"prompting": "جارٍ الرد...",
"error": "خطأ في الاتصال",
"disconnected": "غير متصل",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} غير متاح على المنصة الحالية.",
"sdkMissing": "لم يتم تثبيت SDK الخاص بـ {agent}"
},
"backendErrors": {
"initializeTimeout": "انتهت مهلة مصافحة اتصال {agent} (لا استجابة بعد 60 ثانية). افتح الإعدادات للتحقق من إعدادات الوكيل والشبكة.",
"processExited": "انتهت عملية {agent} بشكل غير متوقع.",
"spawnFailed": "تعذر بدء تشغيل {agent}: {message}",
"downloadFailed": "فشل تنزيل {agent}: {message}"
},
"unableReadAgentConfig": "تعذر قراءة إعدادات الوكيل: {message}",
"autoLinkFailedTitle": "فشل الربط التلقائي لـ {agent}",
"preflightCheckFailedDefault": "فشلت فحوصات ما قبل التشغيل. تحقق من إعدادات الوكلاء.",
"preflightFailedTitle": "فشل فحص ما قبل التشغيل لـ {agent}",
"autoLinkPreflightFailed": "فشل فحص ما قبل التشغيل للربط التلقائي: {message}",
"connectFailedTitle": "فشل اتصال {agent}",
"toolFallbackTitle": "أداة",
"eventErrorTitle": "خطأ الوكيل",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "Verbunden",
"connecting": "Verbinde...",
"downloading": "Lade herunter...",
"prompting": "Antworte...",
"error": "Verbindungsfehler",
"disconnected": "Getrennt",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} ist auf der aktuellen Plattform nicht verfügbar.",
"sdkMissing": "{agent} SDK ist nicht installiert"
},
"backendErrors": {
"initializeTimeout": "Der Verbindungs-Handshake von {agent} hat nach 60 Sekunden das Zeitlimit überschritten. Öffnen Sie die Einstellungen, um Agenten- und Netzwerkkonfiguration zu prüfen.",
"processExited": "{agent}-Prozess wurde unerwartet beendet.",
"spawnFailed": "{agent} konnte nicht gestartet werden: {message}",
"downloadFailed": "{agent}-Download fehlgeschlagen: {message}"
},
"unableReadAgentConfig": "Agenten-Konfiguration kann nicht gelesen werden: {message}",
"autoLinkFailedTitle": "{agent} Auto-Link fehlgeschlagen",
"preflightCheckFailedDefault": "Preflight-Prüfungen fehlgeschlagen. Prüfen Sie die Agenten-Einstellungen.",
"preflightFailedTitle": "{agent} Preflight fehlgeschlagen",
"autoLinkPreflightFailed": "Auto-Link-Preflight fehlgeschlagen: {message}",
"connectFailedTitle": "{agent} Verbindung fehlgeschlagen",
"toolFallbackTitle": "Werkzeug",
"eventErrorTitle": "Agentenfehler",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "Connected",
"connecting": "Connecting...",
"downloading": "Downloading...",
"prompting": "Responding...",
"error": "Connection error",
"disconnected": "Disconnected",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} is unavailable on the current platform.",
"sdkMissing": "{agent} SDK is not installed"
},
"backendErrors": {
"initializeTimeout": "{agent} connection handshake timed out after 60 seconds. Please open Settings to check Agent configuration and network settings.",
"processExited": "{agent} process exited unexpectedly.",
"spawnFailed": "Failed to start {agent}: {message}",
"downloadFailed": "{agent} download failed: {message}"
},
"unableReadAgentConfig": "Unable to read Agent config: {message}",
"autoLinkFailedTitle": "{agent} auto-link failed",
"preflightCheckFailedDefault": "Preflight checks failed. Check Agent settings.",
"preflightFailedTitle": "{agent} preflight failed",
"autoLinkPreflightFailed": "Auto-link preflight failed: {message}",
"connectFailedTitle": "{agent} connection failed",
"toolFallbackTitle": "Tool",
"eventErrorTitle": "Agent Error",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "Conectado",
"connecting": "Conectando...",
"downloading": "Descargando...",
"prompting": "Respondiendo...",
"error": "Error de conexión",
"disconnected": "Desconectado",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} no está disponible en la plataforma actual.",
"sdkMissing": "El SDK de {agent} no está instalado"
},
"backendErrors": {
"initializeTimeout": "Se agotó el tiempo del handshake de conexión de {agent} (sin respuesta tras 60 segundos). Abre Ajustes para revisar la configuración del agente y de la red.",
"processExited": "El proceso de {agent} terminó inesperadamente.",
"spawnFailed": "No se pudo iniciar {agent}: {message}",
"downloadFailed": "La descarga de {agent} falló: {message}"
},
"unableReadAgentConfig": "No se puede leer la configuración del agente: {message}",
"autoLinkFailedTitle": "Falló el autovínculo de {agent}",
"preflightCheckFailedDefault": "Fallaron las comprobaciones previas. Revisa los ajustes de agentes.",
"preflightFailedTitle": "Falló la verificación previa de {agent}",
"autoLinkPreflightFailed": "Falló la verificación previa del autovínculo: {message}",
"connectFailedTitle": "Falló la conexión de {agent}",
"toolFallbackTitle": "Herramienta",
"eventErrorTitle": "Error del agente",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "Connecté",
"connecting": "Connexion...",
"downloading": "Téléchargement...",
"prompting": "Réponse...",
"error": "Erreur de connexion",
"disconnected": "Déconnecté",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} n'est pas disponible sur la plateforme actuelle.",
"sdkMissing": "Le SDK de {agent} n'est pas installé"
},
"backendErrors": {
"initializeTimeout": "Le handshake de connexion de {agent} a expiré (aucune réponse après 60 secondes). Ouvrez Paramètres pour vérifier la configuration de l'agent et du réseau.",
"processExited": "Le processus {agent} s'est arrêté de manière inattendue.",
"spawnFailed": "Impossible de démarrer {agent} : {message}",
"downloadFailed": "Échec du téléchargement de {agent} : {message}"
},
"unableReadAgentConfig": "Impossible de lire la configuration de l'agent : {message}",
"autoLinkFailedTitle": "Échec de l'auto-liaison de {agent}",
"preflightCheckFailedDefault": "Les vérifications préalables ont échoué. Vérifiez les paramètres des agents.",
"preflightFailedTitle": "Échec de la vérification préalable de {agent}",
"autoLinkPreflightFailed": "Échec de la vérification préalable de l'auto-liaison : {message}",
"connectFailedTitle": "Échec de la connexion de {agent}",
"toolFallbackTitle": "Outil",
"eventErrorTitle": "Erreur de l'agent",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "接続済み",
"connecting": "接続中...",
"downloading": "ダウンロード中...",
"prompting": "応答中...",
"error": "接続エラー",
"disconnected": "未接続",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} は現在のプラットフォームでは利用できません。",
"sdkMissing": "{agent} SDK がインストールされていません"
},
"backendErrors": {
"initializeTimeout": "{agent} の接続ハンドシェイクがタイムアウトしました60 秒以内に応答なし)。設定を開いてエージェントとネットワーク設定を確認してください。",
"processExited": "{agent} プロセスが予期せず終了しました。",
"spawnFailed": "{agent} の起動に失敗しました: {message}",
"downloadFailed": "{agent} のダウンロードに失敗しました: {message}"
},
"unableReadAgentConfig": "エージェント設定を読み取れません: {message}",
"autoLinkFailedTitle": "{agent} の自動リンクに失敗しました",
"preflightCheckFailedDefault": "事前チェックに失敗しました。エージェント設定を確認してください。",
"preflightFailedTitle": "{agent} の事前チェックに失敗しました",
"autoLinkPreflightFailed": "自動リンクの事前チェックに失敗しました: {message}",
"connectFailedTitle": "{agent} の接続に失敗しました",
"toolFallbackTitle": "ツール",
"eventErrorTitle": "エージェントエラー",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "연결됨",
"connecting": "연결 중...",
"downloading": "다운로드 중...",
"prompting": "응답 중...",
"error": "연결 오류",
"disconnected": "연결 끊김",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent}은(는) 현재 플랫폼에서 사용할 수 없습니다.",
"sdkMissing": "{agent} SDK가 설치되어 있지 않습니다"
},
"backendErrors": {
"initializeTimeout": "{agent} 연결 핸드셰이크가 시간 초과되었습니다(60초 동안 응답 없음). 설정을 열어 에이전트 및 네트워크 구성을 확인하세요.",
"processExited": "{agent} 프로세스가 예기치 않게 종료되었습니다.",
"spawnFailed": "{agent} 시작 실패: {message}",
"downloadFailed": "{agent} 다운로드 실패: {message}"
},
"unableReadAgentConfig": "에이전트 구성을 읽을 수 없습니다: {message}",
"autoLinkFailedTitle": "{agent} 자동 연결 실패",
"preflightCheckFailedDefault": "사전 점검에 실패했습니다. 에이전트 설정을 확인하세요.",
"preflightFailedTitle": "{agent} 사전 점검 실패",
"autoLinkPreflightFailed": "자동 연결 사전 점검 실패: {message}",
"connectFailedTitle": "{agent} 연결 실패",
"toolFallbackTitle": "도구",
"eventErrorTitle": "에이전트 오류",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "Conectado",
"connecting": "Conectando...",
"downloading": "Baixando...",
"prompting": "Respondendo...",
"error": "Erro de conexão",
"disconnected": "Desconectado",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} está indisponível na plataforma atual.",
"sdkMissing": "O SDK de {agent} não está instalado"
},
"backendErrors": {
"initializeTimeout": "O handshake de conexão de {agent} expirou (sem resposta após 60 segundos). Abra Configurações para verificar a configuração do agente e da rede.",
"processExited": "O processo de {agent} encerrou inesperadamente.",
"spawnFailed": "Falha ao iniciar {agent}: {message}",
"downloadFailed": "Falha no download de {agent}: {message}"
},
"unableReadAgentConfig": "Não foi possível ler a configuração do agente: {message}",
"autoLinkFailedTitle": "Falha no vínculo automático de {agent}",
"preflightCheckFailedDefault": "As verificações de pré-voo falharam. Verifique as configurações de agentes.",
"preflightFailedTitle": "Pré-voo de {agent} falhou",
"autoLinkPreflightFailed": "Pré-voo do vínculo automático falhou: {message}",
"connectFailedTitle": "Falha na conexão de {agent}",
"toolFallbackTitle": "Ferramenta",
"eventErrorTitle": "Erro do agente",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "已连接",
"connecting": "连接中...",
"downloading": "下载中...",
"prompting": "响应中...",
"error": "连接异常",
"disconnected": "未连接",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} 当前平台不可用。",
"sdkMissing": "{agent} SDK 尚未安装"
},
"backendErrors": {
"initializeTimeout": "{agent} 连接握手超时60 秒未响应),请前往设置页面检查智能体和网络配置。",
"processExited": "{agent} 进程意外退出。",
"spawnFailed": "启动 {agent} 失败:{message}",
"downloadFailed": "{agent} 下载失败:{message}"
},
"unableReadAgentConfig": "无法读取 Agent 配置:{message}",
"autoLinkFailedTitle": "{agent} 自动链接失败",
"preflightCheckFailedDefault": "预检查未通过,请检查 Agent 配置。",
"preflightFailedTitle": "{agent} 预检查失败",
"autoLinkPreflightFailed": "自动链接预检查失败:{message}",
"connectFailedTitle": "{agent} 连接失败",
"toolFallbackTitle": "工具",
"eventErrorTitle": "Agent 错误",

View File

@@ -851,7 +851,6 @@
"connection": {
"connected": "已連線",
"connecting": "連線中...",
"downloading": "下載中...",
"prompting": "回應中...",
"error": "連線異常",
"disconnected": "未連線",
@@ -1422,11 +1421,13 @@
"unavailable": "{agent} 目前平台不可用。",
"sdkMissing": "{agent} SDK 尚未安裝"
},
"backendErrors": {
"initializeTimeout": "{agent} 連線交握逾時60 秒未回應),請前往設定頁面檢查智能體與網路設定。",
"processExited": "{agent} 處理程序意外結束。",
"spawnFailed": "啟動 {agent} 失敗:{message}",
"downloadFailed": "{agent} 下載失敗:{message}"
},
"unableReadAgentConfig": "無法讀取 Agent 設定:{message}",
"autoLinkFailedTitle": "{agent} 自動連結失敗",
"preflightCheckFailedDefault": "預檢查未通過,請檢查 Agent 設定。",
"preflightFailedTitle": "{agent} 預檢查失敗",
"autoLinkPreflightFailed": "自動連結預檢查失敗:{message}",
"connectFailedTitle": "{agent} 連線失敗",
"toolFallbackTitle": "工具",
"eventErrorTitle": "Agent 錯誤",