DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Feishu Gateway — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins

@kriskwok/dsh-feishu-gateway

Feishu Gateway

DeepSeek Harness-native Feishu (Lark) gateway: chat with the DSH agent from Feishu via long connection, with persistent sessions, /new, Markdown replies, live streaming progress cards, native Typing reactions, click-to-answer approval / Q&A cards, and pro

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add @kriskwok/dsh-feishu-gateway@0.2.15
READMECompatibilityVersions

Compatibility and provenance

Feishu Gateway is published as @kriskwok/dsh-feishu-gateway and currently resolves to version 0.2.15. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
npm
Registry updated
9/21/2026

Versions

0.2.15stable
8/26/2026
0.2.14stable
8/25/2026
0.2.13stable
8/25/2026
Show 15 more versionsCollapse versions
0.2.12stable
8/25/2026
0.2.11stable
8/18/2026
0.2.10stable
8/18/2026
0.2.9stable
8/18/2026
0.2.8stable
8/18/2026
0.2.7stable
8/18/2026
0.2.6stable
8/18/2026
0.2.5stable
8/18/2026
0.2.4stable
8/18/2026
0.2.3stable
8/15/2026
0.2.2stable
8/15/2026
0.2.1stable
8/15/2026
0.2.0stable
8/15/2026
0.1.1stable
8/14/2026
0.1.0stable
8/14/2026

Related plugins

Loading related plugins…

Latest
0.2.15
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
240.1 kB
Files
35
Surface
any
License
MIT
Source
npm
GitHub
★ 2
Weekly downloads
139
Security scan
✓ v0.2.15 scan passed
Last push
8/26/2026
View source ↗Project homepage ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in integrations-communication.

Acp App@deepseek-ai/dsh-acp-appThe dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-baseRemote Web Ui@linxin666/dsh-remote-web-uiScan-to-pair remote access for the dsh web GUI that shares one official interface: a QR beside the settings button pairs phones and PCs into the same Web GUI (a portrait-touch adaptation layer for phones, full desktop on PCs) through one-time tokens and rIm@xmanrui/dsh-im把十一种 IM 渠道和公网 AI Office 接入本机 DeepSeek Harness。 Connect eleven IM channels and a public AI Office to a local DeepSeek Harness.Pocketdsh-pocketPut DeepSeek Harness in your pocket: one package, one settings page, and scan a QR code on your phone to access DSH on your computer in sync (LAN + public network, real-time screen mirroring).

README

dsh-feishu-gateway

English | 中文

Chat with your DeepSeek Harness (DSH) agent from Feishu (Lark).

A DSH plugin bundle that mounts a Feishu long-connection listener; every Feishu message is routed to a stable DSH session (resumed via the agents service, so multi-turn chats stay in the same session), and the agent's answer is replied as a Markdown-rich post message. It also supports /new to start a fresh session, a native Typing reaction while the answer is being produced, live streaming progress cards for long tasks, click-to-answer cards for permission approvals and the model's ask_user_question tool, and proactive push.

