Commit Graph
262 Commits
Author SHA1 Message Date
youpaishidifu 2ac422235b security: 增强代码签名脚本安全选项
- 添加签名描述:WindowMsgBot
- 添加签名URL:https://github.com/ypshidifu/windowmsgbot
- 添加详细输出选项(/v)
- 使用更安全的签名选项
2026-08-08 20:45:42 +08:00
youpaishidifu 86edb4577d security: 延长自签名证书有效期至10年,添加完整证书信息
- 证书有效期从5年延长至10年
- 添加完整证书信息:组织、部门、邮箱
- 增加证书可信度
2026-08-08 20:45:05 +08:00
youpaishidifu e88a2ec49c fix: 加强用户协议内容过滤和停止信号优先级
- 修复_is_noise_text函数:改用re.search替代re.match,新增_AGREEMENT_KEYWORDS多关键词检测
- 短文本(<80字)中匹配>=2个协议特征词才拦截,提高准确率
- 加强停止信号优先级:在OCR处理各阶段添加_running检查点
- 预分割后、stage splitting循环内、逐行过滤前均检查_running
- OCR返回后立即检查_running,确保急停/手动停止响应时间≤单行处理时间
2026-08-08 20:44:30 +08:00
youpaishidifu cbc4a9266a fix: 知识库搜索返回不相干结果
1. DOC_TOPIC_TOKENS添加php映射,修复'PHP登录模式'查询不匹配php.md
2. parent-child逻辑增加条件2:parent body是表格+任何child heading含查询词
3. heading token计算改用heading_no_links,防止链接文字误匹配
4. 查询含'登录插件'时,protect文档降权从0.5改为0.2
5. 新增php登录模式查询boost:php文档section额外x10加分
6. 新增下载意图优先:查询含'下载'时优先返回heading含下载的section
2026-08-08 18:30:02 +08:00
youpaishidifu bc59f0f5ab @
fix: 牛头不对马嘴 + 时间戳过滤强化

问题1 - 牛头不对马嘴:
OCR截屏同时捕获聊天窗口+用户协议文档,协议中的正式法律用语
("玩家应尊重他人的合法权益")被误当成用户消息触发自动回复。
修复: _is_noise_text新增用户协议/服务条款文档内容检测:
- "玩家/用户 应/必须/须/不得 + 尊重/遵守/履行..."
- "运营方/服务提供方 + 有权/有义务/保留"
- "本协议/条款/规定"开头
- 同时含"权利"+"义务"的陈述句(排除疑问句)

问题2 - 时间戳过滤强化:
10:59的消息在12:22仍被处理。非过去日期路径所有时间戳>300s时
仍返回True("放行给DB去重"),导致历史消息重新处理。
修复: _ocr_text_has_fresh_timestamp非过去日期路径改为严格5分钟窗口:
所有时间戳>300s → return False(丢弃),不再放行给DB去重。
@
2026-08-08 12:33:41 +08:00
youpaishidifu 2a2161820f 修复启动卡顿:线程分批启动避免GIL竞争+病句过滤增强 2026-08-08 10:33:48 +08:00
youpaishidifu 7fc737d80f fix: #1448 相关性短查询放行 + #1449 严格300s报废
#1448 auto_reply: _has_content_relevance() 不再对≤2token短查询无条件放行
- 短查询必须整个query作为子串出现在文档中才放行
- 修复下载→前置依赖误匹配(无任何共同token/token交集)

#1449 monitor: 严格300s报废策略
- stage splitting: 继承时间戳>300s一律丢弃,移除新鲜内容/提问豁免
- 区块级: 硬截止从1800s→300s,移除CJK内容/新鲜特征bypass
- 修复16:07消息在21:08仍被处理的问题
2026-08-07 22:42:14 +08:00
youpaishidifu 5c4a17043a fix: 修复两个OCR问题
1. 修复_clean_ocr_prefix误删登录关键词导致答非所问
   - 噪声前缀后必须跟标点/空格或字符串结束,不能紧跟中文字符
   - 登录插件,哪里可以下载到?不再被清理为插件,哪里可以下载到?

2. 修复EasyOCR静默原生崩溃检测
   - 父进程:空stderr+空crash log也计入CUDA崩溃计数,2次后强制CPU
   - Worker:添加CUDA驱动DLL预检,加载失败时强制CPU模式
