dsh
OpenPetsHQ/openpets将 DeepSeek Harness 的生命周期状态、错误与审批请求,桥接到本地运行的 OpenPets 桌面伙伴。
把微信、企业微信、钉钉、飞书、Lark、QQ、Telegram 接到本机 DeepSeek Harness,每个 IM 聊天对应一条独立工作区频道。
Connect Feishu, Lark, DingTalk, WeCom, WeChat, QQ, Telegram, Discord, and Slack to local DeepSeek Harness
简体中文 · Changelog · QQ reference notes · 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, Discord, Slack, and DingTalk / WeCom / QQ bound manually, require approval for every DM DM without a userId · Denied Tool approval · Reply Approve / Deny (or 批准 / 拒绝) in the chat bound to that session; works in DMs and groups, and never falls back to the web. No reply within 5 minutes cancels the action, and other text is not queued behind it 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 🎮 Discord 🧩 Slack
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, or App ID / App Secret; QR creates the bot automatically · Feishu account, or a self-built bot with App ID / Secret 🌐 Lark · ✅ Ready · QR, or App ID / App Secret · Lark account, or a self-built bot with App ID / Secret 💬 WeChat · ✅ Ready* · Official iLink QR · Dedicated account recommended; DM only 🏢 WeCom · ✅ Ready · QR (recommended), or Bot ID / Secret · WeCom intelligent bot 🐧 QQ · ✅ 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 🎮 Discord · ✅ Ready · Bot Token only · Official Developer Portal bot. Enable the Message Content Intent. The first mention in a text or announcement channel continues in a thread without another mention 🧩 Slack · ✅ Ready · Bot Token and App Token · Create an app at api.slack.com and enable Socket Mode. DMs reply directly; channel mentions reply inside that message's thread, and later replies in the thread need no new mention
✅ Ready = text in and out works | *WeChat = official iLink only, no reverse-engineered personal protocol | Groups still require an @ mention. Discord skips repeat mentions only inside a thread the bot created; Slack skips them inside a thread the bot already joined
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, Telegram, Discord, and Slack. 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, Telegram, Discord, and Slack 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.2.0-rc.1, 0.2.0-rc.2, 0.2.1-rc.1, and 0.2.1-rc.2. Hosts before 0.2.0, the 0.2.1 alphas, and stable 0.2.0 are refused by the version gate and the plugin will not run; saved account settings stay in the profile. If you still use a 0.1.x host, install plugin 0.1.78 instead of @latest./new or “allow” are content, not commands or approval responses.WeChat, WeCom, DingTalk, Feishu, Lark, QQ, Telegram, Discord, and Slack 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./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, Discord, Slack, 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. Approvals always stay in the chat that started the task and never fall back to the web; a failed prompt is treated as a denial. If nobody approves or rejects within 5 minutes, the action is canceled and the chat is told it did not run. Other text during that wait is reminded to finish the approval and is not submitted as the next turn. Images and files are still submitted as content and are not treated as the approval reply. In groups only the task initiator can approve; DMs add no extra restriction beyond chatting. Disabling commands does not disable pending approvals or questions. Questions have no such timeout; the next text message is still the answer.
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.
reactions:write). Answers stream by editing one message; Slack has no bot typing indicator.WeChat suppresses transition text in assistant messages that also contain tool-call blocks to reduce reply-window usage. Text-only replies, approvals, questions, and result files are unaffected by this filter. Suppressed text does not count as a successful delivery, and history-based redelivery uses the same rule. This does not remove platform limits: long reply fragments and necessary interactions may still exhaust the window. Ambiguous or partial deliveries are not blindly resent in full. See the WeChat delivery handoff (Chinese).
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, Telegram bot identity and Webhook conflicts, Discord bot identity and Gateway URL, or Slack bot identity plus Socket Mode state when a connection already exists (no new connection is opened).
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 and click an account name to add a remark so you can tell users apart; leave it blank to restore the automatic name. The settings button configures workspace, model, permission, private access, and send mode, and can edit the same remark. 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:
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.2.0-rc.1, 0.2.0-rc.2, 0.2.1-rc.1, and 0.2.1-rc.2; 0.2.1-rc.2 is recommended. 0.2.1-alpha.1 through 0.2.1-alpha.5, stable 0.2.0, and hosts before 0.2.0 are refused by the version gate: the plugin will not run, and existing IM settings in the profile are not deleted. If you still use a 0.1.x host, install plugin 0.1.78 instead of @latest.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./app/dsh/). API and update endpoints automatically resolve against the page base URI (document.baseURI), preventing 404 errors caused by lost prefix segments.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-configTo 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 plugin follows standard DSH bundle configuration conventions. Options are located at:
Sidebar → Plugins → Click `@michengai/dsh-im-connect` (the host's plugins.bundle.config slot).Two native switches are available. Their values are persisted in channels.json under the plugin's stateDir and survive restarts; they are not two equivalent Cordis YAML options. sidebarEntry is managed through this UI, while onlineUpdate is also subject to the host lock described below:
sidebarEntry)false)onlineUpdate / updater)true)HTTP 403 for all check and install requests, preventing unreviewed updates;