Commit 419f6d0c4a80c86dab59914adfe5d3d3b87adfc7

Authored by yibo
1 parent 7d9f0d52

fix: connectors/cloud_knowledge Path.home() + MCP config python3

- connectors.py: Path.home() returns '/' for root, use _HERMES_BASE with Termux home detection
- cloud_knowledge.py: same fix for cloud_cache/cloud_uploads paths
- config.yaml (device): fix MCP command path python -> python3 (device only has python3)
- test_scenarios.md: add 8 end-to-end test scenarios for phoneuse validation
cloud_knowledge.py
@@ -13,15 +13,19 @@ import urllib.request @@ -13,15 +13,19 @@ import urllib.request
13 import urllib.error 13 import urllib.error
14 from pathlib import Path 14 from pathlib import Path
15 15
  16 +_TERMUX_HOME = Path("/data/data/com.termux/files/home")
  17 +_HERMES_BASE = (_TERMUX_HOME if _TERMUX_HOME.exists()
  18 + else Path(os.environ.get("HOME", str(_TERMUX_HOME)))) / ".hermes"
  19 +
16 CLOUD_API = os.environ.get("HERMES_CLOUD_API", "https://api.hermes-agent.ai/v1") 20 CLOUD_API = os.environ.get("HERMES_CLOUD_API", "https://api.hermes-agent.ai/v1")
17 CLOUD_KEY = os.environ.get("HERMES_CLOUD_KEY", "") 21 CLOUD_KEY = os.environ.get("HERMES_CLOUD_KEY", "")
18 LOCAL_CACHE = Path(os.environ.get( 22 LOCAL_CACHE = Path(os.environ.get(
19 "CLOUD_CACHE_DIR", 23 "CLOUD_CACHE_DIR",
20 - str(Path(os.environ.get("HOME", "/data/data/com.termux/files/home")) / ".hermes" / "cloud_cache") 24 + str(_HERMES_BASE / "cloud_cache")
21 )) 25 ))
22 UPLOAD_LOG = Path(os.environ.get( 26 UPLOAD_LOG = Path(os.environ.get(
23 "UPLOAD_LOG", 27 "UPLOAD_LOG",
24 - str(Path(os.environ.get("HOME", "/data/data/com.termux/files/home")) / ".hermes" / "cloud_uploads.jsonl") 28 + str(_HERMES_BASE / "cloud_uploads.jsonl")
25 )) 29 ))
26 30
27 # Schema version for knowledge entries 31 # Schema version for knowledge entries
connectors.py
@@ -21,17 +21,21 @@ import time @@ -21,17 +21,21 @@ import time
21 from pathlib import Path 21 from pathlib import Path
22 from typing import Any 22 from typing import Any
23 23
  24 +_TERMUX_HOME = Path("/data/data/com.termux/files/home")
  25 +_HERMES_BASE = (_TERMUX_HOME if _TERMUX_HOME.exists()
  26 + else Path(os.environ.get("HOME", str(_TERMUX_HOME)))) / ".hermes"
  27 +
24 CONNECTORS_DIR = Path(os.environ.get( 28 CONNECTORS_DIR = Path(os.environ.get(
25 "CONNECTORS_DIR", 29 "CONNECTORS_DIR",
26 - str(Path.home() / ".hermes" / "connectors") 30 + str(_HERMES_BASE / "connectors")
27 )) 31 ))
28 EVENT_BUS_DIR = Path(os.environ.get( 32 EVENT_BUS_DIR = Path(os.environ.get(
29 "EVENT_BUS_DIR", 33 "EVENT_BUS_DIR",
30 - str(Path.home() / ".hermes" / "event_bus") 34 + str(_HERMES_BASE / "event_bus")
31 )) 35 ))
32 KNOWLEDGE_LOG = Path(os.environ.get( 36 KNOWLEDGE_LOG = Path(os.environ.get(
33 "KNOWLEDGE_LOG", 37 "KNOWLEDGE_LOG",
34 - str(Path.home() / ".hermes" / "knowledge_log.jsonl") 38 + str(_HERMES_BASE / "knowledge_log.jsonl")
35 )) 39 ))
36 40
37 41
test_scenarios.md 0 → 100644
  1 +# Phoneuse 端到端测试场景
  2 +
  3 +## 场景 1:WeChat 消息发送(核心功能)
  4 +**目标**:验证 send_wechat_message 真发送 + DB 验证
  5 +```
  6 +1. 给 filehelper 发送一条测试消息
  7 +2. 验证返回 status="sent" 且 msgId 不为空
  8 +3. 用 query_wechat 独立查询确认 isSend=1
  9 +```
  10 +
  11 +## 场景 2:WeChat 数据查询(修复验证)
  12 +**目标**:验证 S2-02/03/04 修复生效
  13 +```
  14 +1. get_wechat_contacts(query="张") — 应返回匹配联系人,无 imgFlag 错误
  15 +2. get_wechat_messages(contact="filehelper", limit=5) — 应返回消息列表,无 LIMIT ? 错误
  16 +3. get_wechat_chatrooms(limit=5) — 应返回群聊,无 chatroomowner 错误
  17 +```
  18 +
  19 +## 场景 3:Memory Graph 搜索(知识库)
  20 +**目标**:验证 search_memory + semantic_search_memory
  21 +```
  22 +1. search_memory("吃饭") — 应返回相关微信消息
  23 +2. semantic_search_memory("项目") — 应返回语义相关消息(带 score)
  24 +3. embed_memory_messages(3) — 应成功向量化
  25 +```
  26 +
  27 +## 场景 4:电话/短信工具(新模块)
  28 +**目标**:验证 telephony_tools 已注册可用
  29 +```
  30 +1. get_device_info() — 应返回设备信息
  31 +2. list_call_log(limit=5) — 应返回通话记录(或空列表)
  32 +3. get_system_contacts(limit=5) — 应返回系统通讯录
  33 +```
  34 +
  35 +## 场景 5:Connector 层(修复验证)
  36 +**目标**:验证 EVENT_BUS_DIR 修复后 connector/persona/cloud 工具
  37 +```
  38 +1. get_connector_kb("wechat") — 应返回 wechat.yaml 内容
  39 +2. connector_read_wechat_contacts(limit=3) — 应返回联系人
  40 +3. get_persona() — 应返回 persona 数据(或空但无 NameError)
  41 +4. run_discovery_agent("wechat") — 应返回 WeChat DB 表列表
  42 +```
  43 +
  44 +## 场景 6:部署工具(自举能力)
  45 +**目标**:验证 deploy_phoneuse_code 工具
  46 +```
  47 +1. 在 Mac 上修改一个 .py 文件(加一行注释)
  48 +2. 通过 MCP 调用 deploy_phoneuse_code(restart=true)
  49 +3. 验证 Pixel 上文件已更新、MCP 已重启
  50 +```
  51 +
  52 +## 场景 7:MITM 流量分析(Alipay)
  53 +**目标**:验证 Alipay 流量可被拦截
  54 +```
  55 +1. 确认 mitm_proxy 在运行(port 8082)
  56 +2. 打开 Alipay App
  57 +3. 检查 event_server 是否有 mitm 类型事件(source='mitm', app='alipay')
  58 +```
  59 +
  60 +## 场景 8:UI 控制工具(新模块)
  61 +**目标**:验证 ui_control_tools 可用
  62 +```
  63 +1. screenshot() — 应返回截图路径
  64 +2. get_foreground_app() — 应返回当前前台应用
  65 +3. tap(x=500, y=1000) — 应执行点击(在已知安全界面测试)
  66 +```