2026-08-07 14:50:29 +08:00
youpaishidifu 5627a2b88a 修复三个OCR过滤问题:
1. Task #1440: 时间戳过滤器加强到5分钟窗口
   - 继承时间戳超过5分钟(300s)的消息直接丢弃
   - 修复:12:09的消息能通过13:49的过滤器(差100分钟)

2. Task #1441: bot自身消息查库过滤
   - 新增get_recent_bot_replies方法查询数据库
   - 检查OCR读到的内容与数据库中bot回复重合率≥90%则丢弃
   - 修复:bot回复的消息被OCR读到后直接回复用户的问题

3. Task #1442: 数据库时间戳混乱修复
   - 修改record_bot_reply和record_user_message使用本地时间
   - SQLite的CURRENT_TIMESTAMP返回UTC时间导致时间戳混乱
   - 修复:部分消息created_at在凌晨但实际测试不在凌晨

同时包含Task #1436的链接文本清理修复
2026-08-07 14:09:29 +08:00
youpaishidifu ad091561fe 修复3个OCR过滤问题:
1. 时间戳过滤误判:昨天前缀剥离后裸时间戳被当未来时间拦截,添加skip_future_check传递
2. 纯时间戳触发查库:_on_new_message入口检查中文字符,无中文跳过查库
3. 偏旁库补全:添加U+4E28(丨),启用U+4E3F(丿)过滤
2026-08-07 12:43:36 +08:00
youpaishidifu 4635e2c366 修复OCR混合消息导致知识库答非所问:新增反向包含剥离逻辑
问题:OCR截屏把用户新消息和bot旧回复拼成一行,如
登录插件在哪下载?,从未注册过草原,使用全新的邮箱
原剥离逻辑(r in ts)因OCR截断导致精确子串匹配失效,
混合文本传入知识库搜索匹配到invite.md的新用户定义而非正确文档。

修复:在poll过滤阶段新增反向包含剥离——将消息按逗号分段,
检查每段是否为已知bot回复(r)的子串,剥离匹配的bot片段,
保留用户真正提问部分。支持中文逗号和ASCII逗号分隔。
2026-08-07 11:26:39 +08:00
youpaishidifu 87c0bd9f62 fix: 修复时间戳提问豁免无上限+知识库链接文字误匹配
Bug1: 提问豁免(_is_question_message)让继承极老时间戳的消息绕过过滤,
      如22:07的消息在次日10:43仍通过stage splitting放行。
      修复:给提问豁免加24h硬上限,继承时间戳>24h不再豁免。

Bug2: protect.md heading含[sdf1_login登录插件](...)链接,
      heading_no_link_text保留链接文字,导致phrase_in_text匹配触发5x加分。
      修复:新增full_text_phrase(移除整个链接含文字),
      所有短语匹配改为用full_text_phrase,链接文字不再参与评分。
2026-08-07 10:54:47 +08:00
youpaishidifu 9944d74798 fix(easyocr): 顶层崩溃全程留痕,消除"一声不吭"结束进程
- easyocr_worker.py: 新增 worker 状态文件 easyocr_worker_state.json
  (pid/mode/status/last_img_len/ts/error),就绪/忙碌/空闲实时落盘;
  强化 sys.excepthook / _flush_exit / _signal_handler 崩溃写状态+crash.log
- monitor.py: _kill_easyocr_proc 杀前诊断三路
  (状态文件 + 残留stderr + crash.log尾),以 warning 汇总进主日志;
  _read_easyocr_crash_tail 新增 ignore_age 跳过60s时间窗用于诊断路径
- unicode_radicals.md: 丿(U+4E3F)行改 - 不参与偏旁过滤,修复OCR碎片误杀儿下载等
2026-08-06 22:55:29 +08:00
youpaishidifu 3df59c53ad 修复时间戳过期过滤器和hash跳过逻辑
1. 时间戳过期过滤器:移除无条件放行逻辑,时间戳过期超过600s的消息必须丢弃
   - 原逻辑:只要块内有中文消息内容就放行,导致过期消息仍被批准
   - 新逻辑:时间戳过期超过600s且无新鲜特征的消息直接丢弃

2. hash跳过逻辑:消息必须已被回复才能跳过
   - 原逻辑:只要上一帧已入队就跳过,导致消息从未处理过但hash相同时被静默跳过
   - 新逻辑:必须确认消息已被回复(_last_hash_replied),才能跳过
   - 新增_last_hash_replied标志跟踪消息是否已被回复
