继续收敛认证与资源编辑错误
保留认证恢复与认证状态订阅失败正文 保留资源编辑上游正文读取和编码错误 补充 fixture 失败边界记录
This commit is contained in:
@@ -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 形状原先都会回落到笼统失败;现保留读取阶段、大小上限、编码错误和有界脱敏原文。
|
||||
|
||||
Reference in New Issue
Block a user