🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

飞书控制台 PGZXB/dsh-feishu

DeepSeek Harnessv0.3.7
PGZXB3 天前有提交已提供中文文档扫描:含敏感能力需联网

给 DeepSeek Harnessdsh做的飞书 UI——一个 dsh 原生插件,带面板驱动的控制台:每个…

48.3/100
综合分
35
GitHub 星标
711
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @dsh-feishu/dsh-feishu
npm 源 · @dsh-feishu/dsh-feishu 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · platform
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@dsh-feishu/dsh-feishu @ 0.3.7
✓Node 引擎要求 >=22.13 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 02:40:25

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 61 处,展示前 61 条)
  • 读取密钥环境变量
    lib/index.js:70
    const appSecret = config.appSecret ?? process.env.FEISHU_APP_SECRET;
  • 读取本地文件
    lib/index.js:180
    files = readdirSync(dir);
  • 读取本地文件
    lib/index.js:189
    const data = new Uint8Array(readFileSync(join(dir, file)));
  • 读取本地文件
    lib/index.js:192
    mediaType = readFileSync(join(dir, `${key}.mediaType`), 'utf8').trim();
  • 写入本地文件
    lib/index.js:422
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:428
    await pipeline(stream, createWriteStream(path));
  • 执行外部命令固定命令
    lib/setup/cli.js:150
    const probe = spawnSync('sh', ['-c', 'command -v dsh'], { encoding: 'utf8' });
  • 执行外部命令来自配置/变量
    lib/setup/cli.js:166
    const child = spawn(bin, ['--profile', profileName], {
  • 写入本地文件
    lib/setup/cli.js:280
    writeFileSync(manifestPath, JSON.stringify(FEISHU_MANIFEST, null, 2), 'utf8');
  • 读取本地文件
    lib/setup/cli.js:411
    if (!options.printEnv && !existsSync(profilePatchPath(options.dshHomeDir, options.profile))) {
  • 写入本地文件
    lib/console-exporter.js:59
    mkdirSync(dirname(logFile), { recursive: true });
  • 写入本地文件
    lib/console-exporter.js:60
    appendFileSync(logFile, `${line} ${message.args.map((arg) => (typeof arg === 'string' ? arg : safeStringify(arg))).join(' ')}\n`);
  • 读取本地文件
    lib/log-file.js:26
    if (!existsSync(path)) {
  • 读取本地文件
    lib/log-file.js:30
    const buffer = readFileSync(path);
  • 写入本地文件
    lib/memory-transport.js:65
    mkdirSync(this.inboxDir, { recursive: true });
  • 写入本地文件
    lib/memory-transport.js:66
    mkdirSync(this.actionsDir, { recursive: true });
  • 写入本地文件
    lib/memory-transport.js:67
    mkdirSync(this.outboxDir, { recursive: true });
  • 读取本地文件
    lib/memory-transport.js:167
    files = readdirSync(this.outboxDir).filter((file) => file.endsWith('.json'));
  • 读取本地文件
    lib/memory-transport.js:175
    return JSON.parse(readFileSync(join(this.outboxDir, file), 'utf8'));
  • 读取本地文件
    lib/memory-transport.js:188
    files = readdirSync(this.inboxDir).filter((file) => file.endsWith('.json'));
  • 读取本地文件
    lib/memory-transport.js:196
    const message = JSON.parse(readFileSync(path, 'utf8'));
  • 删除本地文件
    lib/memory-transport.js:203
    rmSync(path, { force: true });
  • 读取本地文件
    lib/memory-transport.js:211
    files = readdirSync(this.actionsDir).filter((file) => file.endsWith('.json'));
  • 读取本地文件
    lib/memory-transport.js:219
    const action = JSON.parse(readFileSync(path, 'utf8'));
  • 删除本地文件
    lib/memory-transport.js:226
    rmSync(path, { force: true });
  • 写入本地文件
    lib/memory-transport.js:233
    writeFileSync(join(this.outboxDir, `${String(this.seq).padStart(6, '0')}.json`), JSON.stringify(full), 'utf8');
  • 读取本地文件
    lib/outbound.js:114
    const info = await stat(filePath);
  • 读取本地文件
    lib/outbound.js:117
    bytes = new Uint8Array(await readFile(filePath));
  • 读取本地文件
    lib/session-map.js:42
    const raw = readFileSync(this.file, 'utf8');
  • 写入本地文件
    lib/session-map.js:158
    mkdirSync(dirname(this.file), { recursive: true });
  • 写入本地文件
    lib/session-map.js:160
    writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf8');
  • 写入本地文件
    lib/session-map.js:161
    renameSync(tmp, this.file);
  • 发起网络请求
    lib/transport.js:38
    export const FEISHU_HTTP = axios.create({ proxy: false });
  • 发起网络请求
    lib/transport.js:334
    const response = await this.client.request({
  • 发起网络请求
    lib/transport.js:512
    const response = await this.client.request({
  • 发起网络请求
    lib/transport.js:553
    const response = await this.client.request({
  • 读取本地文件
    lib/setup/create-app.js:93
    if (avatarFilePath !== undefined && avatarFilePath !== '' && existsSync(avatarFilePath)) {
  • 读取本地文件
    lib/setup/create-app.js:94
    buffer = readFileSync(avatarFilePath);
  • 读取本地文件
    lib/setup/create-app.js:97
    else if (existsSync(DEFAULT_AVATAR_PATH)) {
  • 读取本地文件
    lib/setup/create-app.js:98
    buffer = readFileSync(DEFAULT_AVATAR_PATH);
  • 读取本地文件
    lib/setup/profile-writer.js:25
    if (!existsSync(filePath))
  • 读取本地文件
    lib/setup/profile-writer.js:27
    const parsed = load(readFileSync(filePath, 'utf8'));
  • 读取本地文件
    lib/setup/profile-writer.js:112
    if (existsSync(path)) {
  • 写入本地文件
    lib/setup/profile-writer.js:113
    renameSync(path, backupPath);
  • 写入本地文件
    lib/setup/profile-writer.js:115
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/setup/profile-writer.js:116
    writeFileSync(path, dump(updated, { lineWidth: 100 }), 'utf8');
  • 读取本地文件
    lib/setup/session.js:21
    if (!existsSync(filePath))
  • 读取本地文件
    lib/setup/session.js:25
    parsed = JSON.parse(readFileSync(filePath, 'utf8'));
  • 写入本地文件
    lib/setup/session.js:40
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/setup/session.js:42
    chmodSync(dir, 0o700);
  • 写入本地文件
    lib/setup/session.js:49
    writeFileSync(tmpPath, JSON.stringify({ cookies: pruneExpiredCookies(cookies) }, null, 2), {
  • 写入本地文件
    lib/setup/session.js:53
    renameSync(tmpPath, filePath);
  • 删除本地文件
    lib/setup/session.js:57
    unlinkSync(tmpPath);
  • 写入本地文件
    lib/setup/session.js:64
    chmodSync(filePath, 0o600);
  • 读取本地文件
    lib/cards/StreamingCardController.js:987
    const bytes = new Uint8Array(await readFile(filePath));
  • 读取本地文件
    lib/directory.js:11
    if (!existsSync(resolvedPath)) {
  • 读取本地文件
    lib/directory.js:16
    isDir = statSync(resolvedPath).isDirectory();
  • 读取本地文件
    lib/projects.js:59
    stats = await stat(gitPath);
  • 读取本地文件
    lib/projects.js:68
    await stat(join(gitPath, 'HEAD'));
  • 读取本地文件
    lib/projects.js:199
    entries = await readdir(dir);
  • 读取本地文件
    lib/projects.js:224
    if ((await stat(fullPath)).isDirectory()) {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

⚠ 该插件运行需访问外部网络 / 远程 API,部署在国内无外网环境时可能无法正常使用。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh@deepseek-ai/dsh-agent@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-file-upload@deepseek-ai/dsh-commands@deepseek-ai/dsh-credentials@deepseek-ai/dsh-invariants@deepseek-ai/dsh-llm@deepseek-ai/dsh-schedule@deepseek-ai/dsh-scope
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

6 张 · 点击查看大图

功能亮点

  • 面板驱动控制台
  • 命令转为卡片按钮
  • 卡内审批与提问

DeepSeek Harness 的飞书 UI:面板驱动的控制台——每条斜杠命令都是 ⚙️ 控制面板卡片上的按钮,审批和提问都在卡片内完成,卡片实时流式更新,扫码即可完成配置。

v0.3.72026-10-25
· What's Changed · fix: adapt to dsh 0.2.1-rc.2 (@latest) — release v0.3.7 Full Changelog:
原文(未汉化)
v0.3.62026-10-09
· 变更内容 · test(integration):在固定请求集上断言 #62 默认模型 · chore(release):记录 npm latest 0.3.5 · chore:跟踪 dsh @latest 0.2.0-rc.2 — 发布 v0.3.6 完整变更日志:
v0.3.52026-09-28
· 变更内容 · chore(release):记录 npm 最新版本 0.3.4 · fix:适配 dsh 0.1.7-rc.2(@latest)— 发布 v0.3.5 完整变更日志:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
The Feishu UI for DeepSeek Harness (dsh) 给 DeepSeek Harness(dsh)做的飞书 UI——一个 dsh 原生插件,带面板驱动的控制台:每个 slash 命令都是 ⚙️ 控制面板卡片上的一个按钮,审批和提问都在聊天卡片内完成,扫一次二维码就把整个应用配好。 注意: DeepSeek Harness 仍是预发布版本,版本之间可能有破坏性变更。dsh-feishu 以 dsh @latest (当前为 0.2.1-rc.2)为准构建与验证,从 npm 与从 git 安装都适用。 https://github.com/user-attachments/assets/e9163793-52f2-4e2c-a08a-22b27372be61 2 分半的演示(控制面板、流式卡片、审批与提问)。
展开完整文档(README 剩余 1 节)
The Feishu UI for DeepSeek Harness (dsh)

给 DeepSeek Harness(dsh)做的飞书 UI——一个 dsh 原生插件,带面板驱动的控制台:每个 slash 命令都是 ⚙️ 控制面板卡片上的一个按钮,审批和提问都在聊天卡片内完成,扫一次二维码就把整个应用配好。

注意: DeepSeek Harness 仍是预发布版本,版本之间可能有破坏性变更。dsh-feishu 以 dsh @latest (当前为 0.2.1-rc.2)为准构建与验证,从 npm 与从 git 安装都适用。

https://github.com/user-attachments/assets/e9163793-52f2-4e2c-a08a-22b27372be61

2 分半的演示(控制面板、流式卡片、审批与提问)。

快速上手

从 npm 安装

1. 安装 Node.js ≥ 22.13 macOS / Linux:nvm(https://github.com/nvm-sh/nvm)→ nvm install 22 Windows:https://nodejs.org(或 winget install OpenJS.NodeJS.LTS)
node --version

2. 安装 pnpm
npm install -g pnpm

3. 安装插件(pnpm ≥ 11 默认拦截 protobufjs 的构建脚本,所以加上 --allow-build=protobufjs 让它执行)
npx @deepseek-ai/dsh plugin --profile feishu add @dsh-feishu/dsh-feishu@latest --allow-build=protobufjs

4. 扫一次二维码:创建并配置飞书应用
npx --yes --package @dsh-feishu/dsh-feishu dsh-feishu-setup --new --profile feishu

5. 启动
npx @deepseek-ai/dsh --profile feishu

从源码安装

1. 安装 Node.js ≥ 22.13 macOS / Linux:nvm(https://github.com/nvm-sh/nvm)→ nvm install 22 Windows:https://nodejs.org(或 winget install OpenJS.NodeJS.LTS)
node --version

2. 安装 pnpm
npm install -g pnpm

3. 克隆并构建
git clone https://github.com/PGZXB/dsh-feishu.git
cd dsh-feishu
pnpm install
pnpm run build

4. 装进 profile
npx @deepseek-ai/dsh plugin --profile feishu add link:.

5. 扫一次二维码:创建并配置飞书应用
pnpm run setup:feishu -- --new --profile feishu

6. 启动
npx @deepseek-ai/dsh --profile feishu

然后到飞书里给机器人发消息即可。配置向导会把飞书应用整套搞定,全程不用开网页控制台,也不用手填凭据。如果你已经有应用,改成设置 FEISHU_APP_ID / FEISHU_APP_SECRET(环境变量或 profile 配置),详见 docs/feishu-setup.md。

卸载

从 profile 移除插件
npx @deepseek-ai/dsh plugin --profile feishu remove @dsh-feishu/dsh-feishu

可选——彻底清理:删除 profile 及其 surface 数据 #(路径按默认 dsh home,~/.dsh)
rm -rf ~/.dsh/profiles/feishu ~/.dsh/feishu

怎么用

一个飞书聊天对应一个 dsh 会话,机器人就是 agent 的化身。一次典型的使用是这样:

1. 开个聊天。 直接私聊机器人;也可以发 /group <名字> 建个群。群里一般要 @ 机器人(默认策略);如果群里只有你和机器人,不 @ 直接说也行;@ 策略本身可配置。

2. 打开控制面板。 发 /panel 会唤出一张面板卡片。

3. 先定工作目录。 没定目录之前机器人不会开工:点 📚 Pick project 从列表里挑(等价于 /repo),或点 📁 Change dir 直接输入路径(等价于 /cd <路径>)。

4. 直接问。 发消息,agent 跑起来,工具调用、思考过程、markdown、表格一行行流进一张卡片。跑完卡片变绿,答案完整留在里面;停止、复制、重试和 ⚙️ 面板按钮就贴在卡片上。

| 进行中 | 已完成 |
| 卡片进行中 | 卡片已完成 |

5. 要审批就批,要回答就答。 agent 需要提权时会弹一张审批卡,点 Allow once 放行(或 Reject 拒绝);它有问题会弹提问卡,点选项或直接回一句。

| 审批 | 提问 |
| 审批卡 | 提问卡 |

6. 管会话。 点 🗂️ Sessions 列出所有已保存的会话、直接在卡片上恢复(等价于 /sessions;/resume <id> 也能把某个会话搬进当前聊天),点 ➕ New chat 开新对话、旧的照留(等价于 /clear)。

面板卡片上的每个按钮都对应一个 slash 命令——哪种顺手用哪种;/help 会把所有命令列一遍。

命令

| 命令 | 作用 |
| /help | 列出所有命令 |
| /panel | 打开控制面板卡(所有命令的按钮版) |
| /group <name> | 和机器人建群(无参会弹名称输入卡) |
| /cancel | 停下正在跑的回合 |
| /cd <path> | 设置本聊天的工作目录(无参会弹路径输入卡) |
| /repo [path] | 挑一个项目目录(无参扫描默认 roots;/repo <path> 扫描该路径) |
| /status | 查看本聊天的会话状态 |
| /feishu-status | 显示运行状态诊断卡 |
| /schedule | 列出活跃的提醒 |
| /model <provider/model> | 切换本会话的模型(无参打开选择器) |
| /export | 把会话日志作为文件发出来 |
| /log | 把 dsh-feishu 的日志文件发到本聊天(便于排查问题;提 issue 时建议附上关键日志) |
| /sessions | 列出已保存会话(卡片上可恢复) |
| /resume <id> | 在本聊天恢复一个已保存会话(无参打开会话列表) |
| /clear /new | 开新对话(旧会话仍保留) |
| /goal <text> | 设置任务目标(无参会弹文本输入卡) |
| /compact | 压缩较旧的对话历史 |
| /feedback <text> | 发送反馈(无参会弹文本输入卡) |
| /permission <preset> | 切换权限预设(无参打开选择器) |
| /plan [on\|off] | 进入或退出计划模式(无参切换) |

能做什么

- 实时流式卡片——工具调用、思考、markdown、表格,边跑边流出来。
- 一键控制面板——/panel 把命令面板全部做成按钮;不用记命令语法,且每个按钮与敲命令完全等价。
- 卡内审批 / 提问——提权审批、回答问题都在聊天里完成。
- 会话不丢——重启守护进程,会话与工作目录都还在;/sessions 可列出、恢复、重命名、归档、导出。
- 一次扫码完成接入——扫一次飞书二维码就建好并配好应用(机器人资料、权限、事件订阅、凭据),并写好 dsh profile。
- 文件双向流动——你发的图片、文件、视频、富文本都会落到工作区成为普通文件,agent 按路径读取;agent 也能把工作区里的文件/图片发回聊天。
- 消息排队与插话——回合运行中发的消息会排队可见;可编辑、删除,或插进正在跑的回合。
- 回合产物——回合产出的文件以 chips 出现在卡片底部,点一下就在聊天里收到。
- 卡片统计与诊断——卡片上显示回合数、工具调用数、token 与当前上下文占用;/feishu-status 显示连接与会话诊断,回合运行中也能用。
- 群聊 + @ 提醒——群里 @ 机器人即可;出错、审批、提问都会 @ 回发起人。
- 回执、白名单、提醒、导出——表情回执、allowedChats / allowedUsers 白名单、定时提醒、会话日志文件。

参与贡献

见 CONTRIBUTING.md 与 SECURITY.md。开发、测试与发布:docs/development.md。

交流群

扫码加入 dsh-feishu 飞书交流群:

致谢

- botmux —— 群聊交互模式的参考:流式卡片、审批,以及扫码驱动的开放平台快速接入流程。dsh-feishu 借鉴的是 botmux 的交互与接入模式,而非其架构——botmux 桥接外部 CLI,本插件则是 dsh 原生、进程内的。
- DeepSeek Harness —— 本插件所服务的平台。
- Lark Open Platform SDK —— 底层所用的 WebSocket 长连接与卡片 API。

License

MIT——见 LICENSE。
预览分享卡片长什么样 ↓PGZXB/dsh-feishu
分享 · DeepSeek Harness Hub
PGZXB/dsh-feishu

给 DeepSeek Harnessdsh做的飞书 UI——一个 dsh 原生插件,带面板驱动的控制台:每个…

回到顶部