From f03446a3bb9c5c19369e4ee5e0ee6ec46dc69fe9 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Mon, 22 Jun 2026 14:17:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20task=20=E7=BB=93=E6=9D=9F=E6=97=B6?= =?UTF-8?q?=E6=B8=85=E7=90=86=E6=AE=8B=E7=95=99=20pending=20runtime=20mode?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E4=B8=8B=E6=AC=A1=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E9=94=99=E8=AF=AF=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 场景:模型最后一次输出(无工具调用)后、task 仍 running 时切换权限/执行环境, 进入 queue_*_change 只设置 pending,task 随即结束未进入工具循环, pending 残留到下次工作首次工具调用时才被应用并插入变更通知。 修复:在 handle_task_with_sender 末尾调用 apply_pending_runtime_mode_changes 立即应用并清空 pending,丢弃生成的 notices(等同空闲期切换语义)。 --- server/chat_flow_task_main.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/server/chat_flow_task_main.py b/server/chat_flow_task_main.py index 8859e70..cf27bc1 100644 --- a/server/chat_flow_task_main.py +++ b/server/chat_flow_task_main.py @@ -1695,6 +1695,25 @@ async def handle_task_with_sender( socketio.start_background_task(run_bg_poll) has_running_completion_jobs = has_running_sub_agents or has_running_background_commands + + # 任务结束时清理残留的 pending runtime mode(权限/执行环境/网络权限)。 + # 场景:用户在模型最后一次输出(无工具调用)后、task 仍为 running 状态时切换了 + # 权限/执行环境,此时会进入 queue_*_change 路径只设置 pending,但 task 随即自然 + # 结束,不会进入 execute_tool_calls → apply_pending_runtime_mode_changes。 + # 若不在此清理,pending 会残留到下一次工作首次工具调用时才被应用, + # 并把"变更通知"作为 user 消息注入到新一轮对话中(bug)。 + # 正确行为:task 结束时立即应用 pending(等同空闲期切换),但不生成通知。 + try: + if hasattr(web_terminal, "apply_pending_runtime_mode_changes"): + residual_notices = web_terminal.apply_pending_runtime_mode_changes() or [] + if residual_notices: + debug_log( + "[RuntimeMode] task 结束时应用残留 pending runtime mode,丢弃通知: " + f"{[n.get('source') if isinstance(n, dict) else n for n in residual_notices]}" + ) + except Exception as exc: + debug_log(f"[RuntimeMode] task 结束时清理 pending runtime mode 失败: {exc}") + pending_runtime_guidance_messages: List[str] = [] try: from .tasks import task_manager