dsh-reach
Multi-channel decision & remote-control bridge for DeepSeek Harness: pushes any workspace's approval/question cards to IM channels (WeChat iLink first) and answers them from chat, with a session console, per-channel security, and an open push service.
- Stars
- 0
- Language
- TypeScript
- Created
- Sep 3, 2026
- Updated
- Sep 3, 2026
Introduction
dsh-reach
Multi-channel decision & remote-control bridge for DeepSeek Harness (DSH): pushes any workspace's approval/question cards to IM channels (WeChat iLink, Telegram, Feishu — plus QQ/DingTalk/WeCom v2 drop-in foundations) and answers them from chat, with a session console, per-channel security, and an open push service.
Status: Phase 1–3 complete (WeChat + Telegram + Feishu channels, v0.1.1); v2 channel foundations (QQ/DingTalk/WeCom) on the open
reachChannelsregistry. The design plan, competitor research, official contract verification, and phased roadmap live indocs/design/03-rebuild-direction-and-plan.md. Release (GitHub repo + npm publish) follows in a dedicated session.
Features (Phase 1)
- Cross-session decision push: approval/question cards from ANY workspace
are mirrored to WeChat (iLink/ClawBot) with stable
#tokenids andP{n}numbering; reply1/2,P1=1 P2=2,P1=Q1=2, or/rp/rq— answered through the native pending waterfall (first reply wins with the GUI). - Fail-closed security: first sender becomes the owner; empty allowlists deny everyone; unknown senders are audited and never answered.
- Session console:
/status /silent /notify /tasks /enter /history /stop /next /helpplus native DSH command passthrough. - Proactive push: the
reach_sendtool with an outbound file fence; rate budget + FIFO re-queue; silent mode; background completion notices. - Settings tab: Settings → Plugins → IM Bridge (status, switches, re-scan/logout).
- Open channel registry: third-party plugins register a channel via
ctx.get('reachChannels').registerChannel({ id, adapter, priority, ownsChatId, startMonitor }); routing, outbound, and monitor lifecycle are all bridge-owned (QQ/DingTalk/WeCom ride this same path).
Install
npx @deepseek-ai/dsh plugin --profile web add dsh-reach
dsh1024 plugin --profile web add dsh-reach
Restart DSH after installation (bundle patches apply at startup).
Configuration
The profile row accepts these keys (Schemastery-validated; invalid values fail the load loudly):
| Key | Default | Description |
|---|---|---|
crossSessionNotify | true | Push decision cards from ANY workspace/session (master switch) |
notifyTaskEvents | false | Background task finished/errored notifications |
cardTimeoutSec | 1800 | Decision-card soft timeout in seconds (0 = wait forever) |
approvalOnTimeout | delegate | Timed-out card policy: delegate (GUI chain) / reject / wait |
textChunkLimit | 4000 | Long reply chunk limit per message, in characters |
silent | false | Only final replies, no per-step streaming |
cwd | '' | Default working directory for new IM sessions ('' = host cwd) |
baseUrl / cdnBaseUrl / botType | iLink defaults | WeChat gateway, media CDN, bot type |
allowFrom | [] | Sender allowlist (empty = fail-closed; first sender = owner) |
queueMode | queue | Busy delivery: queue or steer |
maxQueue / sendBudget / windowSec | 50 / 10 / 60 | Queue cap, per-window send budget, window seconds |
denyUnauthorized | false | Silently ignore (true) or notice (false) unknown senders |
Development
pnpm install
pnpm run typecheck && pnpm run typecheck:ci && pnpm test
pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts
pnpm run check:readmes && pnpm pack
License
Apache-2.0. Third-party notices in THIRD_PARTY_NOTICES.md.