🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

微信桥接 lanbaolu/dsh-wechat-bridge

DeepSeek Harnessv0.9.1
lanbaolu35 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness (DSH) 微信桥接插件:三端通用,host 工具 + Web 管理面板

38.1/100
综合分
5
GitHub 星标
469
npm 周下载
—/5
用户评分

数据截至 2026/9/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @lanbaolu/dsh-wechat-bridge
npm 源 · @lanbaolu/dsh-wechat-bridge 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
静态安装检查通过
未做真实安装
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@lanbaolu/dsh-wechat-bridge @ 0.9.1
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 03:45:59

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 134 处,展示前 92 条)
  • 写入本地文件
    lib/index.js:53
    mkdirSync(dataDir, { recursive: true });
  • 写入本地文件
    lib/index.js:54
    mkdirSync(join(dataDir, 'logs'), { recursive: true });
  • 写入本地文件
    lib/index.js:59
    mkdirSync(dataDir, { recursive: true });
  • 写入本地文件
    lib/index.js:61
    appendFileSync(pluginLogPath, line, 'utf8');
  • 读取本地文件
    lib/index.js:86
    const raw = JSON.parse(readFileSync(sessionIdMapPath, 'utf8'));
  • 写入本地文件
    lib/index.js:94
    mkdirSync(dataDir, { recursive: true });
  • 写入本地文件
    lib/index.js:95
    writeFileSync(sessionIdMapPath, JSON.stringify(map, null, 2) + '\n', 'utf8');
  • 读取本地文件
    lib/index.js:141
    const raw = JSON.parse(readFileSync(selectedSessionIdPath, 'utf8'));
  • 读取本地文件
    lib/index.js:404
    const files = readdirSync(accountsDir).filter((file) => file.endsWith('.json'));
  • 读取本地文件
    lib/index.js:410
    const stat = statSync(join(accountsDir, file));
  • 读取本地文件
    lib/index.js:856
    const raw = readFileSync(pidPath, 'utf8').trim();
  • 读取本地文件
    lib/index.js:897
    if (!existsSync(script)) {
  • 执行外部命令来自配置/变量
    lib/index.js:901
    const child = spawn(process.execPath, [script, 'start'], {
  • 删除本地文件
    lib/index.js:926
    unlinkSync(pidPath);
  • 删除本地文件
    lib/index.js:962
    unlinkSync(pidPath);
  • 发起网络请求
    lib/index.js:1464
    const resp = await fetch(`http://127.0.0.1:${info.port}/notify/status`, {
  • 发起网络请求
    lib/index.js:1497
    const resp = await fetch(`http://127.0.0.1:${info.port}/pending/status`, {
  • 发起网络请求
    lib/index.js:1532
    const resp = await fetch(`http://127.0.0.1:${info.port}/notify`, {
  • 发起网络请求
    lib/index.js:1580
    const resp = await fetch(`http://127.0.0.1:${info.port}/approval`, {
  • 发起网络请求
    lib/client.js:180
    fetch(`${API_BASE}/status`, { cache: "no-store" }),
  • 发起网络请求
    lib/client.js:181
    fetch(`${API_BASE}/projects`, { cache: "no-store" }),
  • 发起网络请求
    lib/client.js:182
    fetch(`${API_BASE}/notify/status`, { cache: "no-store" })
  • 发起网络请求
    lib/client.js:200
    const pendingRes = await fetch(`${API_BASE}/pending/status`, { cache: "no-store" });
  • 发起网络请求
    lib/client.js:207
    const trustRes = await fetch(`${API_BASE}/trust`, { cache: "no-store" });
  • 发起网络请求
    lib/client.js:214
    const cfgRes = await fetch(`${API_BASE}/config`, { cache: "no-store" });
  • 发起网络请求
    lib/bridge/wechat/login.js:12
    const res = await fetch(QR_CODE_URL);
  • 发起网络请求
    lib/bridge/wechat/login.js:38
    res = await fetch(url, { signal: controller.signal });
  • 读取本地文件
    lib/bridge/store.js:15
    const raw = readFileSync(filePath, "utf-8");
  • 写入本地文件
    lib/bridge/store.js:24
    renameSync(filePath, `${filePath}.corrupt-${Date.now()}`);
  • 写入本地文件
    lib/bridge/store.js:39
    mkdirSync(dirname(filePath), { recursive: true });
  • 写入本地文件
    lib/bridge/store.js:41
    writeFileSync(filePath, raw, "utf-8");
  • 写入本地文件
    lib/bridge/store.js:43
    chmodSync(filePath, 0o600);
  • 读取本地文件
    lib/bridge/trust.js:28
    const raw = readFileSync(path, 'utf8');
  • 写入本地文件
    lib/bridge/trust.js:53
    renameSync(path, corruptPath);
  • 写入本地文件
    lib/bridge/trust.js:70
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/bridge/trust.js:71
    writeFileSync(path, JSON.stringify(file, null, 2) + '\n', 'utf8');
  • 写入本地文件
    lib/bridge/trust.js:73
    chmodSync(path, FILE_MODE);
  • 读取本地文件
    lib/bridge/config.js:10
    const content = readFileSync(CONFIG_PATH, "utf-8");
  • 写入本地文件
    lib/bridge/config.js:21
    mkdirSync(config.workingDirectory, { recursive: true });
  • 写入本地文件
    lib/bridge/config.js:26
    mkdirSync(config.workingDirectory, { recursive: true });
  • 写入本地文件
    lib/bridge/config.js:55
    mkdirSync(DATA_DIR, { recursive: true });
  • 写入本地文件
    lib/bridge/config.js:71
    writeFileSync(CONFIG_PATH, JSON.stringify(data, null, 2) + "\n", "utf-8");
  • 写入本地文件
    lib/bridge/config.js:73
    chmodSync(CONFIG_PATH, 0o600);
  • 读取本地文件
    lib/bridge/wechat/accounts.js:30
    const files = readdirSync(ACCOUNTS_DIR).filter((f) => f.endsWith('.json'));
  • 读取本地文件
    lib/bridge/wechat/accounts.js:36
    const stat = statSync(join(ACCOUNTS_DIR, file));
  • 读取本地文件
    lib/bridge/logger.js:9
    const files = readdirSync(LOG_DIR)
  • 删除本地文件
    lib/bridge/logger.js:13
    unlinkSync(join(LOG_DIR, files.shift()));
  • 写入本地文件
    lib/bridge/logger.js:42
    mkdirSync(LOG_DIR, { recursive: true });
  • 写入本地文件
    lib/bridge/logger.js:59
    appendFileSync(getLogFilePath(), line, "utf-8");
  • 发起网络请求
    lib/bridge/dsh-client.js:16
    const res = await fetch(`${this.baseUrl}/api/status`, {
  • 发起网络请求
    lib/bridge/dsh-client.js:25
    const res = await fetch(`${this.baseUrl}/api/prompt`, {
  • 发起网络请求
    lib/bridge/dsh-client.js:38
    await fetch(`${this.baseUrl}/api/stop`, {
  • 发起网络请求
    lib/bridge/dsh-client.js:46
    await fetch(`${this.baseUrl}/api/clear`, {
  • 发起网络请求
    lib/bridge/dsh-client.js:58
    const res = await fetch(`${this.baseUrl}/api/approval/decide`, {
  • 发起网络请求
    lib/bridge/dsh-client.js:70
    const res = await fetch(`${this.baseUrl}/api/projects`, {
  • 执行外部命令来自配置/变量
    lib/bridge/main.js:56
    sleepGuard = spawn(cmd.cmd, cmd.args, { stdio: 'ignore', windowsHide: true });
  • 写入本地文件
    lib/bridge/main.js:98
    mkdirSync(DATA_DIR, { recursive: true });
  • 写入本地文件
    lib/bridge/main.js:102
    writeFileSync(contextTokensPath(), JSON.stringify({ tokens, updatedAt: Date.now() }) + '\n', 'utf8');
  • 写入本地文件
    lib/bridge/main.js:104
    writeFileSync(contextTokenPath(), JSON.stringify({ token: lastContextToken, updatedAt: Date.now() }) + '\n', 'utf8');
  • 写入本地文件
    lib/bridge/main.js:107
    chmodSync(contextTokensPath(), 0o600);
  • 写入本地文件
    lib/bridge/main.js:108
    chmodSync(contextTokenPath(), 0o600);
  • 读取本地文件
    lib/bridge/main.js:118
    const parsed = JSON.parse(readFileSync(contextTokensPath(), 'utf8'));
  • 读取本地文件
    lib/bridge/main.js:129
    const parsed = JSON.parse(readFileSync(contextTokenPath(), 'utf8'));
  • 读取本地文件
    lib/bridge/main.js:168
    return JSON.parse(readFileSync(POLL_LOCK_PATH, 'utf8'));
  • 写入本地文件
    lib/bridge/main.js:185
    mkdirSync(DATA_DIR, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/bridge/main.js:391
    const result = spawnSync(cmd, args, { stdio: 'ignore' });
  • 删除本地文件
    lib/bridge/main.js:449
    unlinkSync(QR_PATH);
  • 读取密钥环境变量
    lib/bridge/main.js:477
    const apiToken = process.env.DSH_BRIDGE_API_TOKEN;
  • 读取密钥环境变量
    lib/bridge/main.js:510
    const token = process.env.DSH_BRIDGE_API_TOKEN;
  • 读取密钥环境变量
    lib/bridge/main.js:586
    writeFileSync(notifyPortPath, JSON.stringify({ port: notifyPort, token: process.env.DSH_BRIDGE_API_TOKEN }, null, 2) + '\n', 'utf8');
  • 删除本地文件
    lib/bridge/main.js:836
    unlinkSync(POLL_LOCK_PATH);
  • 删除本地文件
    lib/bridge/main.js:840
    unlinkSync(notifyPortPath);
  • 读取本地文件
    lib/bridge/main.js:1152
    return AUTO_PUSH_EXTENSIONS.has(ext) && existsSync(f);
  • 读取本地文件
    lib/bridge/notify.js:28
    const raw = JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    lib/bridge/notify.js:37
    mkdirSync(DATA_DIR, { recursive: true });
  • 写入本地文件
    lib/bridge/notify.js:38
    writeFileSync(join(DATA_DIR, 'notify-stats.json'), JSON.stringify(entry, null, 2) + '\n', 'utf8');
  • 读取本地文件
    lib/bridge/pending-queue.js:10
    if (!existsSync(QUEUE_DIR)) {
  • 写入本地文件
    lib/bridge/pending-queue.js:11
    mkdirSync(QUEUE_DIR, { recursive: true });
  • 读取本地文件
    lib/bridge/pending-queue.js:17
    if (!existsSync(path))
  • 读取本地文件
    lib/bridge/pending-queue.js:19
    const raw = readFileSync(path, 'utf-8');
  • 写入本地文件
    lib/bridge/pending-queue.js:34
    writeFileSync(queuePath(accountId), JSON.stringify(items, null, 2), 'utf-8');
  • 读取本地文件
    lib/bridge/session.js:58
    const oldStat = statSync(oldPath);
  • 读取本地文件
    lib/bridge/session.js:63
    statSync(newPath);
  • 写入本地文件
    lib/bridge/session.js:70
    renameSync(oldPath, newPath);
  • 写入本地文件
    lib/bridge/session.js:91
    mkdirSync(SESSIONS_DIR, { recursive: true });
  • 读取本地文件
    lib/bridge/session.js:153
    const files = readdirSync(SESSIONS_DIR).filter((f) => f.endsWith('.json'));
  • 发起网络请求
    lib/client/Panel.js:158
    fetch(`${API_BASE}/status`, { cache: 'no-store' }),
  • 发起网络请求
    lib/client/Panel.js:159
    fetch(`${API_BASE}/projects`, { cache: 'no-store' }),
  • 发起网络请求
    lib/client/Panel.js:160
    fetch(`${API_BASE}/notify/status`, { cache: 'no-store' }),
  • 发起网络请求
    lib/client/Panel.js:190
    const pendingRes = await fetch(`${API_BASE}/pending/status`, { cache: 'no-store' });
  • 发起网络请求
    lib/client/Panel.js:203
    const trustRes = await fetch(`${API_BASE}/trust`, { cache: 'no-store' });
  • 发起网络请求
    lib/client/Panel.js:216
    const cfgRes = await fetch(`${API_BASE}/config`, { cache: 'no-store' });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-default-model@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-tools@deepseek-ai/dsh-workspace@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 三端通用
  • host工具
  • Web管理面板
v0.9.12026-09-29
· v0.9.1 — 回复丢失修复 + 会话 id path-safe · Fixed · 会话格式 v3+ 下回复丢失(#4):宿主不再把 assistant/chunk 写入会话日志,插件据此累积的正文恒为空,微信侧每轮只能收到 DSH 无返回内容。。改为用本轮 assistant/message 正文兜底。 · 会话 id 非 path-safe 导致投影缓存写入被拒(#5):会话 id 清洗为只保留 [A-Za-z0-9_-],session_projcache 恢复正常写入,日志不再每约 6 秒刷一条警告。 · Changed · 回复回传改为整轮兜底:宿主不再下发增量期间没有逐段输出,且只回传本轮最后一条 assistant 消息正文——有工具调用的多步轮次,中间步骤的叙述文本不下发。恢复逐段流式已列入 docs/future-plan.md。 · README.md 的「流式回复」条目对齐实际回传行为。 · 已知限制 · 存量会话 id 仍按原值续用,老会话的投影缓存警告不会因本次修复自动消失(迁移会话目录与 workspace.json 引用属于另一项改动)。
v0.9.02026-08-30
· v0.9.0 — 视频收发 + 待补发队列可视化 + 面板折叠重构 · Added · 视频收发(iLink/ClawBot 协议):入站 CDN 下载+解密存 .mp4 交 agent;出站按扩展名路由 VIDEO(mp4/mov/webm/mkv/avi)。真机收发抽验通过。 · 待补发队列状态可视化:面板展示发送失败待补发数量/字数/最早入队时间。 · Changed · 面板折叠分组重构:5 个可折叠分组(状态与操作/连接与账号/消息与通知/系统行为/多用户与安全),降低设置页复杂度。
v0.8.02026-08-29
· v0.8.0 — 发送失败补发 + 防休眠 + 单测入 CI · Added · 发送失败补发闭环(pending-queue 接入):整轮发送结束仍未发出的缓冲落盘暂存,daemon 启动补发 + 每 5 分钟重试,成功才移除——不再因 daemon 退出丢失。 · 防休眠(preventSleep):config.json 新增 preventSleep(默认关),开启后 daemon 运行期间抑制系统休眠(macOS caffeinate / Linux systemd-inhibit / Windows 尽力而为);面板「💤 防休眠」开关,重启 daemon 生效。 · Changed · 单测纳入 CI(39 项断言)。 · 方向方案存档 docs/future-plan.md。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
@lanbaolu/dsh-wechat-bridge License Node CI PRs Welcome 基于 Wechat-ggGitHub/wechat-claude-code 开发的 DeepSeek Harness (DSH) 微信桥接插件。 ⚠️ 免责声明:本项目仅用于个人学习与自动化。使用非官方微信协议存在账号风险,请自行评估并承担后果。 三端通用:Windows / macOS / Linux 均使用纯 Node.js 进程管理,不依赖 launchd / systemd / Windows Service;同时提供 DSH 模型工具(CLI/Headless 可用)和 Web 管理面板(Web/桌面可用)。 功能 - 微信扫码绑定个人微信后,在微信里直接与 DSH 本机 Agent 对话。 - 复用 wechat-claude-code 的 iLink Bot 微信协议层:文字、图片、语音转文字、文件收发。 - 守护进程由 DSH 插件管理:启动 / 停止 / 重启 / 状态 / 日志,全部走模型工具或 Web 面板。 - 每个微信账号对应一个 DSH 会话,DSH Host 重启后会自动 resume 原持久化会话,对话上下文不断档;/clear、/new、/stop、/cwd、/model、/prompt 等斜杠命令可用。
展开完整文档(README 剩余 1 节)
@lanbaolu/dsh-wechat-bridge

License
Node
CI
PRs Welcome

基于 Wechat-ggGitHub/wechat-claude-code 开发的 DeepSeek Harness (DSH) 微信桥接插件。

⚠️ 免责声明:本项目仅用于个人学习与自动化。使用非官方微信协议存在账号风险,请自行评估并承担后果。

三端通用:Windows / macOS / Linux 均使用纯 Node.js 进程管理,不依赖 launchd / systemd / Windows Service;同时提供 DSH 模型工具(CLI/Headless 可用)和 Web 管理面板(Web/桌面可用)。

功能

- 微信扫码绑定个人微信后,在微信里直接与 DSH 本机 Agent 对话。
- 复用 wechat-claude-code 的 iLink Bot 微信协议层:文字、图片、语音转文字、文件收发。
- 守护进程由 DSH 插件管理:启动 / 停止 / 重启 / 状态 / 日志,全部走模型工具或 Web 面板。
- 每个微信账号对应一个 DSH 会话,DSH Host 重启后会自动 resume 原持久化会话,对话上下文不断档;/clear、/new、/stop、/cwd、/model、/prompt 等斜杠命令可用。
- 回复回传:DSH Agent 的回复经本地 SSE 推送到微信(批量发送,不刷屏)。会话格式 v3+ 起宿主不再下发 assistant/chunk 增量,现为整轮结束时回传本轮最后一条 assistant 消息正文——有工具调用的多步轮次只回传最后一步文本,逐段流式待恢复(见 docs/future-plan.md)。
- 超时安抚:DSH 超过 5 分钟无输出时自动发一条“还在处理”的消息。
- 主动通知:agent 可通过 wechat_notify 工具在任务完成 / 失败 / 需要确认时主动推送微信,内置节流(每小时 ≤6 条、每日 ≤50 条,超限排队延迟发送),规避个人号风控。
- 微信内审批:agent 请求权限时推送审批消息到微信,回复 /yes 批准、/no 拒绝;超时自动拒绝(fail-closed),仅绑定账号本人可裁决,不影响桌面 GUI 会话。
- 防卡死:微信会话自动注入通道约束提示词,禁用浏览器端交互式选项工具(手机看不到会永久阻塞),改用纯文本编号选项。
- 文件双向:微信发图片/文件给 DSH;DSH 回复中提到的本地文件会自动推回微信。
- 消息队列:处理中收到的普通消息会排队,等当前任务结束后继续处理(多用户下按用户独立排队,A 的长任务不阻塞 B)。
- 多用户支持:信任集 + per-user 会话。可让多个微信用户与同一 bot 对话,每人独立会话/上下文/队列/审批归属,互不可见;信任集可控、可吊销(详见下方「安全模型」)。

媒体能力矩阵(2026-08-21 代码核实 + 真机抽验;2026-08-29 视频收发补齐)

| 方向 | 文本 | 图片 | 语音 | 文件 | 视频 |
| 微信 → DSH | ✅ | ✅ CDN 下载+解密落盘 | ✅ iLink 端转写为文本 | ✅ 下载落盘交 agent | ✅ CDN 下载落盘交 agent(存 .mp4) |
| DSH → 微信 | ✅ 攒批聚合发送 | ✅ 按扩展名路由直发 | — | ✅ 回复提及自动推送 | ✅ 按扩展名路由直发(mp4/mov/webm/mkv/avi) |

语音出站(DSH → 微信)仍未支持:协议无公开实现参考,需真机实测后补齐。视频收发为 2026-08-29 按 iLink/ClawBot 协议源码补齐,真机收发已抽验通过(2026-08-30)。

方向对照与后续可行性方案见 docs/feasibility-plan.md。

架构

微信 App ←→ iLink Bot API ←→ bridge daemon (Node.js) │ HTTP + SSE (127.0.0.1, token 鉴权) ▼ DSH Host Plugin │ ctx.agents.create/resume + followup ▼ DSH Agent (本机 LLM + 工具)

- src/bridge/:从 wechat-claude-code 移植的微信协议层 + 适配 DSH 的守护进程。
- src/index.ts:DSH Host 插件,负责内部 API、Agent 生命周期、守护进程管理和模型工具。
- src/client/index.ts:Web 管理面板(settings.section 槽位)。

安装

方式一:npm 一键安装(推荐)

npm install @lanbaolu/dsh-wechat-bridge
dsh plugin --profile web add @lanbaolu/dsh-wechat-bridge
dsh web

方式二:本地路径安装(开发/个人使用)

在 DSH profile 中安装本地包:

git clone https://github.com/lanbaolu/dsh-wechat-bridge.git
dsh plugin --profile web add /path/to/dsh-wechat-bridge
dsh web

或者使用超级注入器(开发模式):

dev_inject_plugin /path/to/dsh-wechat-bridge

方式三:从源码运行

npm install
npm run build # host → lib/
npm run build:client # client → lib/client.js
npm run typecheck

注意:build:client 使用 tsdown,需要 Node.js 22.18+ 或 24.11+(CI 使用 22/24 验证)。运行时要求仍为 Node 18+。

使用

1. 扫码绑定

推荐在 DSH Web 设置页的「📱 微信桥接」面板中完成:

1. 打开 Settings / 设置 → 📱 微信桥接。
2. 填写 DSH 工作目录。
3. 点击 扫码绑定,用微信扫描页面上的二维码。
4. 绑定成功后直接点击 启动。

也可以在 DSH 所在机器终端执行:

node lib/bridge/main.js setup

按提示用微信扫码,完成后选择 DSH 工作目录。

2. 启动桥接

在 DSH 对话中让模型执行:

- wechat_bridge_start
- wechat_bridge_status
- wechat_bridge_logs
- wechat_bridge_stop

或者在 Web 设置页(settings.section 槽位)点击“启动 / 停止 / 重启”。

3. 微信端命令

| 命令 | 说明 |
| /help | 显示帮助 |
| /clear | 清除当前 DSH 会话 |
| /new | 开启全新会话(等价 /clear) |
| /stop | 停止当前任务并清空排队消息 |
| /status | 查看会话状态 |
| /cwd [路径] | 查看 / 切换工作目录 |
| /model [名称] | 查看 / 切换模型 |
| /prompt [内容] | 查看 / 设置系统提示词 |
| /history [数量] | 查看最近对话 |
| /send | 发送本地文件到微信 |
| /trust [备注] | 添加信任用户(manual 模式;仅 owner) |
| /distrust | 吊销信任用户(仅 owner) |
| /trustlist | 查看信任集(仅 owner) |
| /trustmode [模式] | 查看/切换信任模式(owner-only / bootstrap / manual) |

超时安抚配置

DSH 长时间没有产出消息时,桥接会主动发一条“还在处理”的安抚消息(默认 5 分钟静默后、每 5 分钟一条,避免用户以为卡死)。嫌频繁或想自定义,可在 Web 面板「⏳ 超时安抚」区块调整,或直接编辑 config.json 的 calm 节:

{
"calm": {
"enabled": true, // 是否启用安抚,默认 true "silenceMs": 600000, // 首次静默多久后安抚(毫秒),默认 300000(5 分钟) "intervalMs": 900000, // 两次安抚最小间隔(毫秒),默认同 silenceMs "maxCount": 3, // 每轮任务最多安抚次数,0/省略 = 不限制
"messages": [ // 自定义文案(随机取一条),留空用内置默认
"还在处理中,这个问题有点复杂,请再稍等一下", "马上就好,正在收尾" ] } }

保存后即时生效(最长延迟数秒),无需重启守护进程。改动只在守护进程运行时展示于面板;若面板无「超时安抚」区块,请更新插件后重启 DSH。

防休眠(preventSleep)

默认关闭。开启后,守护进程运行期间会抑制系统休眠——锁屏/合盖不挂起,微信消息持续响应(适合挂机跑长任务)。

- 面板「💤 防休眠」开关,或直接编辑 config.json:

{
"preventSleep": true
}

- 平台实现:macOS caffeinate / Linux systemd-inhibit / Windows SetThreadExecutionState(尽力而为)。
- 切换后需重启守护进程生效(面板「重启」按钮即可)。

安全模型(多用户信任集)

iLink 微信协议的扫码绑定是 bot 自身 登录(不是用户配对)。因此“多用户”的边界在协议层之上划定:把可信微信用户的 from_user_id 加进信任集,放行/拒绝入站。

信任模式(fail-closed 默认)

| 模式 | 行为 | 适用 |
| owner-only(默认) | 只认绑定账号 owner 本人,陌生人一律拒绝 | 单用户,行为与旧版完全一致 |
| bootstrap | 首个联系的陌生人自动入信任集(一次性),之后不再自动 | 快速开号试用 |
| manual | 仅 owner 用 /trust 或 Web 面板显式添加的人可对话 | 正式多人使用 |

- 信任集持久化在 trust.json(0600),mode 是唯一真相源;config.json 只存 notifyRejected。
- 拒绝原则:陌生人消息只记日志、不回复(不泄露任何内部信息);可选 notifyRejected: true 让 owner 收到「陌生人尝试联系」提醒(Web 面板或 /trustmode 后由面板开关)。
- 吊销即失效:/distrust 或面板「吊销」后,该用户新消息立刻被拒绝;其历史会话文件保留只读(不丢历史)。

per-user 隔离

- 每个受信用户(含 owner)一套独立:DSH 会话(${botAccountId}::${userId} 为 key)、会话文件、消息队列、上下文 token、/history /status /cwd /model。
- A 的任务进行中,B 发消息不会被阻塞(独立队列);A 的 /yes /no 只裁决 A 自己 agent 的待审批(审批 key 归属 session key),B 无权替 A 裁决。
- 项目绑定两级粒度:Web 面板选择项目会话 → 对该 bot 下所有用户生效;微信内 /session 绑定 → 仅对当前用户生效。

升级迁移

- 旧单用户数据自动迁移:sessions/.json → sessions/__.json,session-ids.json 旧 key → ${accountId}::${ownerUserId},迁移留痕日志,绝不丢历史;无法确定 owner 的旧数据保留原样只读。

⚠️ 验证状态(如实标注):信任集判定与迁移逻辑有纯函数单测覆盖(39 项); owner-only 模式已真机回归(行为与旧版一致)。多用户路径(bootstrap 入集、双用户隔离并发)真机验证待补——需要第二个微信账号走查,在此之前请仅在受控环境开启 bootstrap/manual 模式。

数据目录

默认 ~/.dsh/wechat-bridge/(可用 DSH_HOME 调整):

~/.dsh/wechat-bridge/
├── accounts/ # 微信账号凭证(0600) ├── sessions/ # 每个微信账号的本地会话状态 ├── session-ids.json # 微信账号 → DSH 持久化会话 ID 映射(用于重启后 resume) ├── trust.json # 多用户信任集(模式 + 信任用户,0600) ├── context-tokens.json # per-user context_token(主动推送/审批通行证) ├── pending-queue/ # 发送失败暂存队列 ├── daemon-port.json # 守护进程 notify 端点端口(token 鉴权) ├── notify-stats.json # 主动通知每日配额计数 ├── config.json # 工作目录 / 模型 / 系统提示词 └── logs/ # 运行日志

安全说明

- 守护进程与 DSH 插件之间的内部 API 只监听 127.0.0.1,并使用随机 token 鉴权。
- 微信账号凭证仅保存在本机 ~/.dsh/wechat-bridge/accounts/,权限为 0600。
- 日志中的 token / secret / password 会自动脱敏。
- 请勿把真实账号凭证、token 或日志提交到 Issue / PR。

贡献

欢迎提交 Issue 和 PR。请先阅读 CONTRIBUTING.md,并查看 SECURITY.md 了解安全报告方式。

License

MIT
预览分享卡片长什么样 ↓lanbaolu/dsh-wechat-bridge
分享 · DeepSeek Harness Hub
lanbaolu/dsh-wechat-bridge

DeepSeek Harness (DSH) 微信桥接插件:三端通用,host 工具 + Web 管理面板

回到顶部