# Edge Runbook JWeBot Edge is the local source of truth for accepted events, command state, provider work, acknowledgements, and final delivery. ## Routes | Input after mention removal | Route | Execution | |---|---|---| | `/...` | Local | Kernel command or reviewed plugin | | ordinary text | Chat | Direct DeepSeek client | | `#...` | Cloud | Optional configured cloud agent | The bot mention is read from the active profile. The public default is `@JWeBot`. ## Steam Commands: ```text /steam /steam在线 /steam游戏 /steam全部 /steam刷新 /steam时长 游戏名 /steam时长游戏名 /steam时长游戏名、玩家名 /steam时长游戏名人=玩家名 ``` The configured Steam account supplies the owner ID and API key. At runtime the provider: 1. uses private per-person SteamID mappings when configured, otherwise fetches the public friend list; 2. batches public player summaries in groups of 100; 3. labels mapped accounts with their group display IDs and accepts their private Steam query aliases; 4. fuzzy matches the requested game against the owner's public library; 5. falls back to scoped public libraries if the owner has no match; 6. requests the selected AppID for every scoped account with bounded concurrency; 7. sorts public playtime descending and summarizes private/unavailable data. For a player-specific query, `、`, `,`, `,`, `@`, or `人=` explicitly separates the game from the player. The provider matches the live persona name and only requests that account's game library; ambiguous matches are rejected instead of guessed. Steam access is fixed to `api.steampowered.com` through the configured loopback Mihomo HTTP proxy. There is no direct-network fallback. ## Config Inspect active profile metadata without printing values: ```sh ./tools/jwebot-config.py status ``` Validate and atomically regenerate: ```sh ./tools/jwebot-config.py activate ``` Services read: ```text ~/.config/jwebot/current/generated/runtime.env ``` Private context, debug state, incidents, and root evidence live outside Git as documented in `config/README.md`. ## Health ```sh runtime_python=${JWEBOT_RUNTIME_PYTHON:-/opt/jwebot/venv/bin/python} printf '%s\n' '{"op":"health"}' | "$runtime_python" ~/.local/lib/wechat-health-watch/jwebot_edge.py respond "$runtime_python" ~/.local/lib/wechat-health-watch/jwebot_edge.py status ``` Expected: - Edge and adaptive recorder active; - `NRestarts=0` after the settle window; - OCR queues empty; - direct/cloud outboxes empty or actively progressing; - SQLite `PRAGMA quick_check` returns `ok`; - legacy OCR services disabled and inactive. ## Delivery Contract - Fast ACK is persisted before GUI delivery. - Final work starts independently from final GUI delivery. - A final reply is not delivered until its ACK is visibly confirmed. - Steam uses a dedicated progress ACK. - ACK/local work may pass a queued final that has not started. - Active GUI work is non-preemptive. - The GUI sender remains strictly serial. - Every final send rechecks the selected group fingerprint. ## Failure Handling Provider failure: - keep credentials and provider payloads out of logs; - record only bounded error classes; - retry through durable queue policy; - do not bypass the configured proxy. GUI uncertainty: - never blindly replay a send after `send_started`; - preserve the uncertain artifact in private incident state; - require visual/operator confirmation before retry. Group mismatch: - skip delivery; - keep the event ledgered; - do not select or navigate to another group automatically. ## Telemetry Telemetry may include step name, status, elapsed time, queue state, retry count, and hashed event/group IDs. It must never include message bodies, sender names, reply text, environment values, credentials, SteamIDs, or provider payloads.