Initial import

This commit is contained in:
2026-09-04 21:46:38 +08:00
commit 5e3aa97644
36 changed files with 4608 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# M1 技术验证验收记录(2026-09-04)
## 环境
- Windows:10.0.19044,主机 `DESKTOP-EGI7QCK`
- 用户会话:`Rogee`,Session 1,活动 console
- 微信:4.1.8.29
- 部署目录:`C:\Users\Rogee\wx-agent`
- 默认测试目标:文件传输助手
## Linux 检查
```bash
dotnet test tests/WxAgent.Core.Tests -c Release
dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true
dotnet publish src/WxAgent.Host -c Release -r win-x64 --self-contained true \
-p:EnableWindowsTargeting=true -p:PublishSingleFile=true \
-p:IncludeNativeLibrariesForSelfExtract=true -p:PublishTrimmed=false
```
结果:Core 测试 9/9 通过;Release 构建 0 warnings、0 errors;单文件发布成功。
## 真机结果
- `doctor`:登录后主窗口、`MainView` 和 `session_list` 检测正常;未选择聊天时不再误报 UI 结构变化。
- 文件传输助手:可按会话 AutomationId 直接激活;会话未出现时可通过搜索结果 AutomationId 激活。
- `chat send`:唯一 ASCII 标记发送成功,随后 `chat read --include-content` 精确读回。
- 输入法兼容:最初使用模拟键盘输入时观察到输入法组合态改变消息。改为 UIA ValuePattern 直接设置文本,并在发送前逐字读取校验;不一致时中止发送,不执行盲目重试。修复后发送和精确读回通过。
- `chat listen`:监听期间由另一个 CLI 进程发送唯一标记;UIA 结构事件配合两秒低频轮询发现 1 条新消息。
- `smoke --timeout 45`:`doctor`、脱敏 UI 树、唯一文本发送和读回确认全部通过;导出 168 个脱敏节点。
- 微信重启恢复:停止所有 Weixin 进程并重新启动后,微信要求手机确认登录;用户正常确认后出现 5 个 Weixin 进程,CLI 无需重启服务即可重新附加,发送、读取、监听和消息级 smoke 再次通过。
- Session 断开:RDP 会话断开时输入 API 返回 access denied/invalid handle;恢复为活动 console 后正常。该行为由 `doctor`/`SessionLocked` 边界约束,不尝试绕过桌面会话限制。
## 结论
M1 Go/No-Go:**Go**。
发送、读取、监听和恢复均通过 UIA 元素定位及实时边界中心兜底完成,没有维护固定绝对坐标。发送写操作只执行一次;若输入内容或发送结果无法确认,返回 `ResultUnconfirmed`,不自动重试。
+32
View File
@@ -0,0 +1,32 @@
# M1A/Foundation + Database MVP 真机验收
日期:2026-09-04
主机:`DESKTOP-EGI7QCK` / Windows `10.0.19044.0`
微信:`Weixin.exe 4.1.8.29`
状态:M1A 通过;M1 仍未完成。
## Linux
- .NET SDK:`8.0.424`
- `dotnet test tests/WxAgent.Core.Tests -c Release`:7/7 通过。
- `dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true`:0 warning / 0 error。
- self-contained single-file `win-x64` 发布成功;产物约 182 MB,包含自提取 SQLCipher native library。
## Windows
- `doctor`:发现 4 个 Weixin 进程,版本均为 4.1.8.29;4/4 可用最小只读权限打开;发现 1 个账号数据库根目录。
- SSH 在 Session 0 运行时正确报告 `SessionLocked`,不伪装为 UIA 成功。
- `inspect-ui`:通过 InteractiveToken 任务在 Session 1 执行成功;导出 166 个节点。离线校验确认所有非空 Name 均为长度+短哈希,AutomationId 仅保留已知结构常量或长度+短哈希;未出现原始 `session_item_*` 后缀及明文“微信”/“发送”等名称。
- `smoke`:在 Session 1 执行成功,`doctor` 无错误、6/6 关键控件命中,并再次导出 166 个脱敏节点。
- `db scan --save`:扫描 4 个进程,发现 17 个数据库,page 1 HMAC 验证 17/17;普通 CLI 输出不含完整密钥。
- 密钥文件 ACL:继承关闭,仅 `DESKTOP-EGI7QCK\Rogee` 拥有 FullControl。
- `db query`:只读打开 `contact/contact.db`,运行时报告 SQLCipher `4.5.2 community`、SQLite `3.39.2`,读取 26 个 schema 对象,写入探针被拒绝。
- 首轮评审后补充验证:WCDB 长十六进制游程使用定长缓冲;不可读/跳过内存区不再拼接候选;密钥临时文件在写入任何密钥字节前即关闭继承并限制到当前用户;重复扫描会合并历史账号/数据库;发现、扫描和 UIA 路径均传播取消;CLI 拒绝未知、重复、缺值和非法超时参数。
- 验收结束后删除测试密钥文件;未生成解密数据库副本。
## 已知风险
- `SQLitePCLRaw.bundle_e_sqlcipher` 2.1.11 已弃用且内置 SQLite 3.39.2;它仅获准用于当前开发与真机验证。正式商业发布前必须完成许可/安全基线 gate;若不接受,应改用 Zetetic 官方 SQLCipher for .NET 并重新执行数据库验收。
- 尚未实现 PID 打开文件句柄与账号根目录的关联,证据等级仅为 `PageHmacVerified`,不能表示账号当前 active。
- 正在写入的 WAL 数据库可能出现只读一致性/锁问题;本次元数据查询成功,暂不增加解密副本或快照逻辑。
- M1 尚缺文件传输助手打开、发送/读回、新消息发现和微信重启恢复。
@@ -0,0 +1,66 @@
# M2 会话搜索、引用和历史读取验收(2026-09-04)
## 环境
- Windows 10.0.19044,`DESKTOP-EGI7QCK`
- 用户 `Rogee`,Session 1 活动 console
- 微信 4.1.8.29
- 验收目标仅使用文件传输助手
## Linux 验证
```bash
dotnet test tests/WxAgent.Core.Tests -c Release
dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true
dotnet publish src/WxAgent.Host -c Release -r win-x64 --self-contained true \
-p:EnableWindowsTargeting=true -p:PublishSingleFile=true \
-p:IncludeNativeLibrariesForSelfExtract=true -p:PublishTrimmed=false
```
结果:Core 测试 13/13 通过;Release 构建 0 warnings、0 errors;Windows 单文件发布及部署成功。
## 真机验收
### 会话搜索和精确匹配
```powershell
WxAgent.Host session search --query 文件传输助手 --exact
WxAgent.Host session open --name 文件传输助手
```
- 搜索退出码 0,返回 1 个结果。
- 结果名称逐行精确匹配“文件传输助手”,`IsExactMatch=true`;不会把“文件传输助手测试”等部分匹配作为精确结果。
- 会话打开退出码 0,当前会话确认成功。
- 搜索框文本使用 UIA ValuePattern 设置并逐字确认,完成后恢复原值。
### 真实引用回复与解析
```powershell
WxAgent.Host chat reply-latest --text wxagent-quote-<随机标记> --timeout 60
WxAgent.Host chat read --limit 30 --include-content
```
- 使用消息行实时边界右侧的发送方气泡位置打开右键菜单,不维护固定屏幕坐标。
- 引用回复发送退出码 0,产生新的可见消息。
- 当前微信可访问名称实测格式:`回复文本\n引用 Rogee 的消息 : 图片`。
- 解析结果:回复正文精确匹配;引用发送者为 `Rogee`;引用正文为“图片”。
- CLI 未指定 `--include-content` 时,正文和引用内容均输出为 `null`。
### 历史滚动和去重
```powershell
WxAgent.Host chat history --limit 100 --scrolls 4 --timeout 60
```
- 在 `chat_message_list` 实时边界中心执行鼠标滚轮向上读取,结束后回滚到原方向。
- 使用可访问名称和同文本出现序号生成稳定 SHA-256 指纹,避免 UIA RuntimeId 在元素刷新后变化导致重复。
- 真机结果:退出码 0,读取 7 条消息,7 个唯一指纹,重复数 0。
- 类型结果:Text 4、File 2、Image 1。
- 默认输出正文和引用均为空,隐私检查无泄漏。
- RDP 会话断开时滚轮输入返回 access denied;通过 `doctor`/Session 约束识别,恢复活动 console 后同一命令通过,不绕过桌面会话边界。
## 结论
本轮目标通过:会话搜索输出及精确匹配、真实引用回复解析、历史滚动读取和有界去重均完成代码、测试、部署和真机验收。
尚未宣称整个 M2 里程碑完成:计划中的 500 条连续发送与 100%/125%/150% DPI 总体验收仍属于后续 M2 稳定性工作,不在本轮目标内。
@@ -0,0 +1,99 @@
# M3 监听和完整消息模型验收(2026-09-04)
## 环境
- Windows 10.0.19044,`DESKTOP-EGI7QCK`
- 用户 `Rogee`,Session 1 活动 console
- 微信 4.1.13.63
- 验收目标仅使用文件传输助手
- Windows PowerShell 5.1 验证脚本如包含中文常量,使用 UTF-8 BOM 或 `-EncodedCommand`;无 BOM 的临时脚本会把中文参数显示为乱码,但 Host 原始 UTF-8 JSON 和 Unicode 命令行参数验证为正确。
## Linux 验证
```bash
dotnet test tests/WxAgent.Core.Tests -c Release
dotnet build WxAgent.sln -c Release -p:EnableWindowsTargeting=true
dotnet publish src/WxAgent.Host -c Release -r win-x64 --self-contained true \
-p:EnableWindowsTargeting=true -p:PublishSingleFile=true \
-p:IncludeNativeLibrariesForSelfExtract=true -p:PublishTrimmed=false
```
结果:Core 测试 15/15 通过;Release 构建 0 warnings、0 errors;Windows 单文件发布及部署成功。
最终部署包在聊天页状态执行 `doctor`、`inspect-ui` 和 `smoke`:三项退出码均为 0;doctor 找到全部六个基线控件,smoke 完成文件传输助手文本发送及确认。
## 实现范围
- `WechatChatClient.ListenEventsAsync` 公开 `IAsyncEnumerable<MessageEvent>`。
- UIA 结构事件负责快速唤醒,两秒轮询负责防遗漏;轮询等待使用可取消的单次读取,不遗留后台等待任务。
- `MessageEventState` 保留最多 4096 个语义指纹;指纹不依赖可能变化的 UIA RuntimeId,同文本消息以出现序号区分。
- checkpoint 版本为 2,原子写入并限制为当前用户 ACL;Host 重启时产生 `Reconnected` 事件并恢复停机期间可见消息。
- 可选回调由 `MessageCallbackDispatcher` 逐个执行并隔离异常。
- 消息类型覆盖 Text、Image、File、Video、Voice、Link、Quote 和 System。
- `chat monitor` 输出紧凑的逐行 JSON;未指定 `--include-content` 时不输出正文和引用内容。
## 真机验收
### 实时事件和隐私输出
```powershell
WxAgent.Host chat monitor --seconds 30 --state-file artifacts\m3-state.json
WxAgent.Host chat send --text wxagent-m3-<随机标记>
```
- checkpoint 建立后发送唯一消息,monitor 输出 1 个 `MessageReceived`。
- 事件 ID 唯一,重复数 0。
- 默认输出中 `message.content` 和引用内容均为 `null`。
- JSON 每个事件严格占一行,可由 `ConvertFrom-Json` 逐行解析。
### Host 重启短期续接
1. 使用固定 state file 启动并停止 monitor。
2. monitor 停止期间向文件传输助手发送唯一消息。
3. 使用相同 state file 再次启动 monitor。
结果:先输出 1 个 `Recovered=true` 的 `Reconnected`,随后输出停机期间消息的 `MessageReceived`,该消息同样标记为 recovered,旧消息未重复输出。
### RuntimeId 变化后的稳定去重
监听期间发送 1 条唯一消息,再通过会话搜索和重新打开文件传输助手刷新 UIA 元素:
- 观察消息 1,唯一消息 1,重复 0。
- 已存在的引用消息未因 RuntimeId 变化而重新输出。
### 稳定性运行
原计划启动 8 小时任务,每约 5 分钟发送一条测试消息;首小时检查时监听器、checkpoint 和事件输出均正常。用户随后明确确认稳定性已满足并取消剩余监听,因此停止任务并清理临时 JSONL、checkpoint 和发送产物。
停止时汇总:
- 发送/预期事件:20
- 观察事件:20
- 唯一事件:20
- 发送失败:0
- 重复:0
- 默认正文泄漏:0
- checkpoint ACL:受保护
实际稳定运行约 1.6 小时;未宣称执行满 8 小时,完整时长由用户明确豁免。
### 回调异常隔离和类型解析
Core 测试验证:
- 前一回调抛出异常后,后一回调仍执行。
- 视频、语音、链接、引用和系统消息分类正确。
- 微信真实引用格式 `回复文本\n引用 <发送者> 的消息 : <原文>` 正确解析。
- checkpoint 恢复和 4096 条有界去重正确。
图片、文件、文本和真实引用消息此前已在同一微信版本的文件传输助手真机验证。
## 清理
- 已停止并注销临时监听进程。
- 已删除含运行事件的临时 JSONL、checkpoint、发送结果和 PowerShell 验证脚本。
- 保留不含正文、联系人或密钥的汇总结果与本验收记录。
## 结论
M3 功能和本轮用户要求的验证范围通过:实时监听、轮询兜底、完整消息模型、有界稳定去重、回调隔离、Host 重启续接、脱敏 JSONL 和 `IAsyncEnumerable<MessageEvent>` 均已实现并验证。完整 8 小时持续运行由用户明确取消,不作为本轮完成阻塞。