fix: 启动时强制清理所有残留数据,避免重复捕捉被跳过

问题:急停后恢复时,内存中的去重集(_seen_messages/_replied_texts)
和语义指纹缓存(_recent_user_queries/_semantic_fingerprint_cache)
残留上次已处理的消息,导致新轮次OCR捕捉到相同内容时,
虽然时间戳已达标但仍被去重逻辑跳过。

修复:在 start() 入口处新增 _force_clear_all_residual_data(),
清理所有内存去重/冷却/缓存状态,不触碰数据库持久化记录。

清理范围:
- 消息去重集:_seen_messages, _replied_texts, _recent_processed_messages
- 语义指纹:_recent_user_queries, _semantic_fingerprint_cache
- 平台冷却:_last_reply_time, _last_new_msg_time, _failed_send_cooldown
- OCR缓存:_last_texts, _raw_clipboard, _last_clipboard_hash, _app_variant
- 响应式冷却:_foreground_cooldown_until, _self_reply_cooldown_until
This commit is contained in:
youpaishidifu
2026-08-19 17:47:49 +08:00
parent e1a1078873
commit e8ca16d1bc
+34 -1
View File
@@ -665,9 +665,40 @@ class MessageMonitor:
def set_emergency_callback(self, cb: Callable[[], None]):
self._emergency_stop_callback = cb
def _force_clear_all_residual_data(self):
"""启动时强制清理所有残留数据,避免重复捕捉被时间戳达标而跳过。
问题场景:
- 急停后恢复,_seen_messages/_replied_texts 中残留上次已处理的消息
- _recent_user_queries 中残留上次查询的语义指纹
- _semantic_fingerprint_cache 中残留同屏碎片指纹
- 导致新轮次OCR捕捉到相同内容时,时间戳已达标但被去重逻辑跳过
清理范围:所有内存中的去重/冷却/缓存状态,不触碰数据库持久化记录。
"""
# 消息去重集
self._seen_messages.clear()
self._replied_texts.clear()
self._recent_processed_messages.clear()
self._recent_user_queries.clear()
self._semantic_fingerprint_cache.clear()
# 平台级时间戳冷却
self._last_reply_time.clear()
self._last_new_msg_time.clear()
self._failed_send_cooldown.clear()
self._failed_consecutive_count.clear()
self._foreground_cooldown_until.clear()
self._self_reply_cooldown_until.clear()
# OCR/cache 状态
self._last_texts.clear()
self._raw_clipboard.clear()
self._last_clipboard_hash.clear()
self._app_variant.clear()
logger.info("[start] 强制清理所有残留数据完成")
def start(self, full_restart: bool = False):
"""启动监控。
Args:
full_restart: True=彻底重启(进程级,重新检测内存恢复GPU)
False=急停/手动停止恢复(软重启,不重新检测内存)
@@ -675,6 +706,8 @@ class MessageMonitor:
if self._running:
return
self._running = True
# ⭐ 启动时强制清理所有残留数据,避免重复捕捉被时间戳达标而跳过
self._force_clear_all_residual_data()
# ⭐ 重置 EasyOCR 状态:确保停止/急停后双引擎仍能搭档作业
# stop() 会杀死子进程,但如果此时有 _call_easyocr_safe 在运行,
# BrokenPipeError 会设置 _easyocr_broken=True,导致重启后 EasyOCR 永久不可用