继续收敛认证与资源编辑错误

保留认证恢复与认证状态订阅失败正文

保留资源编辑上游正文读取和编码错误

补充 fixture 失败边界记录
This commit is contained in:
kdletters
2026-10-06 02:00:15 +08:00
parent c86b3bc698
commit 66d5b91aad
3 changed files with 30 additions and 6 deletions
@@ -2651,14 +2651,32 @@ async fn editor_api_rejection_reason(response: reqwest::Response) -> Option<Stri
let mut body = Vec::new();
let mut stream = response.bytes_stream();
while let Some(chunk) = stream.next().await {
let chunk = chunk.ok()?;
let chunk = match chunk {
Ok(chunk) => chunk,
Err(error) => {
return Some(format!("读取上游错误正文失败:{error}"));
}
};
if body.len() + chunk.len() > MAX_EDITOR_ERROR_BODY_BYTES {
return None;
return Some(format!(
"上游错误正文超过 {} 字节上限",
MAX_EDITOR_ERROR_BODY_BYTES
));
}
body.extend_from_slice(&chunk);
}
let body = String::from_utf8(body).ok()?;
editor_api_rejection_reason_from_body(body.as_str())
let body = match String::from_utf8(body) {
Ok(body) => body,
Err(error) => return Some(format!("上游错误正文不是 UTF-8:{error}")),
};
editor_api_rejection_reason_from_body(body.as_str()).or_else(|| {
let detail = crate::agent::redact_agent_runtime_error(
Path::new("__agc_no_project_root__"),
body.trim(),
MAX_EDITOR_ERROR_DETAIL_CHARS,
);
(!detail.trim().is_empty()).then_some(detail)
})
}
async fn append_editor_api_reason(base: String, response: reqwest::Response) -> String {
@@ -267,7 +267,8 @@ export function AuthenticatedClient({
if (!isActiveRun()) return;
// 失败一律先离开检查态:系统变体虽然要原样抛出上报,界面也不能卡在 loading。
setAuthStatus('unauthenticated');
// 启动检查超时等我们自己的失败:改动前会显示原因 + 重试按钮,这里恢复同样的可见反馈。
// 启动检查超时、IPC 或网络失败都必须保留脱敏正文,并给出可重复的重试入口。
setAuthCheckError(visibleClientErrorMessage(error));
if (!(error instanceof ClientAuthErrorWrapper)) {
const text = visibleClientErrorMessage(error);
setAuthCheckError(text);
@@ -501,7 +502,11 @@ export function AuthenticatedClient({
if (disposed) release();
else unsubscribe = release;
})
.catch(() => undefined);
.catch((error) => {
if (disposed) return;
setAuthStatus('unauthenticated');
setAuthCheckError(visibleClientErrorMessage(error));
});
return () => {
disposed = true;
unsubscribe?.();
@@ -95,3 +95,4 @@ DirectProject 回合失败在确认不是客户端内部不可归类故障时,
- 继续扫出浏览器收割的 Job/root kill/wait 错误原先压成 `bool`、External Editor 本机凭据 JSON/目录创建/保存错误丢底层正文,以及生成任务中断收口把项目清单读取失败当成“状态未知”;现分别保留浏览器清理阶段正文、凭据解析/存储正文,并让非“项目尚未初始化”的清单读取失败直接返回具体错误。
- 受控 command 执行路径仍会把 leader 启动身份读取、进程组终止、root kill、Job/wait 失败折叠为“身份未确认/退出未确认”;现拒绝无身份接管并保留身份读取、终止兜底、等待和 OS 错误正文。
- 继续扫到本地资源导入、平台素材 data URL、External Editor binding origin、项目模型记录读取/JSON 解析等错误仍丢底层正文;现区分真实 NotFound 与权限/元数据失败,并保留 base64、URL、文件读取和 JSON 解析细节。
- 资源编辑上游 4xx 正文的流读取失败、正文超限、非 UTF-8 和未知 JSON 形状原先都会回落到笼统失败;现保留读取阶段、大小上限、编码错误和有界脱敏原文。