voyager
Nagi-ovo
Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any web UI, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;提示词管理器可用于任意 Web UI,含 DeepSeek Harness。
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:kriskwok/dsh-feishu-gateway
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
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.
agents.resume / agents.create); /new (or "另起会话" / "新会话" /
"重新开始" / "换个话题") starts a fresh oneTyping 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.reporting.mode: 'stream', default). Set reporting.mode: 'final'
to only receive the final result.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.post) messages with the md
tag: bold, inline code, lists and links render natively, no cards needed/api/push) to push text /
Markdown / cards to any user or groupdsh CLI), with DEEPSEEK_API_KEY
configured (the agent's model is used as-is)im:message, im:message:send_as_bot (+
im:message:send_as_bot:readonly to read content). Publish a version.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.The
Typingreaction 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 thehintTextmessage.
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).
The web profile is DSH's default GUI profile (dsh --profile web).
~/.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"
]
}
}
}
cd ~/.dsh/profiles/web && pnpm install
~/.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
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;--standalonecreates a standalone feishu profile instead).
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
All settings live in the feishu-gateway namespace (profile patch row or
~/.dsh/settings.yaml):
| Field | Default | Description |
|---|---|---|
feishu.appId |
— | Feishu app id (required) |
feishu.appSecret |
— | Feishu app secret (required) |
feishu.domain |
feishu |
feishu (CN) or lark (international) |
feishu.botOpenId |
`` | Optional; @-detection works without it |
feishu.replyMode |
at |
Group policy: at or all |
workspace |
~/Documents/DSH-Workspace |
Agent working directory |
hintText |
爸爸,我正在努力处理中…… |
Fallback "processing" text (only when the Typing reaction is disabled/unavailable) |
reporting.mode |
stream |
stream = live streaming progress card; final = only the final answer |
reporting.typingReaction |
true |
Show the native Feishu Typing reaction while working |
reporting.showReasoning |
true |
Stream the model's reasoning in the card |
reporting.showToolCalls |
true |
Stream tool-call activity in the card |
reporting.patchIntervalMs |
700 |
Min interval between card patches (Feishu rate limit) |
reporting.maxBodyChars |
900 |
Max rendered card body length |
reporting.failureReaction |
CrossMark |
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.approvalCards |
true |
Answer permission approvals with clickable cards |
interactions.userQuestionsCards |
true |
Answer ask_user_question with clickable cards |
interactions.approvalCardDispose |
update |
After 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 phrases |
Regexes that reset the session |
sessionsFile |
data/dsh-feishu-sessions.json |
Session mapping persistence |
http.port |
0 |
Admin API port (0 disables) |
http.token |
`` | Admin API bearer token |
Q&A cards in the web profile:
ask_user_questionanswers go through the singlectx.userQuestionsprovider slot. When the DSH Web UI runs in the same process (recommended setup), the Web UI owns that slot, soask_user_questionis answered there; permission-approval cards still work from Feishu in every setup. In a standalone feishu profile, bothask_user_questionand approvals are answered from Feishu cards.
meta.agentPreset + preset mount), so the model gets its tools instead of
treating tool calls as plain text.agents.get() and drives the same session instead of failing with
"while it is live" / "already exists"; both surfaces share one conversation.Enable by setting http.port. Endpoints:
GET /health — statusPOST /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 overviewpnpm 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).
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: feishu、lark。