Commit Graph
246 Commits
Author SHA1 Message Date
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
youpaishidifu 8ed93382e0 修复两个bug:1. EasyOCR线程崩溃(_OCR_TIMEOUT未定义) 2. 知识库搜索优化(核心名词匹配奖励+文档标题语义匹配) 2026-08-03 18:17:43 +08:00
youpaishidifu 47996cd1b8 微信窗口验证修复:支持国内版weixin.exe进程名 2026-08-03 17:44:43 +08:00
youpaishidifu f95a711c8c 搜索结果显示增强,展示更多匹配详情 2026-08-03 17:32:18 +08:00
youpaishidifu c51a585bb9 微信窗口验证增强日志,诊断窗口无效原因 2026-08-03 17:32:04 +08:00
youpaishidifu c3a210efef 知识库搜索优化:列表项二次切分,提升细粒度匹配精度 2026-08-03 17:31:45 +08:00
youpaishidifu 24036ecab9 fix: indentation error in _is_white_bubble_pixel decorator 2026-08-03 16:48:24 +08:00
youpaishidifu c6c8cc0571 @
fix: 微信颜色检测放宽+KB精确匹配+自动回复重试

1. monitor.py - 微信白色气泡检测阈值放宽(>=245->>=240, >=3->>=2)
   适配新版微信UI颜色变化,减少漏检
2. knowledge_base.py - 精确短语匹配(5x加分)+子串匹配(2.5x/1.5x)
   防止查询被不相关文档抢走高分
3. gui.py - 自动回复发送失败重试(3次/5秒间隔)
   连续失败退避本轮,避免反复抢焦点
4. .gitignore - 补充build目录下的证书/构建产物
@
2026-08-03 16:42:21 +08:00
youpaishidifuandWorkBuddy 708bcbf315 fix: 微信截图调试诊断 - 调试截图提前保存+PrintWindow失败回退
- 调试截图保存提前到所有检查之前(之前在size check之后,太小的图不保存)
- PrintWindow结果太小(<50px)时自动回退到屏幕截图
- 添加详细诊断日志(唤醒结果、可见性、前台状态、截图尺寸)
- QQ截图同样优化(PrintWindow太小回退+调试截图提前保存)

根因:微信PrintWindow返回None或空白图时,代码直接return[]不保存任何调试图片
导致用户看到截屏文件夹空白但日志说继续截图

Co-Authored-By: WorkBuddy <noreply@workbuddy.ai>
2026-08-03 16:13:23 +08:00
youpaishidifu 99e2a1cfe7 fix: 两个问题修复
1. QQ截图路径空值导致[Errno 2]错误 - 添加时间戳生成路径
2. 窗口被遮挡时使用PrintWindow API截取内容
   - 新增_screenshot_window函数使用PrintWindow API
   - QQ和微信截图逻辑:当窗口不在前台时尝试PrintWindow
   - PrintWindow失败时回退到屏幕截图
2026-08-03 15:42:36 +08:00
youpaishidifu 2162a49068 fix: 昨天的时间戳不再被误判为今天未来的21:14
- 在_ocr_text_has_fresh_timestamp中提取日期信息(如2026/8/2)
- 如果日期是过去的(昨天或更早),跳过未来时间戳拦截
- 修改_is_timestamp_old函数,添加skip_future_check参数
- 解决问题:OCR文本包含2026/8/2 21:14:38,被误判为今天未来的21:14
2026-08-03 15:20:28 +08:00
youpaishidifu b07fc75d99 @
fix: window activation bug - verify PID before using cached HWND

Root cause: _ensure_hwnd cached HWND without verifying the owning process.
When target app exits, OS reuses HWND value for another process, causing
activation of wrong window (e.g. browser/editor disguised as QQ/WeChat).

Changes:
- Add _validate_wechat_window() to verify process name == WeChat.exe
- _ensure_hwnd cache hit: verify HWND belongs to target process via PID
- TXGuiFoundation fallback: verify PID belongs to QQ.exe/TIM.exe
- _find_qq_window_fresh: same PID verification for TXGuiFoundation
- _ocr_read_wechat: validate window before OCR capture
- Raise min window size threshold from 200x100 to 300x200 everywhere
@
2026-08-03 14:47:23 +08:00
youpaishidifu eb5a260534 build.bat: default skip cert+sign, fixed arg parsing for PowerShell 2026-08-03 12:48:39 +08:00
youpaishidifu a9b853ec0a sign.bat: replace all Chinese with pure ASCII to fix GBK encoding issue 2026-08-03 12:39:35 +08:00
youpaishidifu 1814f42d0e build.bat: fix cmd variable expansion - PYINSTALLER var caused whole string to be treated as single command 2026-08-03 12:30:57 +08:00
youpaishidifu 00235dd0b6 build脚本GBK编码+参数解析修复(去除所有前缀后匹配) 2026-08-03 11:13:36 +08:00
youpaishidifu 686aae7e53 build.bat参数解析兼容PowerShell+gitignore修正保留构建脚本 2026-08-03 11:03:57 +08:00