2026-08-06 21:19:35 +08:00
youpaishidifu 1c16970871 修复知识库搜索答非所问:heading链接文本误触发短语匹配
- 问题:查询"登录插件在哪儿下载?"返回protect文档的"操作方式|是否支持"表格
- 根因:heading_clean保留链接文本(如[sdf1_login登录插件]),导致phrase_in_text误判为True,避免惩罚
- 修复:phrase_in_text检查改用full_text_clean(排除链接文本),确保精确短语匹配准确
- 效果:protect文档因链接文本误匹配的惩罚避免被纠正,sdf1_login文档应优先返回
2026-08-06 20:48:16 +08:00
youpaishidifu ef422ef776 修复急停冻结/消息hash跳过/正常调度冷却误触三处问题
1. 急停冻结: gui.py 将 monitor.stop() 移到后台线程执行,避免 terminate+wait 阻塞 GUI 主线程 6~8s 触发 Windows 冻结弹窗;窗口关闭同样后台 stop。
2. 消息丢失: 仅当上一帧 OCR 已成功入队才允许相同 hash 帧跳过;新增 _is_question_message 提问豁免,使继承极老时间戳的明确提问(如'资源包是强制的,还是可选的?')不再被误判为远古历史永久丢弃。
3. 正常调度冷却: 正常资源释放(每N次调用杀进程)清除残留 30s 冷却并重置失败计数器;正常重启握手阶段的初始化超时/崩溃/协议/握手错误不再施加 30s 冷静期,交由系统自行调度启停。
2026-08-06 20:32:50 +08:00
youpaishidifu 59505fdafd 修复知识库搜索两个bug:
1. 否定式查询惩罚: 查询'是否X'时不含核心名词section×0.3,在reranking后执行
2. 子串回退: token交集失败时用2-6字子串匹配(解决jieba碎片token问题)
2026-08-06 18:59:36 +08:00
youpaishidifu f84ea56311 修复知识库搜索粒度:parent section是表格时优先返回child sections
- 添加_build_parent_child_map方法构建section层级关系
- 当parent section有heading命中但body是表格时,优先返回child sections
- 最终结果按分数排序确保最高分排第一
- 修复'安装说明'查询返回插件表格而非下载链接的问题
2026-08-06 17:17:20 +08:00
youpaishidifu 1291a402de 修复三个问题:消息搅和打包、QQ系统消息过滤、OCR噪声残片过滤
1. 消息搅和打包修复(#1414):
   - 将'同poll多条取最后'逻辑改为遍历处理所有消息
   - 每条消息独立处理,不再丢弃旧消息
   - 基线轮只处理一次,后续消息正常处理

2. QQ系统消息残片过滤(#1415):
   - 添加'你撤回了, 条消息'模式匹配
   - 添加'撤回了一条消息'模式匹配
   - 在_is_system_message函数中实现

3. OCR噪声残片过滤:
   - 添加'留, C'等逗号+字母组合噪声模式
   - 添加纯逗号+字母噪声模式
   - 在_is_noise_text函数中实现
2026-08-06 16:56:28 +08:00
youpaishidifu 4c044c6e7c fix: 时间戳过滤器1漏消息——疑问句特征正则过严
_looks_fresh_content 原正则 (疑问词)\s*[??] 只匹配空白不匹配汉字,
导致'如何配置的?'/'在哪可以下载?'等正常疑问句(疑问词与问号间隔文字)匹配失败,
整块OCR文本被静默丢弃('登录插件在哪可以下载?'丢失)。

修复:
1. _looks_fresh_content 改为允许疑问词与问号间 ≤30 字非句末标点(同句内)
2. 最新时间戳≤600s 分支增加 _block_has_cjk_message 兜底放行,与硬截止分支一致

经诊断脚本复现确认:修复前返回False(丢弃),修复后返回True(放行)
2026-08-06 16:34:24 +08:00
youpaishidifu 41436cbe27 fix: 进程名正则空备选项导致所有文本被误杀
墨刀|) → 墨刀),去掉多余的|形成空备选项
此前^(?:...|墨刀|)匹配所有文本(空字符串开头=任何文本)
2026-08-06 16:12:00 +08:00
youpaishidifu 1169487dda fix: EasyOCR崩溃日志残留+锁竞争误杀
1. 新增_truncate_easyocr_crash_log():worker成功启动后截断崩溃日志,清除旧条目防止混淆用户
2. 锁竞争超时(15s)不再计入consecutive_failures:worker在忙处理大图是正常行为,不触发杀进程
3. 锁超时仅重置call_count防止'正常释放'误触发
2026-08-06 16:02:33 +08:00
youpaishidifu 88593898be 强化EasyOCR超时计数:锁竞争超时/内层超时/外层超时/BrokenPipe均计入consecutive_failures+重置call_count,防'3次超时却正常释放'误触发 2026-08-06 14:28:33 +08:00
youpaishidifu 37ce6a0916 修复消息静默丢失+微信唤醒不稳定:_is_noise_text进程名正则缺失闭合括号导致异常返回空列表(QQ/微信均受影响);_ensure_foreground增加keybd_event骗取前台权限+SetWindowPos强置顶兜底 2026-08-06 10:43:21 +08:00
youpaishidifu 8575b5141b 修复语法错误:内存检查逻辑移回try块内,修复空行缩进问题 2026-08-06 10:03:50 +08:00
youpaishidifu 4ef261bfe7 修复语法错误:内存检查逻辑移回try块内 2026-08-06 09:54:15 +08:00
youpaishidifu 53175f57eb 修复EasyOCR三个问题:正常调度误判、内存检测误判、消息hash漏消息 2026-08-05 23:20:00 +08:00
youpaishidifu 4418a46460 修复三个问题:时间戳过滤放宽、系统进程名过滤、EasyOCR CUDA崩溃修复
1. 放宽时间戳过滤:窗口30s→60s,消息长度4字→20字,包含中文即放行
2. 添加系统进程名过滤:200+个Windows/第三方进程名模式,防止混入OCR文本
3. EasyOCR崩溃修复:检测内存不足时设置CUDA_VISIBLE_DEVICES=''禁用CUDA,避免import torch加载CUDA库导致崩溃
2026-08-05 21:57:53 +08:00
youpaishidifu f50eeb28da fix: 消除 sklearn TfidfVectorizer token_pattern 警告 2026-08-05 21:23:22 +08:00
youpaishidifu 5d9214526b fix: Bug F 修复回复混合和缺失步骤问题
- 修改guide query合并逻辑,按parent guide分组sections
- 根据查询关键词选择最相关的guide(url/图床→非正版guide,正版/官网→正版guide)
- 避免混合不同guide的内容,确保第一步不被遗漏
- 测试验证:url查询返回URL操作方式,官网查询返回正版玩家操作方式
2026-08-05 20:14:23 +08:00
youpaishidifu fd5d2ee73a 修复内存泄漏和回复截断问题
1. 内存泄漏修复(Bug D):
   - 在 easyocr_worker.py 中添加 GPU 清理函数和信号处理器
   - 在 monitor.py 中创建 _kill_easyocr_proc() 辅助方法
   - 使用 terminate→wait→kill→gc.collect() 安全终止序列替换所有直接 kill()
   - 确保 CUDA 上下文在子进程退出时正确清理

