WeChat XML uses & to encode & in forwarded article URLs. Without html.unescape(), chksm and other query params were passed encoded to WeChat servers, causing signature mismatch and captcha block.
Ultraworked with Sisyphus
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Root cause: user-level hermes-gateway.service was running the same
-p default gateway as the system-level hermes-gateway@default.service,
causing the two to SIGTERM each other every ~5 minutes. This killed
in-flight Hermes API requests with 'Remote end closed connection'.
Fix: disabled the redundant user-level service.
Also: simplified webhook to just forward raw message content (no
system prompt, no ACK, no max_tokens overrides). Removed unused
_get_ack method.
- Moved old GDB hook and memory monitor scripts to archive/
- Updated README with final Docker solution
- Updated .env.example, .gitignore
- Added final-note.md documenting deployment decision
- All research scripts preserved in archive/ for reference
- chat_bridge: mark_active_tui_session() + get_active_tui_session()
Tracks active TUI session via temp/.active_tui_session.json,
auto-expires after 1 hour (matching Hermes state_meta pattern)
- chat_bridge: inject TUI context when processing coregroup messages
Bot now sees what hmo was discussing in TUI when replying in group
- session_router: record active session ID on every TUI message
Uses _resolve_session() to get the current bound session ID
- Changed from vague '别人对话→ __SILENT__' to explicit 3-condition rule
- LLM response must be ONLY '__SILENT__' (10 chars), nothing else
- Prevents LLM from saying '好的,我输出 __SILENT__' which leaked as chat message
If xmpp_connected=false, force restart immediately instead of
waiting 10 minutes for message timeout. This catches the most
common failure mode: process alive but XMPP dead.