feat: prepare 2.2.0 with UI and execution fixes

Add dark theme, richer Markdown and readable plugin results.
Improve Android input evidence, response integrity and diagnostics.
Unify lifecycle, guidance receipts and evidence sources across clients.
Keep direct action dispatch without an added AI quota approval layer.
Align version metadata at 2.2.0 and bundle Helper 1.2.2.

Validation: 3063 backend tests before the version bump; 44 after.
Frontend: 317 tests and production build passed.
This commit is contained in:
chenmingxuan committed 2026-10-26 00:44:13 +08:00
1 parent 83bcfd54d5
commit fac4ccb760
146 files changed
+5689 -2033

No files matched your search

+8 -3
View File
@@ -10,7 +10,7 @@
| 问题 | inspect action | 要核对的证据 |
| --- | --- | --- |
| 长时间没动、API 超时、no tool call | view_requests | 请求开始/结束、模型、阶段、请求ID、重试、是否终止;HTTP 200 不表示输出结束 |
| 长时间没动、API 超时、499、no tool call | view_requests | 请求开始/结束、模型、阶段、请求/尝试/响应/链路编号、重试、取消来源与时限层级;HTTP 200 不表示输出结束,499 不能单独归因 |
| token 特别多、缓存是否生效 | view_usage,再按需 view_requests | prompt/completion/cached、调用数、角色/模型分组;未记录字段不能补猜 |
| Python、ADB、插件错误 | view_logs | 该任务 stdout/stderr 有限尾部;脱敏文本和实际错误链 |
| 点错、未验证、与结论矛盾 | search → view_step_details / view_step_screenshots | 动作前后画面、工具参数与实际回执、窗口和坐标尺寸 |
@@ -18,7 +18,7 @@
`offset/limit` 分页,使用返回的 next_offset;view_logs 的 offset 从最新行向前计数,返回每页仍按时间正序,超过尾部读取窗口的旧字节会注明。text_truncated=true 时缩小范围或读取指定步骤,不把截断当成内容缺失。
`search` 使用 query 或 step_range,不会执行历史动作。`view_summary` 也有分页,不用它一次加载整条长任务。
`search` 使用 query 或 step_range,不会执行历史动作。`view_summary` 返回 summary Markdown 与 steps.items/total/offset/limit/next_offset,按 next_offset 翻页,不一次加载整条长任务。items 中 step_id 是存储编号,不能用模型口述步号替代。JSON 结果同时保留 structuredContent 与兼容文本;调用严格按工具 schema,MCP 的 task_desc 与 HTTP 的 goal 不能混用,未知参数在执行前报错。
## 缓存与耗时
@@ -27,7 +27,10 @@
- 按角色/模型分组判断消耗来源,不能把 Checker、视频分析和执行模型混为一个请求。旧数据未记录模型时注明 unknown。
- 请求阶段和重试用于解释等待,时间戳 Unix 秒及 UTC 转成用户当地时区;注明时区。无终止事件或 unknown 不能当成功。
- 区分模型生成耗时、设备/插件操作耗时、排队及用户等待。先找实际重复观测、工具参数膨胀、无进展循环,再建议优化。
- 最终验收读取 `view_requests` 返回的 `final_reviews`:核对 stage、total/elapsed/remaining_seconds、request_count、retry_count 和 status;用 review_id 关联请求的 final_review 字段。最终验收与中间检查点独立计时。budget_exhausted 是验收总预算耗尽,request_retries_exhausted 是模型请求重试耗尽,cancelled 是停止或指导中断,不能混称为 API 超时。验收耗尽不自动重跑设备操作;流式半截 passed 和验收 completed 都不能代替正式 test_result。
- `mobile_manage_task(action="status")` 的 `lifecycle` 与网页进度、报告同源:`durations` 分开记录 total、queued、resource_wait、paused、execution、final_review、report_export,缺少记录为 null。execution 包含初始化与整理,不能当作模型生成速度;旧任务分项未知不能补成零。
- 指导回执的 accepted_at/timestamp 表示接收,consumed_at 表示执行器已读取;是否被实际应用仍需核对后续步骤。pending/reading 是等待或领取中,终态未消费为 unapplied,终态领取后未确认消费为 unconfirmed。接收成功不能表述为“已执行”或“模型已应用”。
- 最终验收读取 `view_requests` 返回的 `final_reviews`:核对 stage、total/elapsed/remaining_seconds、request_count、retry_count 和 status;用 review_id 关联请求的 final_review 字段。最终验收与中间检查点独立计时。budget_exhausted 是验收总预算耗尽,request_retries_exhausted 是模型请求重试耗尽;cancelled 的具体来源看 cancel_reason,没有该字段或为 unknown 时保留未知,不能混称为 API 超时。验收耗尽不自动重跑设备操作;流式半截 passed 和验收 completed 都不能代替正式 test_result。
- 取消记录核对 cancel_reason 与 cancel_phase:user_stop、guidance_replaced、task_paused、task_replaced、superseded 和 outer_timeout 分别表示已明确归因的中断。timeout_scope 的 request、transport、outer、final_review 区分单次请求、传输、外层等待和验收总预算。自动重试用 request_id 分组,以 attempt_id、previous_attempt_id 关联;可用的 client_request_id、server_request_id、response_id、server_trace_id 和 traceparent 用于对照服务端日志。HTTP 499 或裸取消不能证明来源,旧记录不补猜。
## 环境与插件
@@ -39,6 +42,8 @@
给出具体结论、支持它的任务/步骤/请求编号、影响与缺失证据。执行失败不必然是被测产品缺陷;验收失败也不必然是工具故障。
报告与证据索引的 evidence_sources 区分实际执行界面与接口、文件、终端等辅助来源。业务后台名称或网址不决定执行平台,UI 截图不能单独证明后端持久状态。引用实际 step_id/call_id/source_id,保留未验证边界;来源清单不是新的验收结论,也不改写 AI 原判或人工复验。
用户只问复盘时不重新执行、不改验证结果。用户明确给出人工复验结论时,使用 mobile_manage_task(action="review", trace_id=..., review_status="passed"或"failed", review_reason=用户理由, user_confirmed=true)。AI 自己的分析不能使用这个入口冒充人工判定。
用户需要资料时再 mobile_export_report;已有 report/evidence 查看不会生成 ZIP。交付真实路径或链接,并说明未验证项。