@michengai/dsh-im-connect
Im Connect
DeepSeek Harness IM 助理:把本机 agent 接到微信、企微、钉钉、飞书、QQ、Telegram,会话与网页任务分列。
插件会安装到这里;不确定时保持 web。
npx -y @deepseek-ai/dsh plugin --profile web add @michengai/dsh-im-connect@0.1.51


@michengai/dsh-im-connect
DeepSeek Harness IM 助理:把本机 agent 接到微信、企微、钉钉、飞书、QQ、Telegram,会话与网页任务分列。
插件会安装到这里;不确定时保持 web。
npx -y @deepseek-ai/dsh plugin --profile web add @michengai/dsh-im-connect@0.1.51







Im Connect 以 @michengai/dsh-im-connect 发布,当前版本为 0.1.51。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。
Connect Feishu, Lark, DingTalk, WeCom, WeChat, QQ, and Telegram to local DeepSeek Harness
简体中文 · Changelog · Apache-2.0
DSH IM Connect is a community-maintained DeepSeek Harness (DSH) plugin, not an official DeepSeek AI product.
Send tasks to your local DSH through your usual messenger, even when you are away from the computer. Receive replies, answer questions, and handle tool approvals in the same chat.
Inbound messages are identified before commands, tool approvals, or injection.
| Case | Behavior |
|---|---|
| Group without a mention of this bot | Ignored without a reply or pending approval request; mentioning someone else also does not trigger it |
| Group explicitly mentioning this bot | No binding. Anyone can send work |
| DM from the QR scanner | WeChat / Feishu / Lark / QQ scanners are allowlisted automatically |
| DM from anyone else | Appears on the settings pending list until approved |
| DM after QR binding that does not return user identity | DingTalk / WeCom QR setup returns bot credentials only, so the scanner still needs settings approval |
| DM after manual credentials | Telegram, and DingTalk / WeCom / QQ bound manually, require approval for every DM |
| DM without a userId | Denied |
| Tool approval | Only an allowlisted user in a DM can reply Approve / Deny (or 批准 / 拒绝); group replies do not grant |
| Interactive choice | Reply with an option number or text in the originating IM conversation; separate multiple choices with commas or add a custom answer; only the initiating user can answer in a group |
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.
🔔 DingTalk
🐦 Feishu
🌐 Lark
💬 WeChat
🏢 WeCom
🐧 QQ
✈️ Telegram
| 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
Image input follows DSH Chat's model-capability and attachment rules rather than guessing vision support from model names:
The receive paths cover WeChat, WeCom, DingTalk, Feishu, Lark, QQ, and Telegram. See the image-input verification guide for protocol forms and live checks.
image support, store images as standard DSH attachments and submit image content to the model. Session history keeps image references rather than only local-path text.WeChat, WeCom, DingTalk, Feishu, Lark, QQ and Telegram accept ordinary files through Chat’s upload service for the current session. Send PDFs, documents or spreadsheets for the assistant to process. Format support follows web Chat’s models, tools and file capabilities; uploading does not guarantee that every format can be understood directly.
0.1.5-rc.1, 0.1.5-rc.2, 0.1.6-alpha.1, or 0.1.6-alpha.2. On 0.1.2-rc.1, file input asks you to upgrade; existing text and image support is unchanged./new or “allow” are content, not commands or approval responses.WeChat, WeCom, DingTalk, Feishu, Lark, QQ, and Telegram can return files produced by the assistant. For example: “Create a PDF report and send me the file.”
present, explicitly presented files are also sent, including existing files.0.1.2-rc.1 uses the host filesystem with a 32 MiB limit. Directories and symbolic links are not sent; channel-specific file limits still apply./export as a standalone command to receive the current linked session’s Chat ZIP logs in this chat, without child sessions. The ZIP limit is 32 MiB; channel limits also apply. If the file is too large or cannot be sent, use /export in web Chat. Paths and other session IDs are not accepted.After a valid selection, supported cards remove their buttons and mark the selection; the following reply reports the actual result. WeCom updates are limited to the button callback window; expired actions are still rejected by the server. /status offers actions based on the current state, such as stopping a task, pausing or resuming a goal, and viewing queued messages.
On channels with native buttons, /sessions, /workspaces and /models open a selector directly. After paging, numbered replies and /session N, /workspace N or /model N refer to the current selection page. Text channels keep their original list numbering.
Send /menu or /m to select sessions, workspaces, models and Agent presets, or start, stop, export and inspect a session. Lists support pagination. Click a button or reply with the current menu number; ordinary text exits the menu.
Menus include previous, next and back actions. WeCom menus paginate to fit card limits, including the main menu (/menu 2). Open a selector directly with /menu sessions, /menu workspaces or /menu models; presets and reasoning use /menu presets and /menu reasoning.
Common command replies offer related next steps: for example, /model → select a model / adjust reasoning → back to menu. Supported channels offer buttons; text replies include the commands to send. Navigation buttons on ordinary result replies do not accept numeric shortcuts, so numbers remain chat input; only selection menus accept numbered replies. Oversized cards fall back to complete text.
DingTalk, Telegram and Feishu/Lark use native buttons. WeCom uses cards when button count and text length fit platform limits. Other cases, QQ and WeChat use numbered text. Explicit rejections and capacity limits fall back to complete text. Uncertain network delivery produces a confirmation notice instead of resending the card. Menus are scoped to the account, chat, operator and session, expire after 15 minutes or restart, and recheck permissions on selection. Used buttons cannot execute again.
Approvals and questions use the same native-button channels: allow once/reject, single-choice selection, and multiple selections followed by submit. Open questions retain text input. If a card cannot show the full prompt or fails to send, text is used without omitting approval details. Existing approval eligibility and requester restrictions apply; disabling commands does not disable pending approvals or questions.
Agent presets: /presets (alias /presetlist) lists presets; /preset shows the current preset. /preset number-or-ID starts and switches to a new session in the current workspace, keeping previous sessions. Use /preset id:ID for numeric IDs and /preset --default for the default preset. Account defaults remain unchanged; later /new commands still use account settings. Native buttons support direct selection; text lists use numbers valid for 15 minutes.
Reasoning: /reasoning (aliases /reasonings, /reasoninglist) lists levels for the current model. Use /reasoning number or /reasoning id:effort-ID, or /reasoning --default to reset. Native channels offer paginated buttons. List selections are bound to the session and model; refresh the list after switching. Model and reasoning updates follow Chat’s default-selection persistence rules.
Work started by an IM message gets one result notice after response and file delivery finishes, with links to recent messages, status, session export and the menu. Failures, stops and delivery failures are distinguished; tasks and files are not retried automatically. When commands are disabled, notices are text-only. Ordinary numbers remain chat input. Approvals and questions keep their existing prompts. Completion navigation is suppressed after switching sessions, disabling the account or starting a later turn.
Regular chat messages follow the actual task state. Commands continue to use text replies.
Done means the turn completed normally and both text and files were delivered. Stopped or failed tasks and later queued messages are not marked done. Channel permissions and network conditions may prevent status updates without blocking chat. Text labels follow the web language setting.
Use Diagnose connection in account settings to query platform APIs: WeChat configuration, a ping acknowledgement on the existing WeCom connection, DingTalk credentials, Feishu/Lark credentials and bot identity, QQ credentials and gateway, or Telegram bot identity and Webhook conflicts.
Each check reports passed, failed, or unverified, with timing and a suggested next step. No test messages are sent and no extra message polling is started. Passing one check does not verify all messaging permissions. An older backend prompts you to restart DSH and refresh the page. See the connection diagnostics API and validation notes (Chinese).
Add accounts under each channel in Settings → IM Assistant. Expand a channel, select an account, and configure its workspace, model, permission, and private access independently in its settings dialog. The Receive messages switch is on the account row:
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:
WeCom chat WeChat chat DingTalk chat
Feishu chat QQ chat Telegram chat
For a desktop workbench, download DSH Codex Desktop. Existing DeepSeek Harness installations can add plugins as needed by following each project's README. Below are 11 first-party plugins; consult the corresponding desktop release notes and bundled catalog for what that version includes.
| Plugin | What you can do |
|---|---|
| Codex UI | Organize projects and conversations, search tasks, and navigate chat turns |
| Agency Agents | Choose and summon specialists for your task |
| Skills Manager | Find, enable, create, and import local skills |
| Archive Manager | Search, restore, or clean up archived conversations |
| IM Connect | Send tasks and receive replies through messaging platforms |
| Automation | Schedule tasks and review each run |
| BTW | Ask side questions without interrupting the main task |
| Simplify | Use /simplify to improve code within your Git changes |
| PUA | Guide the Agent to try new approaches after failures, investigate causes, and verify results before completion |
| Code Review | Use /review to request an independent Agent code review and receive the report in the current conversation |
| Codex Pet | View conversation notifications and respond to tool approvals and questions through a desktop pet |
dsh available in PowerShell.0.1.2-rc.1, 0.1.5-rc.1, 0.1.5-rc.2, 0.1.6-alpha.1, and 0.1.6-alpha.2; the last is recommended and pinned for development. DSH 0.1.0-rc.8 and 0.1.1-rc.2 lack the authentication and session-control interfaces this plugin requires; upgrade DSH first.web profile; replace it with the target profile.npm install in an arbitrary directory.dsh web and hard-refresh the browser before opening Settings → IM Assistant.The installation commands below use the official npm registry.
Send the prompt below to any agent that can run terminal commands on your computer. Replace web with your actual profile. Once installed, use the plugin in DSH.
Install the DSH plugin @michengai/dsh-im-connect into my local web profile by running: dsh plugin --profile web add @michengai/dsh-im-connect@latest --registry=https://registry.npmjs.org/. Then run dsh --profile web --dump-config, confirm the configuration includes im-connect, and explain how to reload DSH and start using the plugin.
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.28.
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.
The settings title shows the installed version and a Check for updates button. When a newer release is available, Update automatically runs only when the DSH CLI or Desktop update service is available; otherwise, the dialog provides a profile-specific manual command to copy and run.
Open Settings → IM Assistant, select Add account under the target channel, then choose that account's workspace, model, permission, and private-access mode.
| Goal | Action | Notes |
|---|---|---|
| Add an account | Select Add account under a channel, choose the account settings, then scan or enter credentials | The same channel can contain multiple accounts; Feishu / Lark / WeChat are QR-only, while Telegram needs a Bot Token |
| Change account settings | Expand the channel, select an account, then edit its workspace, model, reasoning effort, permission, or private-access mode in its settings dialog | Changes affect only that account and apply to its subsequent sessions immediately |
| Pause receiving | Turn off Receive messages on the account row | Credentials and settings stay; only new inbound messages for that account pause |
| Send work from IM | WeChat / Feishu / Lark / QQ QR scanners can DM immediately; DingTalk / WeCom scanners and other users need 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 | Creates and switches the current IM session; previous sessions stay in the Channels list without affecting web tasks |
| Status / help | Send /status or /help | Current session and dynamically discovered Chat commands |
| Agent preset | Choose Agent preset when adding or editing an account | Uses the Chat roster; changes apply to new sessions while previous sessions keep their preset |
| Command permissions | Open Settings on the account row and toggle DM/group commands | Admission is checked first; disabling commands keeps conversation and approval/question replies available |
| Sessions / workspaces | /sessions, /session <number or ID>; /workspaces, /workspace <number or ID> | Resume ordinary Chat sessions; workspace selection creates a session without changing account defaults |
| Task controls | /stop, /steer <text>, /queue | Stop, provide instructions, or inspect the queue; stopping preserves Host queued messages |
After /workspace, /new and continuing after archiving the current session keep the selected workspace and use the account model, Agent preset, and permission preset. /session and /fork preserve the original session configuration.
DingTalk replies prefer official AI Card streaming. If card creation fails, plain text preserves line breaks; code fences and list markers remain literal. Do not enable Webhook on the same Telegram bot.
Send commands as separate text messages; image captions remain ordinary input. Start with /help; individual replies also suggest related actions.
/model and /reasoning also attempt to save the default for future sessions. Other existing sessions are not changed./stop submits a stop request and keeps queued messages. Pause an active goal separately with /goal pause. Use /queue to view and manage queued messages./fork requires at least one completed turn. If a fork was created but switching failed, follow the session ID and recovery instructions in the reply./permission settings survive session restoration. /export follows private-chat admission and private/group command permissions. Completion is reported only after the ZIP file is sent.Command replies support Chinese and English and follow the language explicitly saved in web settings. With no preference or an unavailable language service, they default to Chinese. Dynamic names, paths, user content, and extension results remain unchanged. Tool approvals, interactive questions, and some channel errors are not yet fully localized.
Command permission does not grant DM admission or replace tool approval. Enabled users can inspect and resume ordinary Chat sessions and execute registered Host commands. Each account has independent DM/group switches without user IDs; legacy configurations default to enabled for compatibility.
| Item | Current behavior |
|---|---|
| Access | Groups need no binding, only a mention. Each account can allow only approved users or all DM users; approved-only is the default, and WeChat / Feishu / Lark / QQ QR scanners are added to that account's allowlist automatically |
| Management API | Uses /api/dsh-im-connect, following the REST prefix used by other DSH plugins. It delegates Host, Origin, and Cookie checks to Host connection.requestRejection, including local requests. Unavailable authentication returns 503; mutations retain JSON, client-header, and 1 MiB limits |
| Secrets | WeChat tokens and other secrets prefer DSH ctx.credentials; otherwise they use plaintext %DSH_HOME%\dsh-im-connect\secrets.json, restricted to the current user and never safe to sync or share |
| Account state | channels.json stores per-account workspace, model, permission, private access, enablement, and credential refs, not raw secrets |
| Browser payloads | Never include tokens, secrets, App Secrets, or internal error details |
| WeChat protocol | Official iLink only; no reverse-engineered personal WeChat protocol |
| Tool approval | Only a user on the current account's allowlist can grant or deny in a DM. Even when all DM users may chat, unapproved users cannot approve tools; approvals cannot cross conversations or come from groups |
| Interactive questions | Single-choice, multiple-choice, and custom questions return to the originating IM conversation; one conversation handles them in order, and only the initiating user can answer in a group |
Keep the DSH backend listening on loopback. Remote access should use a controlled HTTPS reverse proxy, the actual authority in the Host's trustedHosts, and a login through that authority. Do not spoof localhost or remove authentication to bypass 403. Image-download additionalImageHosts does not configure management access; see management authentication. Permission presets use the same host sandbox-policy values as Chat; danger-full-access does not wrap a sandbox.
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
# Replace this with an existing projects directory.
Set-Location "$HOME\Projects"
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.
This repository develops in src and builds to lib:
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.
IM and Automation share tabs through the active sidebar.workspaces entry and the __dshNativeTabs registry on the entry or component. This is an inter-plugin convention, not an official stable DSH API. When replacing or restoring a sidebar component or handing over a registry without a host slot notification, the changing plugin should dispatch dsh-native-sidebar-change on window in a microtask after updating its state (a plain Event, with no payload). Receivers reread the active entry. Inserting a tab alone must not forward the event, to avoid notification loops.
Cleanup restores only components still owned by the plugin, removes its own registry and tabs, and releases event, slot, and tab subscriptions. Changes to the event name, registry structure, or notification semantics require coordinated compatibility updates. IM retries startup every 250ms for at most 20 attempts and stops early after inserting a tab. This only covers startup ordering; it cannot guarantee reconnection when an older plugin silently replaces a component after retries end.
For real management-authentication tests, set DSH_CONNECTION_CONTRACT_ROOT to the isolated @deepseek-ai/dsh-client-connection package root. The Gateway-coexistence case also uses DSH_CHAT_CONTRACT_ROOT from the image contracts. Local runs skip these contracts when unconfigured; CI supplies both. Tests use temporary HTTP servers and credentials, not a live Cloudflare deployment.
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
npm test
prepublishOnly runs the tests before publishing.
Sidebar tests read the built lib/client.js; run npm run build before invoking individual tests directly. The lifecycle harness verifies attachment and disposal with simulated slots, notifications, and timers. It does not render React or replace validation of real messages, archiving, scheduled tasks, or Desktop.
Delivery tracking starts with ordinary IM messages received after this feature is enabled. If the original result is saved but sending has not started, its final text and completion status can be recovered after reconnecting or restarting. Questions, tools, approvals, and files are never replayed. Messages handled by earlier plugin versions are not recovered retroactively.
/delivery to check records, then /delivery retry <record-ID> if you want to resend. This may duplicate text you already received. View files in the original session on the web.Security guidance is in SECURITY.md.
Licensed under Apache License 2.0.
| Session with a preset | /presets, /preset <number or ID>, /preset --default | Starts and connects a new session in the current workspace without changing account defaults |
| Model / reasoning | /models, /model <number or provider/model>, /reasoning [effort or --default] | Changes the current selection and updates the Host default for subsequent Chat sessions |
| Result recovery | /delivery, /delivery retry <record-ID> | Check recent deliveries and resend text from the original task |
| Session management | /history, /rename <title>, /fork | Recent text history, rename, or fork and switch |
| Approve a stranger DM | Open Settings → IM Assistant and approve or deny the pending request | Affects DM access only |
| Answer an interactive question | Reply with an option number or text; separate multiple choices with commas, or enter a custom answer | Multiple questions arrive in order; only the initiating user can answer in a group |
| Approve a tool | Reply Approve / Deny 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 |