2. 回复截断修复(Bug E):
   - 在 knowledge_base.py 的 search() 方法中检测指南类查询
   - 对于步骤类查询(如何/怎么/教程等),合并同一文档的所有步骤 section
   - 确保用户获得完整的操作指南而非单个步骤
2026-08-05 17:56:07 +08:00
youpaishidifu 5b20037052 fix: 修复提交量阈值过严导致CUDA误拒绝(Bug C)
- 提交量检查从绝对阈值(物理内存×1.5)改为百分比阈值(提交量/总量>90%)
- 页面文件百分比阈值从85%提高到95%
- 解决系统有大页面文件时提交量被误判为过高的问题
2026-08-05 15:49:17 +08:00
youpaishidifu 4aeb03d869 fix: 内存误判(psutil→GlobalMemoryStatusEx) + 时间戳硬截止(>30min丢弃)
- easyocr_worker.py: 删除psutil物理内存检查,统一使用GlobalMemoryStatusEx
  (Windows上psutil可比Task Manager少报~1.7GB,导致4.2GB可用误判为2.5GB)
- monitor.py: _ocr_text_has_fresh_timestamp()加硬截止——最新时间戳>1800s(30min)
  无论是否含CJK均丢弃,修复15:09看到13:34消息(90min前)被误回复
- 新增_timestamp_age_seconds()辅助方法
2026-08-05 15:25:33 +08:00
youpaishidifu d8c0e62a2d 修复跨平台答案混用: 表格优先策略必须检查heading语义相关性
- 表格优先策略: 不再盲目优先含'操作'的表格, 只优先heading与查询有交集的表格
- 表格兜底策略: 同上, 只兜底与查询语义相关的操作/支持表格
- 表格内容奖励: 同上, 3.0x加权只给与查询相关的表格
- 根因: '操作方式'表(交互模式)含'操作'被盲目优先, 覆盖了'权限级别'表
- 测试: '权限级别'→权限级别表格(20.51), '操作方式'→操作方式表格(49.54)
2026-08-05 15:01:00 +08:00
youpaishidifu 49a95fb808 修复commit charge阈值判断和OCR乱码字符检测 2026-08-05 14:47:44 +08:00
youpaishidifu cd2e1f5e36 fix: .gitignore 补全无下划线前缀的调试/测试脚本规则 - 曾有 debug_kb.py/test_kb.py 因命名绕过 _debug_*/_test_* 规则待被误入库 2026-08-05 14:30:50 +08:00
youpaishidifu a181c18c79 移除不应入库的文件:数据库、调试脚本、测试脚本;更新.gitignore 2026-08-05 13:36:57 +08:00
youpaishidifu 4d7017be6a 修复知识库搜索:表格内容不再被切分,表格section优先返回
- knowledge_base.py: _split_body_by_list_items检测表格区域,不切分表格行
- knowledge_base.py: 添加独立表格section,确保表格内容可被搜索匹配
- knowledge_base.py: 表格兜底策略:最佳文档含操作/支持表格时强制加入并置顶
- knowledge_base.py: reranking后无条件优先返回含操作/支持的表格section
- .gitignore: 添加msg_history.db和诊断脚本到忽略列表
2026-08-05 13:22:27 +08:00
youpaishidifu 271ea21489 fix: 偏旁过滤失效 - Unicode列改为真实码点+常用字同形写-防误杀 (windowmsgbot) 2026-08-05 10:43:26 +08:00
youpaishidifu 3bae125392 修复漏消息:gate整块丢弃+行合并黏时间戳+stage尾部连坐 (windowmsgbot)
- 新增 _block_has_cjk_message:整屏时间戳全过期但含中文消息内容时放行给下游去重

- gate 两个全过期分支改为含中文消息内容即放行,不再整块丢弃连坐新消息

- stage splitting 中段/尾部不再按继承旧时间戳丢弃,仅>2h且非新鲜才丢远古历史

- 行合并增加 _TS_START 正则,禁止独立时间戳行被黏进消息

- 新增 _normalize_timestamps 规整 OCR 逐字空格/全角冒号时间戳,修复孤儿空格导致漏消息

- 内存泄漏修复保持不动(锁超时/句柄释放/启动失败计数/双重内存预检/看门狗)
2026-08-04 21:31:35 +08:00
youpaishidifu 7d3c73a3bf fix: OCR噪声检测 - 用户消息与bot回复相似度≥90%时跳过
问题:OCR把bot回复内容误识别为用户消息,导致重复回复
根因:EasyOCR读取屏幕时,把右侧bot回复区域的文本也读取为用户消息
修复:
- 新增_last_bot_reply_content变量存储最近bot回复内容
- record_bot_reply方法更新该变量
- 消息处理前检查相似度,≥90%则跳过
- 添加SequenceMatcher导入
2026-08-04 15:44:25 +08:00
youpaishidifu 7e6d105b73 fix: EasyOCR超时也计入连续失败计数 - 防止超时跳过绕过杀进程逻辑
问题:连续3次EasyOCR超时未触发杀进程,因为'超时跳过'日志未增加失败计数器
根因:只在_q.get()返回None时增加计数器,线程超时is_alive()检查未增加计数器
修复:EasyOCR线程超时时也增加_easyocr_consecutive_failures,达到阈值触发杀进程
2026-08-04 15:27:06 +08:00
youpaishidifu 33848de623 fix: 修复cleaned_item未定义错误 - 调整清理顺序
问题:QQ轮询时cleaned_item变量未定义
根因:OCR清理函数调用顺序错误,在使用变量后才定义变量
修复:将cleaned_item = self._clean_ocr_prefix(item)移到使用前
2026-08-04 15:14:40 +08:00
youpaishidifu 597ed7d2fd fix: 微信窗口被覆盖时无法唤醒 - 保留PID快速EnumWindows + 冷却缩短到10s
问题根因:
1. UIA (auto.WindowControl) 在窗口被其他程序覆盖时搜索不稳定
2. 缓存HWND验证失败时,PID也被清空,导致每次都要从psutil全进程扫描重新找PID
3. 搜索失败后30s冷却太长

