diff --git a/modules/terminal_manager.py b/modules/terminal_manager.py index 9d29f98..ebc4713 100644 --- a/modules/terminal_manager.py +++ b/modules/terminal_manager.py @@ -131,6 +131,9 @@ class TerminalManager: # 当前活动终端 self.active_terminal: Optional[str] = None + + # 记录每个终端的连续 timeout 次数,用于给出更合适的提示 + self._terminal_input_timeout_streaks: Dict[str, int] = {} # 终端工厂(跨平台支持) self.factory = TerminalFactory() @@ -314,6 +317,7 @@ class TerminalManager: # 从字典中移除 del self.terminals[session_name] + self._terminal_input_timeout_streaks.pop(session_name, None) # 如果是活动终端,切换到另一个 if self.active_terminal == session_name: @@ -373,6 +377,7 @@ class TerminalManager: terminal.close() del self.terminals[target_session] + self._terminal_input_timeout_streaks.pop(target_session, None) sandbox_options = self._build_sandbox_options() new_terminal = PersistentTerminal( @@ -562,6 +567,7 @@ class TerminalManager: ) result["timeout"] = base_timeout result["never_timeout"] = False + self._apply_terminal_input_timeout_hint(target_session, result) return result # never_timeout 分支:不包装命令,不发送结束标记,不强杀进程 @@ -574,8 +580,27 @@ class TerminalManager: ) result["timeout"] = "never" result["never_timeout"] = True + self._apply_terminal_input_timeout_hint(target_session, result) return result + def _apply_terminal_input_timeout_hint(self, session_name: str, result: Dict) -> None: + """在终端输入连续超时时追加提示标记(仅数值型 timeout)。/ Add hint after consecutive timeouts (numeric only).""" + status = (result.get("status") or "").lower() + never_timeout = result.get("never_timeout") + if never_timeout is None: + timeout_value = result.get("timeout") + if isinstance(timeout_value, str) and timeout_value.lower() == "never": + never_timeout = True + if status == "timeout" and not never_timeout: + streak = self._terminal_input_timeout_streaks.get(session_name, 0) + 1 + else: + streak = 0 + self._terminal_input_timeout_streaks[session_name] = streak + if streak == 2: + result["timeout_hint"] = "suggest_adjust_timeout" + elif streak == 3: + result["timeout_hint"] = "suggest_never_timeout" + def _build_wrapped_command(self, command: str, marker: str, timeout: int) -> (str, int): """ 构造带超时与完成标记的包装命令。 diff --git a/utils/tool_result_formatter.py b/utils/tool_result_formatter.py index 3e46137..07a1ffb 100644 --- a/utils/tool_result_formatter.py +++ b/utils/tool_result_formatter.py @@ -403,7 +403,15 @@ def _plain_command_output(result_data: Dict[str, Any]) -> str: def _format_terminal_input(result_data: Dict[str, Any]) -> str: - return _plain_command_output(result_data) + text = _plain_command_output(result_data) + timeout_hint = result_data.get("timeout_hint") + if timeout_hint == "suggest_adjust_timeout": + suggestion = "请根据指令和输出结果判断是否需要提高超时时间或修改指令输入" + return f"{text}\n{suggestion}" if text else suggestion + if timeout_hint == "suggest_never_timeout": + suggestion = "请考虑设置timeout为never,让终端持续执行该命令(⚠️注意 在该命令彻底执行完成前该终端会被占用,处于不可输入的状态)" + return f"{text}\n{suggestion}" if text else suggestion + return text def _format_sleep(result_data: Dict[str, Any]) -> str: