Connects WeChat, WeCom, DingTalk, Feishu, Lark, QQ, and Telegram to a local DeepSeek Harness agent, with each IM chat as a separate workspace channel.
Install
# from npm (prebuilt)
dsh plugin --profile web add @michengai/dsh-im-connect
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:MichengAI/dsh-im-connect
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
DSH IM Connect
Connect Feishu, DingTalk, WeCom, WeChat, QQ, and Telegram to local DeepSeek Harness
DSH IM Connect is a community-maintained DeepSeek Harness (DSH) plugin, not an official DeepSeek AI product.
Features
- Connect DingTalk, Feishu, Lark, WeChat, WeCom, QQ, and Telegram from Settings → IM Assistant.
- Each IM chat maps to an independent DSH session under the workspace Channels tab, never mixed into web Tasks.
- Send work, read replies, and approve tools from the phone; model and permission follow the local DSH profile.
- Bind by QR code or credentials. Secrets go into DSH
ctx.credentials, notchannels.json. - Paste one sentence into DSH, Codex, or WorkBuddy and let that agent install the plugin locally.
- Groups need no binding, only a mention. DMs allow the QR scanner automatically; everyone else must be approved on the settings page.
- After a successful bind, the configure dialog closes by itself and Settings stays open.
Who can drive the assistant
Inbound messages are identified before commands, tool approvals, or injection.
| Case | Behavior |
|---|---|
| Group without @ | Ignored; no reply and no pending request |
| Group with @ | No binding. Anyone can send work |
| DM from the QR scanner | WeChat / Feishu / Lark scanners are allowlisted automatically |
| DM from anyone else | Appears on the settings pending list until approved |
| DM on credential-only channels | Telegram, and DingTalk / WeCom / QQ bound with secrets only, require approval for every DM |
| DM without a userId | Denied |
| Tool approval | Only an allowlisted user in a DM can reply 批准 / 拒绝; group replies do not grant |
WeChat is QR-only and DM-only, so the same WeChat account that scanned can talk immediately. A different WeChat account DMing the bot waits for settings approval.
📡 Supported channels
| Channel | Status | How to connect | You need |
|---|---|---|---|
| 🔔 DingTalk | ✅ Ready | QR, or Client ID / Secret | DingTalk open-platform bot; replies prefer AI Card |
| 🐦 Feishu | ✅ Ready | QR only; creates the bot automatically | Feishu account |
| 🌐 Lark | ✅ Ready | QR only | Lark account |
| ✅ Ready* | Official iLink QR | Dedicated account recommended; DM only | |
| 🏢 WeCom | ✅ Ready | QR (recommended), or Bot ID / Secret | WeCom intelligent bot |
| ✅ Ready | QR, or AppID / AppSecret | QQ Open Platform bot, not a personal QQ account | |
| ✈️ Telegram | ✅ Ready | Bot Token only | @BotFather; do not enable Webhook on the same bot |
✅ Ready = text in and out works | *WeChat = official iLink only, no reverse-engineered personal protocol | Groups still require an @ mention
Screenshots
Connect channels in Settings → IM Assistant. Unconnected cards show Configure; connected cards show a toggle and status:

The workspace splits Tasks and Channels. IM sessions appear only under Channels:

WeCom and other QR channels support scan-to-bind:

After connecting, drive the local assistant from each IM:
Prerequisites
- A working DeepSeek Harness Web installation with
dshavailable in PowerShell. - Examples use the
webprofile; replace it with the target profile. - Source installation and development require Node.js 22+. npm installation does not require running
npm installin an arbitrary directory. - After install, restart
dsh weband hard-refresh the browser before opening Settings → IM Assistant.
Installation
dsh plugin add forwards to pnpm add in the profile directory. Without a version and official registry, a local mirror or minimum-release-age policy can leave you on an older build.
Ask another agent to install it
This plugin runs inside DeepSeek Harness Web. Copy one of the sentences below into DSH, Codex, or WorkBuddy and let that agent install it into your local web profile.
From npm:
Install the latest DSH plugin @michengai/dsh-im-connect into my local web profile using the official npm registry: dsh plugin --profile web add @michengai/dsh-im-connect@latest --registry=https://registry.npmjs.org/. Then run dsh --profile web --dump-config, confirm im-connect is mounted, and remind me to restart DSH Web, hard-refresh the browser, and open Settings → IM Assistant.
From source:
Install the DSH plugin from source at https://github.com/MichengAI/dsh-im-connect: clone it, run npm install and npm test, then run dsh plugin --profile web add . from that directory. Do not copy lib by itself. Then run dsh --profile web --dump-config, confirm im-connect is mounted, and remind me to restart DSH Web, hard-refresh the browser, and open Settings → IM Assistant.
| Product | How to use it |
|---|---|
| DSH | Send one of the sentences above to the current session. |
| Codex | Send one of the sentences above to Codex and let it install locally. |
| WorkBuddy | Send one of the sentences above to WorkBuddy; for a source install you can also paste https://github.com/MichengAI/dsh-im-connect. |
Codex and WorkBuddy only install the plugin. After that, open DSH Web and use Settings → IM Assistant.
You can also run the same npm command yourself:
dsh plugin --profile web add @michengai/dsh-im-connect@latest --registry=https://registry.npmjs.org/
If dsh is not on PATH, replace the leading dsh with npx --yes @deepseek-ai/dsh.
Install the latest package from the official npm registry
Run this from any PowerShell directory:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
dsh plugin --profile web add @michengai/dsh-im-connect@latest --registry=https://registry.npmjs.org/
dsh --profile web --dump-config
To pin a release, replace @latest with a version such as @0.1.1.
The configuration output should contain im-connect. Restart DSH Web and hard-refresh the browser. Do not copy client files manually: dsh plugin add also applies cordis.patch.yml.
Install from source
Use this for debugging or unpublished changes. The cloned directory becomes the plugin source path:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
Set-Location D:\Repository\deepseek-harness-plugin
git clone https://github.com/MichengAI/dsh-im-connect.git
Set-Location .\dsh-im-connect
npm install
npm test
dsh plugin --profile web add .
dsh --profile web --dump-config
Restart DSH Web and hard-refresh the browser. dsh plugin ... add . reads the package metadata and cordis.patch.yml; do not install by copying lib directly.
Usage
Open Settings → IM Assistant, choose the workspace, permission, and model, then connect a channel. The full guide is 使用说明.
| Goal | Action | Notes |
|---|---|---|
| Connect a channel | Select Configure on an unconnected card, then scan or enter credentials | Feishu / Lark / WeChat are QR-only; Telegram needs a Bot Token; the dialog closes after success |
| Pause receiving | Turn off the connected-card toggle | Credentials stay; inbound messages pause |
| Send work from IM | The QR scanner can DM immediately; other DMs need settings approval. Groups only need a mention | Each chat has its own channel session |
| Split input | End with .. to continue, !! to flush now |
Default merge window is about 5 seconds |
| Start a new session | Send /new or /clear |
Affects only the current IM chat |
| Status / help | Send /status or /help |
Scoped to the current channel session |
| Approve a stranger DM | Open Settings → IM Assistant and approve or deny the pending request | Affects DM access only |
| Approve a tool | Reply 批准 or 拒绝 in a DM |
Also accepts yes / no / allow / reject; group replies cannot grant |
| Review on the web | Open the workspace Channels tab | IM sessions never appear under Tasks |
DingTalk replies prefer official AI Card streaming and fall back to plain text. Do not enable Webhook on the same Telegram bot.
Permissions and safety limits
| Item | Current behavior |
|---|---|
| Access | Groups need no binding, only a mention. DMs fail closed: the QR scanner is allowlisted automatically; other DM users must be approved on the settings page |
| Management API | Loopback only (localhost, 127.0.0.1, [::1]) |
| Secrets | Prefer DSH ctx.credentials; otherwise %DSH_HOME%\dsh-im-connect\secrets.json |
| Channel state | channels.json stores enablement and credential refs, not raw secrets |
| Browser payloads | Never include tokens, secrets, App Secrets, or raw user identifiers |
| WeChat protocol | Official iLink only; no reverse-engineered personal WeChat protocol |
| Tool approval | Only an allowlisted user in a DM can grant or deny; group chats cannot approve |
Do not expose DSH Web beyond this machine. Permission presets follow the host sandbox-policy; full-access does not wrap a sandbox.
Secondary development
This repository develops in src and builds to lib:
- src\index.ts: host entry, config, and lifecycle.
- src\manager.ts: channel start/stop, loopback API, and credential persistence.
- src\engine: session routing, slash commands, approval, splitting, and outbound push.
- src\channels: DingTalk, Feishu, Lark, WeChat, WeCom, QQ, and Telegram adapters.
client.js: settings page and workspace channel sidebar.tests\*.test.mjs: routing, QR, credentials, QQ, delivery, and sidebar tests.
After changing the source, test and install from the local directory:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
npm test
dsh plugin --profile web add .
When changing channel or session logic, keep the engine platform-agnostic, keep adapters from creating agents, and keep web tasks separate from IM channels.
Validation
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
npm test
prepublishOnly runs the tests before publishing.
Documentation and license
Project status, usage boundaries, architecture, and iteration records begin at the documentation entry point. The detailed operational guide is 使用说明. The default security posture is in SECURITY.md.
Licensed under Apache License 2.0.
Links
More in this category
alvinunreal/openpets#dsh★ 1075
Bridges DeepSeek Harness lifecycle status, errors, and approval requests to a locally running OpenPets desktop companion.
shaobeichen/dsh-pocket★ 120
Remote phone access to the DSH Web UI: scan a QR code for LAN or public (cloudflared tunnel) access with real-time sync, a mobile-adaptive layout, and a settings tab.
omdsh-dev/dsh-notification★ 59
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
omdsh-dev/dsh-open-in-vscode★ 49
Open DSH workspace directories in VS Code directly from the web GUI.
xmanrui/dsh-im★ 48
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
THEWOLFWALKER/dsh-notifier★ 40
Unified notification & remote control for DSH: one `notify()` API, 25+ channels (Telegram / DingTalk / Feishu / WeCom / QQ bot / WxPusher / PushPlus / ServerChan / Bark / Discord / Slack / ntfy / webhook...), level routing (timeSensitive / active / passive) with tiered retry, multi-channel inbound approval (Telegram buttons, Feishu cards, QQ, WxPusher, WeChat iLink), official QR login for QQ/DingTalk/Feishu, a local web admin console, multi-agent routing, desktop notifications — and a mobile command center: `!status` / `!stop` / `!retry` agent control from your phone plus actionable notifications (view result / retry / logs buttons that call back into the agent). Secrets redacted, tool rate-limited, zero runtime deps — plus an open event source: other plugins can inject the notifier service (ctx.notifier) and subscribe to dsh-notifier/sent events, reusing notification without coupling — and an identity system (v0.7): pairing codes (/pair in any DM, first redeemer becomes owner), composite-key bindings, member roles, and a guided bootstrap state when the whitelist is empty.