From 463d89f2959295b877bd79f656dd5fdaf2f7ec4a Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Sun, 8 Mar 2026 00:03:28 +0800 Subject: [PATCH] fix: review filename sanitize and tool output --- core/main_terminal_parts/tools_read.py | 4 ++++ server/conversation.py | 1 + utils/tool_result_formatter.py | 25 +++++++++++++++---------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/core/main_terminal_parts/tools_read.py b/core/main_terminal_parts/tools_read.py index 59b88af..e018b45 100644 --- a/core/main_terminal_parts/tools_read.py +++ b/core/main_terminal_parts/tools_read.py @@ -85,6 +85,7 @@ logger = setup_logger(__name__) DISABLE_LENGTH_CHECK = True class MainTerminalToolsReadMixin: + @staticmethod def _clamp_int(value, default, min_value=None, max_value=None): """将输入转换为整数并限制范围。""" if value is None: @@ -99,6 +100,7 @@ class MainTerminalToolsReadMixin: num = min(max_value, num) return num + @staticmethod def _parse_optional_line(value, field_name: str): """解析可选的行号参数。""" if value is None: @@ -111,12 +113,14 @@ class MainTerminalToolsReadMixin: return None, f"{field_name} 必须大于等于1" return number, None + @staticmethod def _truncate_text_block(text: str, max_chars: int): """对单段文本应用字符限制。""" if max_chars and len(text) > max_chars: return text[:max_chars], True, max_chars return text, False, len(text) + @staticmethod def _limit_text_chunks(chunks: List[Dict], text_key: str, max_chars: int): """对多个文本片段应用全局字符限制。""" if max_chars is None or max_chars <= 0: diff --git a/server/conversation.py b/server/conversation.py index 32b3e16..cd73dc4 100644 --- a/server/conversation.py +++ b/server/conversation.py @@ -54,6 +54,7 @@ from .context import with_terminal, get_gui_manager, get_upload_guard, build_upl from .utils_common import ( build_review_lines, debug_log, + _sanitize_filename_component, log_backend_chunk, log_frontend_chunk, log_streaming_debug_entry, diff --git a/utils/tool_result_formatter.py b/utils/tool_result_formatter.py index 144a73b..193bd22 100644 --- a/utils/tool_result_formatter.py +++ b/utils/tool_result_formatter.py @@ -355,17 +355,22 @@ def _plain_command_output(result_data: Dict[str, Any]) -> str: partial_output_note = "已返回当前输出,命令可能仍在运行" partial_no_output_note = "未捕获输出,命令可能仍在运行" else: - appended = False - # 1) 优先使用数值型 timeout + timeout_seconds = None if isinstance(timeout, (int, float)) and timeout > 0: - prefixes.append(f"[timeout after {int(timeout)}s]") - appended = True - # 2) 字符串数字 - elif isinstance(timeout, str) and timeout.strip().isdigit(): - prefixes.append(f"[timeout after {int(timeout.strip())}s]") - appended = True - if not appended: - prefixes.append("[timeout]") + timeout_seconds = int(timeout) + elif isinstance(timeout, str): + stripped = timeout.strip() + if stripped.isdigit(): + timeout_seconds = int(stripped) + else: + digits = "".join(ch for ch in stripped if ch.isdigit()) + if digits: + timeout_seconds = int(digits) + + if timeout_seconds and timeout_seconds >= 60: + prefixes.append(f"[partial_output ~{timeout_seconds}s]") + partial_output_note = f"已等待约{timeout_seconds}秒,命令可能仍在运行" + partial_no_output_note = f"已等待约{timeout_seconds}秒未捕获输出,命令可能仍在运行" elif status in {"killed"}: prefixes.append("[killed]") elif status in {"awaiting_input"}: