用微信收发消息,串行排队与智能体稳定对话
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/SteelUnion/dsh-wechat-queue.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 28 处,展示前 27 条)
- 读取本地文件lib/index.js:118
if (existsSync(candidate)) return candidate; - 写入本地文件lib/index.js:235
mkdirSync(dir, { recursive: true }); - 写入本地文件lib/index.js:237
writeFileSync( - 写入本地文件lib/index.js:269
writeFileSync(logPath, line, { flag: 'a' }); - 写入本地文件lib/index.js:382
mkdirSync(dataDir, { recursive: true }); - 读取本地文件lib/index.js:1061
if (!statSync(path).isFile()) return false; - 读取本地文件lib/index.js:1074
const data = readFileSync(path); - 读取密钥环境变量lib/index.js:1161
const envToken = process.env.DSH_WECHAT_QUEUE_TOKEN; - 写入本地文件lib/index.js:1235
writeFileSync(join(dataDirRef, 'cursor.txt'), cursor, 'utf8'); - 读取本地文件lib/index.js:1246
if (!existsSync(file)) return undefined; - 读取本地文件lib/index.js:1247
const text = readFileSync(file, 'utf8').trim(); - 发起网络请求lib/client.js:134
fetch(ROUTES.status, { cache: 'no-store' }) - 发起网络请求lib/client.js:164
fetch(ROUTES.state, { cache: 'no-store' }) - 发起网络请求lib/client.js:190
return fetch(path, { method: 'POST', body: body }) - 写入本地文件lib/queue/store.js:99
mkdirSync(this.dir, { recursive: true }); - 读取本地文件lib/queue/store.js:110
if (existsSync(file)) files.push(file); - 读取本地文件lib/queue/store.js:118
text = readFileSync(file, 'utf8'); - 写入本地文件lib/queue/store.js:338
appendFileSync(this.fileFor(), `${tombstone}\n`, 'utf8'); - 写入本地文件lib/queue/store.js:358
appendFileSync(this.fileFor(), `${JSON.stringify(record)}\n`, 'utf8'); - 读取本地文件pack.mjs:34
for (const entry of readdirSync(join(ROOT, dir), { withFileTypes: true })) { - 读取本地文件pack.mjs:55
const missing = INCLUDE.filter((rel) => !existsSync(join(ROOT, rel))); - 读取本地文件pack.mjs:65
const size = statSync(join(ROOT, rel)).size; - 读取本地文件pack.mjs:73
const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8')); - 读取本地文件pack.mjs:103
size: statSync(join(ROOT, rel)).size, - 读取本地文件pack.mjs:111
const raw = readFileSync(f.abs); - 写入本地文件pack.mjs:165
mkdirSync(DIST, { recursive: true }); - 写入本地文件pack.mjs:166
writeFileSync(outPath, Buffer.concat([...locals, cdBuf, eocd]));
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
把微信接入 DeepSeek Harness 的通道插件,带落盘串行队列。微信(iLink)通道,用于 DeepSeek Harness,带持久化串行消息队列。
README
由 DeepSeek 最新模型翻译生成dsh-wechat-queue
把微信接入 DeepSeek Harness —— 带一个落盘的串行消息队列。
用微信和你的 DSH 智能体对话:发文字、发图、发文件、发视频,它在微信里回你。
一条回完才处理下一条,进程死了重启接着干。
它解决什么
| 问题 | 老插件 | 本插件 |
| 收不到 | listAccounts()[0] 取最旧的僵尸账号 | 登录时清空旧记录,永远只有一个 |
| 中途发 | 每个 assistant/message 都发一段 | 攒到 turn/end,一次发完 |
| 卡死 | runExclusive 无超时 + catch {} 静默 | 三层超时,任何终态都推进队列 |
功能
- 严格串行:一条回完才取下一条,不会在 inbox 里堆成多个 turn
- 落盘队列:JSONL 存盘,进程死了重启接着处理
- 对方正在输入:轮次开始上报,结束收掉;它坏了不影响主流程
- DSH 原生命令转发:/compact、/goal 等进队列执行,与普通消息同序
- 接收图片 / 文件 / 视频:失败不丢文字,只在那条附件上留一句说明
- 发送文件:回复里提到 deliverables/ 下的文件就会发过去
- 附件声明:告诉智能体附件的名字、大小、uid,它不用翻目录猜
- 扫码登录面板:单账号,登录时清空旧记录
安装
展开完整文档(README 剩余 1 节)
dsh-wechat-queue
把微信接入 DeepSeek Harness —— 带一个落盘的串行消息队列。
用微信和你的 DSH 智能体对话:发文字、发图、发文件、发视频,它在微信里回你。
一条回完才处理下一条,进程死了重启接着干。
它解决什么
| 问题 | 老插件 | 本插件 |
| 收不到 | listAccounts()[0] 取最旧的僵尸账号 | 登录时清空旧记录,永远只有一个 |
| 中途发 | 每个 assistant/message 都发一段 | 攒到 turn/end,一次发完 |
| 卡死 | runExclusive 无超时 + catch {} 静默 | 三层超时,任何终态都推进队列 |
功能
- 严格串行:一条回完才取下一条,不会在 inbox 里堆成多个 turn
- 落盘队列:JSONL 存盘,进程死了重启接着处理
- 对方正在输入:轮次开始上报,结束收掉;它坏了不影响主流程
- DSH 原生命令转发:/compact、/goal 等进队列执行,与普通消息同序
- 接收图片 / 文件 / 视频:失败不丢文字,只在那条附件上留一句说明
- 发送文件:回复里提到 deliverables/ 下的文件就会发过去
- 附件声明:告诉智能体附件的名字、大小、uid,它不用翻目录猜
- 扫码登录面板:单账号,登录时清空旧记录
安装
dsh plugin --profile desktop add <解压后的目录>
装完完全退出 DSH 再启动,宿主才能发现插件。
首次使用需要在 GUI 插件页扫码登录,或者用环境变量临时登录:
$env:DSH_WECHAT_QUEUE_TOKEN = "<accountId>:<token>"
配置
- id: wechat-queue
config:
enabled: true
会话工作目录。决定微信那边读到的是谁的人格。
cwd: 'C:\path\to\your\workspace'
权限:管「能不能碰文件」 permission: 'danger-full-access'
Agent 预设:管「有没有工具可用」 agentPreset: 'cordis'
deliverTimeoutMs: 600000
turnTimeoutMs: 600000
queueAckText: ''
⚠️ permission 和 agentPreset 是两件事
| 配了什么 | 结果 |
| 只给 permission | 权限全开,但智能体一个工具都没有 |
| 两个都给 | 权限全开 + 工具齐全 |
只给 permission 时,智能体会说「我没有工具,请你手动跑这条命令」,而且它说的是实话。
agentPreset 不要留空串 —— 空串会回落到配置档的默认预设,不一定是你在用的那个。
微信内命令
| 命令 | 作用 |
| /stop | 中止当前这一轮(写标记,不会卡住) |
| /status | 队列状态 |
| /new | 开一段新对话 |
| /help | 帮助,含 DSH 原生命令列表 |
其他 /xxx 如果 DSH 认识,会进队列在轮到时执行。
发文件给微信
把文件放进 <cwd>/deliverables/,然后在回复里提到它。
<你的工作区>/ └─ deliverables/ └─ 报告.pdf ← 放这里,提到就会发
只有 deliverables/ 下的文件才会被自动发送。
不加这个限制的话,模型说「我读了 SOUL.md、USER.md」就会把那些文件也发出去 —— 列举路径不等于要发文件。
数据在哪
| 内容 | 位置 |
| 队列记录 | <DSH_HOME>/wechat-queue/queue-YYYY-MM-DD.jsonl |
| 运行日志 | <DSH_HOME>/wechat-queue/wechat-queue-YYYY-MM-DD.log |
| 轮询游标 | <DSH_HOME>/wechat-queue/cursor.txt |
| 启动错误 | <DSH_HOME>/wechat-queue/startup-error.txt |
| 账号凭证 | .credentials.yaml 的 wechat-queue/account |
排查先看运行日志。 GUI 启动没有终端,console.error 的输出没人看得见。
消息状态
received → queued → delivered → running → replied
├→ failed (带 stage + error) ├→ timeout (带 stage) └→ stopped (被 /stop)
任何终态都会让队列推进到下一条。 这是「永不堵死」的来源。
测试
node test/zz-all.mjs
548 项,18 个套件,0 失败。
覆盖:串行与超时、状态机、JSONL 存储、四种媒体(图片/文件/视频/语音)、文件发送与上传、预设挂载契约、事件竞态、扫码登录。
打包
node pack.mjs # 输出 dist/dsh-wechat-queue-v<version>.zip
node pack.mjs --list # 只列清单
零运行时依赖。 peerDependencies 只声明 @deepseek-ai/cordis, DSH 本体版本要求写在 engines.dsh。
技术要点
为什么不用 ctx.get() 做软探测:它不是软探测,用到的服务必须写进 inject,否则直接抛。
为什么 agentPresets.resolve() 必须 await:它是 async 的。不 await 会拿到一个 Promise, preset?.id 永远是 undefined,于是预设从未挂载 —— 这就是「权限全开但一个工具都没有」的原因。
为什么媒体要「先下载完再入队」:worker 是独立循环,enqueue 一完成它就可能取走交付。
图片几十毫秒赶得上,视频几秒就赶不上 —— 附件会丢掉,而且队列记录看起来一切正常。
这些坑和更多细节都在 NOTES.md。
来源声明
协议层(lib/protocol/)搬自 dsh-channel-wechat v0.2.5(MIT)。
lib/protocol/qrcode.js 是 vendored 的 qrcode-generator 2.0.4(MIT)。
详见 THIRD_PARTY_NOTICES.md。
队列层、worker、桥接层、命令转发、typing 指示器、媒体处理是本插件自己的实现。
许可
MIT。全文见 LICENSE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
SteelUnion/dsh-wechat-queue
用微信收发消息,串行排队与智能体稳定对话
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,778已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 549已汉化DSH
71.2
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,011已汉化DeepSeek 客户端
71
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 1,969已汉化DSH
70.7