dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
把微信接入 DeepSeek Harness —— 带一个落盘的串行消息队列。 A WeChat (iLink) channel for DeepSeek Harness with a durable serial message queue.
用微信和你的 DSH agent 对话:发文字、发图、发文件、发视频,它在微信里回你。 一条回完才处理下一条,进程死了重启接着干。
A WeChat channel plugin for DeepSeek Harness. Messages are persisted to disk and processed strictly one at a time — the next message is only picked up after the previous turn has finished and been replied to. The agent replies once per turn (at turn/end), shows a native "typing" indicator, and can receive images, files and videos.
Built to replace dsh-channel-wechat, which had three structural problems: missed messages (it polled with the oldest stale bot credential), mid-turn replies (it sent every assistant/message fragment), and deadlocks (no timeout, silent catch {}).
问题 · 老插件 · 本插件 收不到 · listAccounts()[0] 取最旧的僵尸账号 · 登录时清空旧记录,永远只有一个 中途发 · 每个 assistant/message 都发一段 · 攒到 turn/end,一次发完 卡死 · runExclusive 无超时 + catch {} 静默 · 三层超时,任何终态都推进队列
/compact、/goal 等进队列执行,与普通消息同序deliverables/ 下的文件就会发过去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 · 权限全开,但 agent 一个工具都没有 两个都给 · 权限全开 + 工具齐全
只给 `permission` 时,agent 会说「我没有工具,请你手动跑这条命令」,而且它说的是实话。
agentPreset 不要留空串 —— 空串会回落到 profile 的默认预设,不一定是你在用的那个。
命令 · 作用 /stop · 中止当前这一轮(写标记,不会卡住) /status · 队列状态 /new · 开一段新对话 /help · 帮助,含 DSH 原生命令列表
其他 /xxx 如果 DSH 认识,会进队列在轮到时执行。
把文件放进 `/deliverables/`,然后在回复里提到它。
<你的工作区>/
└─ deliverables/
└─ 报告.pdf ← 放这里,提到就会发只有 `deliverables/` 下的文件才会被自动发送。
不加这个限制的话,模型说「我读了 SOUL.md、USER.md」就会把那些文件也发出去 —— 列举路径不等于要发文件。
内容 · 位置 队列记录 · /wechat-queue/queue-YYYY-MM-DD.jsonl 运行日志 · /wechat-queue/wechat-queue-YYYY-MM-DD.log 轮询游标 · /wechat-queue/cursor.txt 启动错误 · /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.mjs548 项,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。