Preface¶
DSH (DeepSeek Harness) decomposes agent capabilities into plugins. When a DSH profile is already running, viewing status, issuing commands, and confirming permissions in the terminal are still limited to the current device and window. dsh-chatnode-wechat addresses another entry point problem: connecting a DSH profile to a personal WeChat account, allowing you to continue chatting, monitoring conversations, stopping the current turn, and directly replying to permission requests within WeChat.
It connects to WeChat via the Tencent iLink bot gateway (ilinkai.weixin.qq.com). As mentioned in the README, this mechanism is the same as that used by hermes-agent and OpenClaw. Since this is an unofficial gateway, you need to consider account isolation, permission scope, and coexistence issues separately before use.
What Is This¶
- Project:
Jesse-njx/dsh-chatnode-wechat - Package name:
@dsh-cowork/chatnode-wechat - Version:
0.1.0 - License: MIT
- Positioning: iLink gateway + conversation node bundle for DeepSeek Harness
- Function: Connects a DSH profile to a personal WeChat account for chatting, monitoring, and approval.
This bundle contains two separable Cordis plugins:
wechat-gateway(WechatGateway): iLink service layer, providing QR login, authenticated long-poll, reconnect/backoff, send retry + rate-limit circuit, typing indicator, and encrypted CDN media download/upload (downloadImage/sendImage).wechat-conversation-node: Bridge between WeChat and DSH, responsible for allowlist gate, session targeting, commands, digest outbound, and approvals.
The overall pipeline can be understood as follows:
WeChat ⇄ iLink ⇄ wechat-gateway ⇄ wechat-conversation-node ⇄ DSH agent session
Core Features¶
- QR Login and Credential Management
Prints the QR URL via pnpm login. Scan with WeChat and confirm. Credentials are stored via dsh credentials service, not written in patch files.
- Bidirectional Text and Images
Regular text is routed to the current active agent. Inbound images are downloaded, decrypted, and passed to the agent; outbound images are sent back to the current contact via /send <path>.
- Session Target Control
Supports managing DSH sessions with commands:
/sessionslists sessions with numbers./use Nswitches the active session./new <prompt>creates a new agent + session and starts it./stopcancels the current active turn./statusviews agent status and session summary.
- In-chat Permission Confirmation
When DSH issues a permission request, it can be answered in WeChat with /yes or /no.
- Digest-style Progress Feedback
The plugin reports progress via digest-style messages instead of flooding the chat with every tool call.
- Strict Allowlist
allowFrom is required, with no permissive default. Messages from non-allowlisted senders are logged and ignored.
Installation and Enablement¶
package.json declares node >=20. Install and build according to the commands given in the README:
git clone https://github.com/Jesse-njx/dsh-chatnode-wechat.git
cd dsh-chatnode-wechat
pnpm install && pnpm build
dsh plugin --profile <your-profile> add .
Here, <your-profile> needs to be replaced with the DSH profile to which you want to attach the plugin.
Then log in to your WeChat account:
pnpm login
This command will print a QR URL. After scanning with WeChat and confirming, the login credentials will be written to $DSH_HOME/.credentials.yaml via dsh-credentials-local. The README indicates that the following will be written:
WEIXIN_ACCOUNT_ID
WEIXIN_BOT_TOKEN
WEIXIN_BASE_URL
At startup, the bundle parses these credentials and automatically starts polling.
Typical Usage¶
As long as a session exists, the default target is the most recent session. You can send regular text or images directly, or use commands to control.
| Operation | Description |
|---|---|
| Regular text | Routes to the active agent |
| Image | Downloads, decrypts, saves, and passes the path to the agent |
/sessions |
Lists sessions with numbers |
/use N |
Switches to the Nth session |
/new <prompt> |
Creates a new agent + session and starts it |
/stop |
Cancels the current active turn |
/status |
Views agent status and session summary |
/send <path> |
Sends a local image to the current contact |
/yes / /no |
Answers permission requests |
/help |
Views the list of commands |
Configuration Key Points¶
allowFrom is a hard allowlist, required, with no permissive default. The configuration example given in the README is as follows:
# profile patch (cordis.patch.yml)
plugins:
dsh-chatnode-wechat:
allowFrom: ["<your-wechat-id>"] # hard allowlist, REQUIRED, no default
digestIntervalSec: 300 # heartbeat summary while a turn runs
approvalTimeoutSec: 600 # approval prompt timeout → default deny
maxMessageChars: 2000 # WeChat bubble cap (protocol limit)
sendChunkDelayMs: 1500 # throttle between outbound bubbles
# cwd: /path/to/workspace # working dir for `/new` sessions
# mediaDir: /path/to/media # inbound image dir (default $DSH_HOME/attachments/wechat)
# agentPreset: <preset-name> # agent preset for `/new` sessions
# agentProvider / agentModel: ... # model route for `/new` agents
Key points:
allowFrom: Only allows specified WeChat senders. Non-allowlisted messages are logged and ignored, not fed to the model.digestIntervalSec: Heartbeat summary interval during turn execution.approvalTimeoutSec: Permission request wait timeout; the README example indicates that timeout leads to default deny.maxMessageChars: WeChat message bubble length limit.sendChunkDelayMs: Throttle interval between outbound messages.mediaDir: Inbound image directory, defaults to$DSH_HOME/attachments/wechat/.
Permission Confirmation¶
Personal WeChat accounts lack buttons, so permission requests are rendered as numbered text and await a reply in the chat. The example form in the README is as follows:
#1 Requires your confirmation
Tool: bash
Reason: run a destructive command
Reply /yes to approve, /no to deny (if only one is pending, you can also reply 1/2)
If no reply within the timeout, it will be automatically denied.
/yes approves this instance; /no denies it. If only one request is pending, you can also reply 1 or 2 as prompted. The bridge layer only responds to requests from the agent driven by this WeChat user; other requests continue along the answerer chain.
Applicable Scenarios and Notes¶
Suitable scenarios:
- You already have a DSH profile and wish to continue chatting with the agent in WeChat.
- Need to view sessions, switch sessions, or stop the current turn.
- Need to send local images to the current contact or send images to the agent for processing.
- Wish to complete simple permission confirmations on a mobile phone.
Notes before use:
- One WeChat account allows only one poller. Running another instance,
hermes-agent, orOpenClawon the same WeChat account may cause HTTP 403 errors and message loss. It is recommended to use a dedicated WeChat account. - This plugin uses an unofficial iLink gateway/protocol. The README warns that Tencent may restrict accounts, so a dedicated account that can accept the risk should be used.
allowFrommust be configured. Do not treat it as an entry point that allows all WeChat contacts by default.- DSH is currently in developer preview. In the README and this repository’s dependencies, the
@deepseek-ai/*series versions are pinned at0.1.0-rc.6. - The plugin runs with the current DSH process, so you should check the source code, configuration options, and license before installation. The license for this project is MIT.
- Credentials are stored via
dsh credentials serviceand should not be written into patch files.
Conclusion¶
The value of dsh-chatnode-wechat lies in adding a WeChat-side entry point for the DSH profile: text and images can flow bidirectionally, sessions can be switched with commands, permission requests can be confirmed in-chat, and progress is presented via digest messages. It is not a finished application in the official app store, but a community bundle within the DSH plugin ecosystem.
GitHub:
https://github.com/Jesse-njx/dsh-chatnode-wechat
The catalog page address provided in the project materials is:
https://www.skillhub.cn/plugins/Jesse-njx/dsh-chatnode-wechat
The community catalog page is an independent site and is not equivalent to the official app store.