From 58475050209063c937b28a54674960e25e8e5e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 21 Sep 2026 22:20:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E4=BE=8B=E6=8C=89=E9=80=90=E8=A1=8C?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E6=A0=B8=E9=AA=8C=E5=BA=94=E7=94=A8=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=90=BD=E7=9B=98=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 生产是把两行分别交给 append_application_log_line 脱敏截断,原用例先 join(" ") 再 sanitize,测不到逐行截断与「只该脱敏其中一行」的情况 - 改为逐行 sanitize,并分别断言身份行(eventId/code/detailRef/summary)与详情行(detail 脱敏、metadata 无凭据) - 验证:cargo test runtime_error(7 passed) --- .../src-tauri/src/agent/runtime_error.rs | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs index 8a39c95ef..bf0d8103e 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_error.rs @@ -279,21 +279,32 @@ mod tests { for line in &lines { assert!(!line.contains('\n'), "{line}"); } - // 落盘边界按真实口径核验:应用日志的整行脱敏既不能吃掉身份字段,也不能靠换行拆行。 - let persisted = crate::sanitize_diagnostic_message(&lines.join(" "), None); - assert!(persisted.contains("eventId=error-1-1"), "{persisted}"); - assert!(persisted.contains("code=turn-idle-timeout"), "{persisted}"); + // 落盘边界按真实口径核验:应用日志逐行脱敏、逐行截断,两行不会先拼在一起。 + let persisted = lines + .iter() + .map(|line| crate::sanitize_diagnostic_message(line, None)) + .collect::>(); + for line in &persisted { + assert!(!line.contains("token=secret"), "{line}"); + assert!(line.chars().count() <= 2_048, "{line}"); + } + let identity = &persisted[0]; + assert!(identity.contains("eventId=error-1-1"), "{identity}"); + assert!(identity.contains("code=turn-idle-timeout"), "{identity}"); assert!( - persisted.contains("detailRef=.agent/runtime/errors/error-1-1.json"), - "{persisted}" + identity.contains("detailRef=.agent/runtime/errors/error-1-1.json"), + "{identity}" ); - assert!(persisted.contains("summary=本轮没有收到完成事件 附带换行")); - assert!(persisted.contains("detail= 第二行诊断")); assert!( - !persisted.contains("token=secret") && !persisted.contains("Bearer secret"), - "{persisted}" + identity.contains("summary=本轮没有收到完成事件 附带换行"), + "{identity}" ); - assert!(persisted.chars().count() <= 2_048, "{persisted}"); + let detail = &persisted[1]; + assert!( + detail.contains("detail= 第二行诊断"), + "{detail}" + ); + assert!(!detail.contains("Bearer secret"), "{detail}"); } #[test]