diff --git a/wechat_plain/scripts/auto-reply/viewer_templates/whitelist.html b/wechat_plain/scripts/auto-reply/viewer_templates/whitelist.html
index fcc6cd1..60e3523 100644
--- a/wechat_plain/scripts/auto-reply/viewer_templates/whitelist.html
+++ b/wechat_plain/scripts/auto-reply/viewer_templates/whitelist.html
@@ -4,66 +4,121 @@
-
-
在白名单里的联系人 / 群,其消息可被自动回复(仍受敏感词等安全规则拦截,命中会转人工审批)。不在名单里的一律进「自动回复审批」等你手动发。
群 id 以 @chatroom 结尾会自动识别为群。
-
-
-
-
-
+
+
白名单里的联系人 / 群,消息可被自动回复(仍受敏感词等安全规则拦截,命中转人工)。不在名单里的一律进「自动回复审批」等你手动发。
+
+
+
+
+
选择联系人 / 群
+
+
+
已选 0
+
+
+
+
{% endblock %}
diff --git a/wechat_plain/scripts/auto-reply/wechat-viewer-changes.md b/wechat_plain/scripts/auto-reply/wechat-viewer-changes.md
index ea5c37c..cb02a4c 100644
--- a/wechat_plain/scripts/auto-reply/wechat-viewer-changes.md
+++ b/wechat_plain/scripts/auto-reply/wechat-viewer-changes.md
@@ -31,6 +31,13 @@ CREATE TABLE reply_queue ( -- 策略判定后落地
| `GET /api/replies?status=` | 队列列表(pending / sent / auto_sent / cancelled / 全部) |
| `POST /api/reply//send` | 用(可编辑的)草稿发到会话 → `send_text_via_hook(talker,text)` → 标 sent/failed |
| `POST /api/reply//cancel` | 标 cancelled |
+| `GET /api/contacts` | 弹窗默认列表:会话过的联系人+群(排除公众号),去重带昵称,最近排序 |
+| `GET /api/contacts/search?q=` | 按名字/wxid 搜全量 rcontact+群(`wechat_db.search_talker`) |
+| `POST /api/whitelist`(升级) | 支持批量 `{items:[{wxid,name,kind}]}`(弹窗多选) |
+
+**白名单选人弹窗(2026-07-10 升级)**:`/whitelist` 页「添加」不再手填 wxid,改为弹窗:
+默认列出你会话过的联系人/群(带昵称),顶部搜索框可查全量通讯录/群,复选框**多选**,
+【添加所选】批量入库。白名单列表显示 昵称 + wxid/群id + 类型徽章。解决「不知道 wxid」的问题。
发送复用 `~/.hermes/event_bus/wechat_hook_send.py` 的 `send_text_via_hook`(LSPosed 内部 API 广播 `SEND_MSG_INTERNAL`)。