Features

  • 💬 Full conversation — Feishu private chat, or group @bot → DSH agent → reply. In groups, every topic/thread is its own independent DSH session, and all messages in that topic stay in the same session until /new.
  • 🔁 Persistent sessions — each Feishu conversation (or group topic) maps to one DSH session (agents.resume / agents.create); /new (or "另起会话" / "新会话" / "重新开始" / "换个话题") starts a fresh one, including inside a group topic.
  • ⌨️ Native Typing indicator — while the agent works, the bot adds a Typing reaction to your message (like hermes-agent's Feishu gateway); it stays until the answer is done, and is swapped for a CrossMark reaction on failure. No more "thinking…" hint text by default.
  • 🎞 Streaming progress — long tasks report continuously: a live interactive card streams the agent's thinking, tool calls, and answer draft as they happen (reporting.mode: 'stream', default). Set reporting.mode: 'final' to only receive the final result.
  • 🃏 Click-to-answer cards — permission approvals (approval/request, e.g. sandbox escalation) and the model's ask_user_question tool render as Feishu interactive cards: click ✅ 允许一次 / 🚫 拒绝 or an option button to answer. The click response instantly replaces the card with a decided state (buttons removed, result shown) plus a toast confirmation.
  • ✍️ Markdown replies — plain rich-text (post) messages with the md tag: bold, inline code, lists and links render natively, no cards needed
  • 🧩 Web-only interactive fences degrade gracefully — model-emitted dsh-ui interactive UI fences (e.g. from dsh-genui) only render in the Web UI; on Feishu they are auto-downgraded to a one-line readable hint (title extracted, "view in Web UI"), never a raw JSON code block
  • 🤖 Full agent capability — the DSH agent runs with its own model and tools (bash, files, subagents…), fully autonomous
  • 📨 Proactive push — optional admin HTTP API (/api/push) to push text / Markdown / cards to any user or group
  • 🔌 No public network required — Feishu long connection, no webhook URL
  • 🗂 Persistence — Feishu↔DSH session mapping survives restarts

Requirements

  • DeepSeek Harness installed and built (dsh CLI), with DEEPSEEK_API_KEY configured (the agent's model is used as-is)
  • A Feishu open-platform self-built app with the bot capability enabled (see below)

Feishu app setup

  1. Feishu Open Platform → create a self-built app.
  2. Enable the bot capability.
  3. Grant permissions: im:message, im:message:send_as_bot (+ im:message:send_as_bot:readonly to read content). Publish a version.
  4. Under Events & callbacks, choose long connection and subscribe to im.message.receive_v1 (no public URL needed). The same long connection also delivers card button clicks (card.action.trigger, used by the approval / Q&A cards) — no webhook URL required.
  5. In Feishu, search the app name and add the bot as a contact.

The Typing reaction indicator and card buttons need the bot to be able to interact with messages in the chat (im:message). If the reaction API is denied, the gateway automatically falls back to the hintText message.

Installation (as a DSH plugin)

Prerequisite: this package is published on npm and dsh is on your PATH.

The recommended setup mounts the gateway into the web profile: it runs in the same process as the DSH Web UI, so starting the Web UI also starts the Feishu gateway, and both share the same DSH agent. A standalone profile is also supported (see "Alternative" at the end).

Option 1 (recommended): mount into the web profile

The web profile is DSH's default GUI profile (dsh --profile web).

  1. Edit ~/.dsh/profiles/web/package.json to add the dependency and bundle:
{
  "name": "dsh-profile-web",
  "private": true,
  "dependencies": {
    "@kriskwok/dsh-feishu-gateway": "^0.2.0"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "@kriskwok/dsh-feishu-gateway"
      ]
    }
  }
}
  1. Install dependencies in the web profile directory:
cd ~/.dsh/profiles/web && pnpm install
  1. Edit ~/.dsh/profiles/web/cordis.patch.yml and fill in your Feishu app credentials:
- id: feishu-gateway
  config:
    feishu:
      appId: cli_xxxxxxxxxxxxxxxx
      appSecret: xxxxxxxxxxxxxxxxxxxxxxxx
    http:
      port: 3100      # optional admin API
      token: your-token
  1. Start (or restart) the web profile:
dsh --profile web

You can also use the one-shot script from this repository: ./scripts/create-profile.sh (mounts into the web profile by default; --standalone creates a standalone feishu profile instead).

Alternative: standalone feishu profile

To run the gateway without the Web UI, use a standalone profile:

mkdir -p ~/.dsh/profiles/feishu && cd ~/.dsh/profiles/feishu

cat > package.json <<'EOF'
{
  "name": "dsh-profile-feishu",
  "private": true,
  "dependencies": {
    "@kriskwok/dsh-feishu-gateway": "^0.2.0"
  },
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "@kriskwok/dsh-feishu-gateway"]
    }
  }
}
EOF

cat > pnpm-workspace.yaml <<'EOF'
packages:
  - .
nodeLinker: hoisted
autoInstallPeers: false
EOF

pnpm install
# then create ~/.dsh/profiles/feishu/cordis.patch.yml with your app credentials
dsh --profile feishu

