feat(feishu): cancel recalled messages

This commit is contained in:
AaronZ345
2026-07-19 18:14:31 +08:00
parent 0c76d851cb
commit 177f494207
4 changed files with 221 additions and 3 deletions

View File

@@ -515,6 +515,42 @@ class ChatChannel(Channel):
semaphore.release()
time.sleep(0.2)
def cancel_message(self, session_id: str, message_id: str):
"""Cancel one channel message without disturbing later queued work.
Queued contexts are matched by their original channel message ID. An
in-flight agent run is cancelled through the per-request token that the
channel placed on the context before dispatch.
"""
removed = 0
with self.lock:
session = self.sessions.get(session_id)
if session is not None:
context_queue = session[0]
kept = []
for _ in range(context_queue.qsize()):
context = context_queue.get_nowait()
context_queue.task_done()
message = context.get("msg") if context is not None else None
if getattr(message, "msg_id", None) == message_id:
removed += 1
else:
kept.append(context)
for context in kept:
context_queue.put(context)
from agent.protocol import get_cancel_registry
active = get_cancel_registry().cancel_request(message_id)
logger.info(
"[chat_channel] message recall: session=%s, message=%s, queued=%s, active=%s",
session_id,
message_id,
removed,
active,
)
return removed, active
# 取消session_id对应的所有任务只能取消排队的消息和已提交线程池但未执行的任务
def cancel_session(self, session_id):
with self.lock: