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()
|
||||
except Exception:
|
||||
pass
|
||||
# 取消读取任务,避免孤儿任务
|
||||
stdout_task.cancel()
|
||||
stderr_task.cancel()
|
||||
try:
|
||||
await asyncio.gather(stdout_task, stderr_task, return_exceptions=True)
|
||||
except Exception:
|
||||
pass
|
||||
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}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user