Configuration

All settings live in the feishu-gateway namespace (profile patch row or ~/.dsh/settings.yaml):

FieldDefaultDescription
feishu.appId—Feishu app id (required)
feishu.appSecret—Feishu app secret (required)
feishu.domainfeishufeishu (CN) or lark (international)
feishu.botOpenId``Optional; @-detection works without it
feishu.replyModeatGroup policy: at (reply only when @-mentioned) or all (reply to every message). Each group topic/thread is its own DSH session.
workspace/root/Documents/DSH-WorkspaceAgent working directory (the session is also auto-attached to the matching DSH Workspace, so it groups under that Workspace in the Web UI instead of "Ungrouped"). Both private and group-topic sessions are anchored here.
hintText爸爸,我正在努力处理中……Fallback "processing" text (only when the Typing reaction is disabled/unavailable)
reporting.modestreamstream = live streaming progress card; final = only the final answer
reporting.typingReactiontrueShow the native Feishu Typing reaction while working
reporting.showReasoningtrueStream the model's reasoning in the card
reporting.showToolCallstrueStream tool-call activity in the card
reporting.patchIntervalMs1100Min interval between card patches; Feishu limits single-message updates to ~1/s (error 230020), and the stream backs off adaptively on failure
reporting.maxBodyChars900Max rendered card body length
reporting.failureReactionCrossMark

Q&A cards in the web profile: ask_user_question answers go through the single ctx.userQuestions provider slot. The gateway never claims that slot (stealing it makes the Web UI's apiProxy host fail to start with DUPLICATE_PROVIDER); it wraps service.ask at the service boundary instead: sessions owned by a Feishu conversation are answered with Feishu cards, while every other session continues through the registered UI provider. Permission-approval cards work from Feishu in every setup. In a standalone feishu profile, both ask_user_question and approvals are answered from Feishu cards.

Session coexistence & self-healing

  • Preset composition (tools!) — in preset-roster deployments (e.g. the web profile), Feishu agents are composed from the deployment's agent preset (meta.agentPreset + preset mount), so the model gets its tools instead of treating tool calls as plain text.
  • Web UI coexistence — sessions have a single live owner. When the Web UI opens a session, the Feishu side takes over the running agent via agents.get() and drives the same session instead of failing with "while it is live" / "already exists"; both surfaces share one conversation.
  • Wedged-session self-heal — if a crashed process leaves a session permanently conflicted ("already exists"), the gateway mints a fresh session id, re-points the Feishu conversation at it, and continues chatting.

Admin HTTP API (optional)

Enable by setting http.port. Endpoints:

  • GET /health — status
  • POST /api/push — proactive push { "receive_id": "ou_xxx", "receive_id_type": "open_id", "msg_type": "text", "content": "{\"text\":\"hi\"}" }
  • GET /api/sessions — Feishu↔DSH session mapping overview

Development

pnpm install
pnpm build     # tsc → lib/
pnpm test      # offline self-tests

Note: @deepseek-ai/* packages are provided by the DSH host at runtime; for local type-checking they are symlinked from your deepseek-harness checkout (see the publish checklist).

License

MIT

Reaction added on failure (after removing Typing)
reporting.cardTitleStreaming🤖 DSH 处理中…Custom title of the streaming card while working (yellow header)
reporting.cardTitleDone🤖 DSH 处理完成Custom title of the streaming card when complete (green header)
interactions.approvalCardstrueAnswer permission approvals with clickable cards
interactions.userQuestionsCardstrueAnswer ask_user_question with clickable cards
interactions.approvalCardDisposeupdateAfter an approval-card click: update instantly replaces the card with a decided state (buttons removed, result shown) + toast; recall recalls the card message (falls back to update when recall fails — note Feishu leaves a "撤回了一条消息" placeholder)
newSessionPatterns/new + Chinese phrasesRegexes that reset the session
sessionsFiledata/dsh-feishu-sessions.jsonSession mapping persistence
http.port0Admin API port (0 disables)
http.token``Admin API bearer token