README.md
September 11, 2026 · View on GitHub
English · 中文
dsh-im
Plugin Center → Installed → IM bots: connect the local Harness to chat apps.
Feishu · WeChat · DingTalk · WeCom · QQ · Slack · Telegram · Discord · WhatsApp · AI Office
English · 中文 · xiaotaozi-dsh · THIRD_PARTY_NOTICES.md
A DeepSeek Harness plugin. Scan a QR code, paste an App Manifest, or enter bot credentials. Each channel can hold several bots. Credentials stay in the Host credential store.
Runtime logic lives under src/channels/; Cordis RPC wiring is under src/host/; the Web UI is src/client/.
Part of the xiaotaozi-dsh monorepo. User-facing copy follows the Harness language (Chinese / English). Channel adapters come from xmanrui/dsh-im (MIT). See THIRD_PARTY_NOTICES.md. Do not dsh plugin add the repository root.
What it unlocks
- Nine chat channels plus experimental AI Office. QR, App Manifest, or existing secrets, depending on the product.
- Several bots per channel. Secrets never go in the client bundle.
- Files in both directions. Chat files land in the current session workspace; results come back as native attachments.
- Project selection while connecting. Select an existing Web project before the bot is fully online.
- Bot commands in the chat. Switch projects, sessions, models, and presets without leaving the conversation.
- Per-bot Agent Preset and role. Each bot carries its own toolset and a short scope instruction.
- WeCom office on the robot card. Calendars, docs, and meetings are enabled per WeCom bot, never on a separate page.
Quick start
dsh plugin --profile web add github:kedoupi/xiaotaozi-dsh#path:plugins/im
dsh web
Then open Plugin Center → Installed → IM bots. The full channel manager is embedded here; there is no separate IM sidebar entry or channel settings column. Leave sandbox pnpm dev running while you edit; host restarts itself when lib/index.js changes.
See it
| Channel hub | Credential-free setup |
|---|---|
![]() | ![]() |
Channels
| Channel | Setup |
|---|---|
| Feishu | QR or App ID + Secret; streaming cards; group @/all-message mode; session watches |
| QR via Tencent iLink | |
| DingTalk | QR or Client ID + Secret; AI Card stream |
| WeCom | QR or Bot ID + Secret; office capability section on the robot card |
| QR or AppID + AppSecret; Markdown replies, one progress bubble in DMs | |
| Slack | App Manifest + Bot/App tokens |
| Telegram | BotFather token; optional DM allowlist; native Rich Messages (draft in DMs, in-place in groups/topics) |
| Discord | Bot token. Enable Message Content Intent. Server text/announcement mentions open a Public Thread; grant Create Public Threads, Send Messages in Threads, Send Messages, and Read Message History. Result files also need Attach Files. |
| Linked-device QR (unofficial WhatsApp Web; use a dedicated number). Default access is Only me; Selected contacts and Open responses are available per bot. | |
| AI Office | Outbound heartbeat + SSE; experimental, off unless officeEnabled: true |
Projects and sessions
- Existing projects only. The picker lists only current Web projects; it never creates one. Cancelling leaves a new bot pending, so inbound work cannot fall back to the repository directory. WeCom project selection is not tied to authentication. Feishu provisioning failures stay failed (retry copy is translated); they do not keep spinning.
- Bot commands in the chat.
/help/new/status/models/model/presetlist/preset/stop/steer/compact/workspace/workspacelist/sessionlist/session./workspacelistlists Web projects;/workspaceswitches by list number or unique project title. - Per-bot Agent Preset. Pick a preset in the IM hub or with
/preset; new sessions follow it, existing chats need/newfirst. - Per-bot role / scope. A short instruction on the bot card, applied on every inbound turn. Project
AGENTS.mdstays shared; Agent Preset still owns the toolset. - WeCom final answers after approval. After an approval or follow-up question, the result is a new message. Updating the original thinking stream is not shown on WeCom.
- Broken tool turns. Incomplete
tool_callshistory tells the user to/stopand start a new session instead of a generic unknown error./newdoes not fix a Harness tool-scheduler crash (reading 'prepare'); see the product FAQ.
Files and results
Ordinary chat files (not just images) are staged into the current Harness session and show as an uploaded-file line plus a workspace path, not a raw JSON dump. Result files and images come back as native channel attachments with the dsh_im_return_file tool. Slack apps need files:write as well as files:read.
WeCom office boundary
WeCom chat is this plugin; WeCom office (calendars, docs, meetings) is dsh-wecom-office, enabled and managed on each WeCom robot card. With it installed, each WeCom robot card has an office section: enable office, switch the office bot explicitly, and manage the allow-write switch. One office bot at a time; it never follows which bot delivered a message. There is no separate office settings page.
Data and resilience
- Credentials stay in the Host credential store; secrets never go in the client bundle.
- Config defaults to loopback RPC, isolated channel failures, a 600000ms reply timeout, and a 20000ms connect timeout. QQ, WhatsApp, and Office are loaded on demand;
agentPresetcan provide the default preset. - English bot copy. Host
language: enorDSH_IM_LANGUAGE=enswitches prompts and command help. Untranslated strings stay Chinese.
Develop
AI Office is disabled by default. Enable it per profile with officeEnabled: true in Config (or office.enabled: true); the channel then also needs its own connector credentials.
From the monorepo root:
pnpm --filter dsh-im test
pnpm --filter dsh-im build
node scripts/link-plugin.mjs --profile web im
pnpm dev
Documentation
| Doc | Read it when |
|---|---|
| THIRD_PARTY_NOTICES.md | Upstream MIT attribution |
| dsh-wecom-office | WeCom calendars, docs, meetings (managed on the robot card) |
| Workflow | Create, install, simplify, commit |
| Conventions | Package identity and two homes |
| xiaotaozi-dsh | The rest of the monorepo |

