-
根因: 图片 stage 到 /sdcard 根目录的临时文件(未被 MediaStore 索引)时,微信图片 CDN 上传管线解析不到该文件 → 上传成破损图(红叹号,接收方收不到)。而已索引的 /sdcard/Pictures/ 里的图能正常全图上传。之前 Mac 直发用 /sdcard/Pictures/ 现成图 碰巧成功,掩盖了 staging 的 bug。 修复(send_image_via_hook + wechat_send.sh image): - stage 到 /sdcard/Pictures/wx_send_<pid>.<ext>(媒体目录 + 唯一名避免并发覆盖) - 广播 MEDIA_SCANNER_SCAN_FILE 触发 MediaStore 索引 + sleep 1 让扫描落地 - 再发 SEND_IMAGE_INTERNAL 真机验证: 修复前 staged 路径确定性红叹号(Hermes 17:37 + MCP repro 17:43 均失败); 修复后经 MCP helper(Hermes 同路径)发送全图正常渲染(17:46 AI AGI 日报全分辨率)。 "CDN submit DONE" 日志只代表提交,不代表上传成功——不能作为送达判据。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
send_voice_tts_via_hook 的最后一步从 send_voice_via_hook(SEND_VOICE_INTERNAL) 改为 send_voice_cgi_via_hook(SEND_VOICE_CGI)——让 Hermes 的 send_wechat_voice_tts MCP 工具(wechat-voice-sender skill 调的)走已验证的 uploadvoice cgi 全合成路: 音频上传+投递接收方+发送方本地已发送气泡。docstring 同步更新。 已 adb push 同步到设备 ~/.hermes/event_bus/(android_mcp.py + wechat_hook_send.py), 设备 wechat-image-sender skill 也更新为调 send_wechat_image MCP 工具(弃旧 ACTION_SEND UI 模拟)。设备文件权限修为 termux uid 可读(原 root:root 导致 MCP 子进程 import 失败)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
三种消息在使用层齐了(文字/图片/语音全走内部 API 全合成): - wechat_send.sh voice: 弃用旧 SEND_VOICE_INTERNAL(hot-swap 相关),改走 SEND_VOICE_CGI 全合成。SILK 须 WeChat 进程可读——动态取 WeChat uid(stat /data/user/0/com.tencent.mm), stage 进 /data/data/com.tencent.mm/files/ + chown + restorecon(/sdcard EACCES、 root cp 进沙盒需正确 owner+ctx)。 - wechat_hook_send.py: 新增 send_voice_cgi_via_hook(同上 staging + 广播 SEND_VOICE_CGI)。 - android_mcp.py: send_wechat_voice 改调 send_voice_cgi_via_hook,docstring 更新为全合成。 - skill_wechat_send/SKILL.md: 语音段改写为 SEND_VOICE_CGI 全合成用法。 真机验证:wechat_send.sh voice + MCP send_voice_cgi_via_hook 均 status=sent + hook svrMsgId>0(uploadvoice cgi 服务器接受)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
图片 CDN 上传打通后,把 MCP 发图工具从旧的 share-intent UI 模拟切到内部 API: - wechat_hook_send.py: 新增 send_image_via_hook(wxid, image_path) — 先 stage 到 /sdcard 保证 WeChat 进程可读,再广播 SEND_IMAGE_INTERNAL;hook 内部走 b80.u.oj(插库+建描述符) + v70.w.oj(提交 CDN 上传),接收方收全分辨率原图。 新增常量 SEND_IMAGE_ACTION。旧 send_image_via_intent 保留作参考/UI 兜底。 - android_mcp.py: send_wechat_image 工具改调 send_image_via_hook,更新 docstring (无 UI 模拟、无选联系人、无发错人风险;nickname 不解析,须传 wxid)。 真机验证(off-device 走 wechat_hook_send.send_image_via_hook 直调): status=sent + hook oj() DONE + CDN submit DONE items=1。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
- 去掉 send_voice_tts_via_hook 里多余的 staging 步骤: 生成 SILK 后直接把临时路径传给 send_voice_via_hook, 由它统一做 cp → wechat_cache + broadcast(避免 cp A→A 报错) - _tts_to_silk: ffmpeg/node 路径检测增加 Termux 全路径候选, root su shell 下 PATH 不含 Termux bin 时也能找到 验证:device 侧 Python 直调 send_voice_tts_via_hook → filehelper 5620ms 语音 OK Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
silk-wasm 搜索顺序调整为 Termux 全局路径优先, 与 node.js 在 Termux 下 NODE_PATH 行为一致。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
wechat_hook_send.py: - 新增 _tts_to_silk(): edge-tts → ffmpeg → silk-wasm 完整 TTS 管线 支持 on-device (Termux) 和 off-device (Mac adb push) 两种运行模式 - 新增 send_voice_tts_via_hook(): 文字 → 语音一步到位, 自动处理 TTS/SILK 编码+WeChat cache 暂存+broadcast 发送 android_mcp.py: - 新增 send_wechat_voice_tts MCP 工具(Hermes 直接传文字即可发语音) docstring 明确写明:不要自己实现 SILK,调这个工具就行 docs/wechat-voice-send-guide.md (新): - Hermes 调用说明:正确姿势 / 声音选项 / 依赖安装 / 常见错误 / 技术背景 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>