修复:
- 仅清HWND,保留PID供后续EnumWindows快速复用(毫秒级,跳过psutil扫描)
- 新增PID快速路径:验证失败后先用缓存PID直接EnumWindows,再走UIA和psutil兜底
- 冷却时间从30s缩短到10s,加快恢复轮询
2026-08-04 14:03:19 +08:00
youpaishidifu a3b0e35581 fix: EasyOCR内存不足时强制CPU模式,避免CUDA加载导致系统冻结
- monitor.py: 内存阈值从2GB提高到3GB,CUDA加载torch需要大量内存
- easyocr_worker.py: 新增物理内存预检(3GB阈值),不足时强制CPU模式
- easyocr_worker.py: _init_reader()再次检查物理内存,双重保障
- 改进错误日志:记录内存详细信息(总量、使用率)
- 解决:内存不足时仍加载CUDA导致电脑冻结的问题
2026-08-04 12:18:54 +08:00
youpaishidifu 7d8d39f7b6 fix: 修复OCR日期提取错误导致时间戳误判为未来的问题
- OCR常把日期和时间连在一起:2026/8/319:45:20 → 匹配到2026/8/31(未来/非法)
- 改进日期解析:从d向下截断,找到第一个合法且≤今天的日期
- 处理:2026/8/31(未来8月31日)→ 2026/8/3(过去8月3日)
- 处理:2026/8/32(非法日期)→ 2026/8/3(过去8月3日)
- 这样has_past_date=True,时间戳19:44/21:13等不会被误判为未来时间
2026-08-04 09:47:57 +08:00
youpaishidifu 161d2dd95b 修复基线抑制后截图 hash 导致消息被跳过的问题:
- 基线抑制时清除截图 hash(_last_screenshot_hash.pop)
- 防止下次轮询时 hash 相同直接跳过 OCR,导致消息永远等不到回复
- 更新注释:从'三项关键处置'改为'四项关键处置'
2026-08-03 23:07:01 +08:00
youpaishidifu d6691f6037 修复 EasyOCR 连续启动失败不触发重启的问题:
- 新增 _easyocr_consecutive_startup_failures 计数器,跟踪子进程无法启动的次数
- 当连续3次启动失败时,清除冷却时间并重置状态,强制重试启动
- 前2次保留冷却(预留初始化时间),第3次强制清除冷却
- 在所有重置 _easyocr_consecutive_failures 的地方同步重置启动失败计数
- 解决 EasyOCR 全程未启动但从未触发杀进程重启的问题
2026-08-03 22:34:22 +08:00
youpaishidifu 795a245de7 修复两个bug:
1. 问题3:OCR逗号断行 - 在_process_ocr_output中添加连续行合并逻辑,防止EasyOCR将中文逗号视为行边界导致消息前半段丢失
2. 问题4:回复重试逻辑失效 - 为_paste_and_send添加force_retry参数,_execute_reply重试时跳过60秒冷却检查,实现真正的5秒间隔重试机制
2026-08-03 21:31:14 +08:00
youpaishidifu d87e482e1e 修复微信端知识库答非所问 + QQ OCR 漏消息(双 bug 修复)
knowledge_base.py(问题2:微信端答非所问):
- 文档级标题语义匹配改为 token 级(原仅字面子串匹配),OCR 丢失"php"只剩"管理员端默认"也能正确命中 phpadmin
- 新增"管理员+默认"组合强偏好:无"领地"时 phpadmin ×3.0、protect ×0.4,避免退化查询误选 protect/全局配置
- section 级重排新增 bonus +30:查询含"管理员+默认"时,偏好正文真正含"密码/登录/ypshidifu"的 section,压过"## 目录"目录项

monitor.py(问题1 + 问题2 上游):
- 新增 _split_and_denoise_segments:按消息边界预分割 + 分段噪声隔离,修复 Windows OCR 大杂烩把用户消息当噪声整段丢弃(QQ 漏消息)
- 候选行剥离 bot 自身旧回复文本:OCR 把用户新提问与屏上 bot 旧回复拼成一行时,先剥离旧回复再走过滤,消除答非所问的上游拼接根因

测试:新增 debug_kb.py 复现退化查询、test_kb.py 回归;跨主题回归全部正确,py_compile 通过
2026-08-03 20:52:08 +08:00