feat: implement graceful tool cancellation on stop request
- Add stop flag monitoring loop (checks every 100ms during tool execution) - Cancel tool task immediately when stop flag is detected - Return cancellation message to conversation history with role=tool - Save cancellation result: '命令执行被用户取消' - Clean up pending tasks to prevent 'Task was destroyed but it is pending' warnings - Fix terminal_ops.py to properly cancel stdout/stderr read tasks Known issue: Tool result display in frontend still shows arguments instead of cancellation message when expanded Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
07be7a1061
commit
823b1e105e
@ -537,6 +537,13 @@ class TerminalOperator:
|
|||||||
process.kill()
|
process.kill()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
# 取消读取任务,避免孤儿任务
|
||||||
|
stdout_task.cancel()
|
||||||
|
stderr_task.cancel()
|
||||||
|
try:
|
||||||
|
await asyncio.gather(stdout_task, stderr_task, return_exceptions=True)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
raise
|
raise
|
||||||
|
|
||||||
# 确保读取协程结束
|
# 确保读取协程结束
|
||||||
|
|||||||
@ -484,3 +484,5 @@ async def execute_tool_calls(*, web_terminal, tool_calls, sender, messages, clie
|
|||||||
|
|
||||||
|
|
||||||
return {"stopped": False, "last_tool_call_time": last_tool_call_time}
|
return {"stopped": False, "last_tool_call_time": last_tool_call_time}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user