From 25213c9ff7e8ca0cbbf520c5f824fe1fffc61b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Fri, 2 Oct 2026 22:26:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A9=BA=20text=20=E7=9F=AD?= =?UTF-8?q?=E8=B7=AF=20content=20=E5=85=9C=E5=BA=95=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - items.rs:item_text 先判空/全空白再回落 content/summary;此前 Some("") 会短路兜底,末尾非空过滤把整条 message/reasoning 丢掉 - wire/tests.rs:补空 text + 有 content 的回归用例 --- .../src/agent/thread_manager/wire/items.rs | 6 ++++-- .../src/agent/thread_manager/wire/tests.rs | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/items.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/items.rs index ac4e06338..906039e40 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/items.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/items.rs @@ -224,6 +224,9 @@ fn item_text(root: &Path, item: &Value) -> Option { let raw = item .get("text") .and_then(Value::as_str) + // 空 / 全空白的 `text` 要在**回落之前**判掉:否则 `Some("")` 会短路 `content` / `summary` + // 兜底,末尾那条非空过滤再把整条条目丢掉(message / reasoning 的正文就此消失)。 + .filter(|text| !text.trim().is_empty()) .map(str::to_string) .or_else(|| { for key in ["content", "summary"] { @@ -240,8 +243,7 @@ fn item_text(root: &Path, item: &Value) -> Option { } } None - }) - .filter(|text| !text.trim().is_empty())?; + })?; Some(bounded( &sanitize_detail_text(root, &raw), THREAD_TEXT_MAX_CHARS, diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/tests.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/tests.rs index da0663f23..757d8b0b9 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/tests.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/thread_manager/wire/tests.rs @@ -45,6 +45,27 @@ fn app_server_agent_message_defaults_to_assistant_role() { )); } +#[test] +fn blank_message_text_falls_back_to_content_parts() { + // 空 / 全空白的 `text` 不能短路 `content` 兜底:否则整条条目会被判成"没有正文"直接丢掉。 + let item = thread_item_from_value( + root(), + &json!({ + "id": "msg-blank-text", + "type": "message", + "role": "assistant", + "text": " ", + "content": [{"type": "output_text", "text": "真实正文"}], + }), + 1000, + ) + .expect("blank text must still fall back to content"); + assert!(matches!( + item, + ThreadItem::Message { text, .. } if text == "真实正文" + )); +} + #[test] fn tool_item_identity_is_normalized_to_one_id() { let item = thread_item_from_value(