Three robustness fixes for the WeCom Customer Service router:
1. **Cursor persistence** — sync_msg cursor now stored in
public.service_state (auto-created via CREATE TABLE IF NOT EXISTS).
Survives service restarts; no more duplicate message processing.
2. **send_msg retry** — sendChunkWithRetry() retries once after 2s
on any API error (non-zero errcode or network failure). Lost
replies due to transient WeChat API errors are now recovered.
3. **enter_session welcome** — WeCom fires an enter_session event
(origin=0, msgtype=event) when a user opens the chat for the
first time. Now handled: bound users get a welcome-back message,
unbound users get step-by-step onboarding instructions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>