Commit 419f6d0c4a80c86dab59914adfe5d3d3b87adfc7
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
Showing
3 changed files
with
79 additions
and
5 deletions
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 | +``` |