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

飞书远控 pxvp2008/dsh-feishu-pilot

DeepSeek 客户端
pxvp20089 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

在手机上远程派活、审批并接收任务完成通知

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/pxvp2008/dsh-feishu-pilot.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 9 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 67 处,展示前 62 条)
  • 写入本地文件
    index.js:157
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    index.js:158
    appendFileSync(join(dir, 'boot-diag.log'), `${new Date().toISOString()} ${m}\n`);
  • 读取本地文件
    lib/state.js:82
    const raw = JSON.parse(await readFile(file, 'utf8'));
  • 写入本地文件
    lib/state.js:113
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/state.js:115
    await writeFile(tmp, JSON.stringify(data, null, 2), 'utf8');
  • 写入本地文件
    lib/state.js:116
    await rename(tmp, file);
  • 读取本地文件
    lib/identity.js:76
    existsSync(join(base, legacyName)) && !existsSync(migrationMarker(to, legacyName))
  • 读取本地文件
    lib/identity.js:97
    if (!existsSync(from)) continue;
  • 读取本地文件
    lib/identity.js:99
    if (existsSync(marker)) continue;
  • 读取本地文件
    lib/identity.js:100
    if (!existsSync(to)) {
  • 读取本地文件
    lib/identity.js:105
    try { result.copied = readdirSync(to); } catch { result.copied = []; }
  • 读取本地文件
    lib/identity.js:108
    for (const entry of readdirSync(from)) {
  • 写入本地文件
    lib/identity.js:121
    try { writeFileSync(marker, `${new Date().toISOString()}\n`, 'utf8'); } catch { }
  • 读取本地文件
    lib/switcher.js:139
    if (!(await stat(cwd)).isDirectory()) continue;
  • 读取本地文件
    lib/switcher.js:219
    if (!(await stat(ws.path)).isDirectory()) {
  • 读取本地文件
    lib/switcher.js:417
    try { isDir = (await stat(path)).isDirectory(); } catch { isDir = false; }
  • 读取本地文件
    lib/commands.js:48
    try { known.add(await realpath(w.path)); } catch { }
  • 读取本地文件
    lib/commands.js:54
    try { homeReal = await realpath(homedir()); } catch { homeReal = ''; }
  • 读取本地文件
    lib/commands.js:65
    try { rp = await realpath(cwd); } catch { continue; }
  • 读取本地文件
    lib/commands.js:70
    try { isDir = (await stat(cwd)).isDirectory(); } catch { isDir = false; }
  • 发起网络请求
    lib/nav.js:156
    const tok = await (await fetch(`${base}/open-apis/auth/v3/tenant_access_token/internal`, {
  • 发起网络请求
    lib/nav.js:166
    const res = await (await fetch(`${base}/open-apis/application/v6/applications/${encodeURIComponent(appId)}?lang=zh_cn`, {
  • 读取密钥环境变量
    lib/nav.js:642
    const envActive = !!(process.env.FEISHU_APP_ID && process.env.FEISHU_APP_SECRET);
  • 读取本地文件
    lib/reconcile.js:37
    const canonical = await realpath(path);
  • 读取本地文件
    lib/reconcile.js:55
    return await realpath(raw);
  • 读取本地文件
    lib/reconcile.js:77
    const target = await realpath(intent.workspacePath);
  • 写入本地文件
    lib/remote-approval.js:41
    void mkdir(dirname(p), { recursive: true })
  • 写入本地文件
    lib/remote-approval.js:42
    .then(() => appendFile(p, JSON.stringify(line) + '\n', 'utf8'))
  • 写入本地文件
    lib/remote-approval.js:50
    void mkdir(dirname(p), { recursive: true })
  • 写入本地文件
    lib/remote-approval.js:51
    .then(() => appendFile(p, `[${new Date().toISOString()}] ` + JSON.stringify(line) + '\n', 'utf8'))
  • 写入本地文件
    lib/remote-question.js:44
    void mkdir(dirname(p), { recursive: true })
  • 写入本地文件
    lib/remote-question.js:45
    .then(() => appendFile(p, JSON.stringify(line) + '\n', 'utf8'))
  • 写入本地文件
    lib/remote-question.js:53
    void mkdir(dirname(p), { recursive: true })
  • 写入本地文件
    lib/remote-question.js:54
    .then(() => appendFile(p, `[${new Date().toISOString()}] ` + JSON.stringify(line) + '\n', 'utf8'))
  • 读取本地文件
    lib/im-overrides.js:27
    const data = JSON.parse(await readFile(overridesPath(stateDir), 'utf8'));
  • 读取本地文件
    lib/im-overrides.js:39
    cur = JSON.parse(await readFile(p, 'utf8'));
  • 写入本地文件
    lib/im-overrides.js:43
    await mkdir(dirname(p), { recursive: true });
  • 写入本地文件
    lib/im-overrides.js:45
    await writeFile(tmp, JSON.stringify(next, null, 2), 'utf8');
  • 写入本地文件
    lib/im-overrides.js:46
    await rename(tmp, p);
  • 读取本地文件
    lib/feishu-workspace.js:41
    try { isDir = (await stat(dir)).isDirectory(); } catch { isDir = false; }
  • 写入本地文件
    lib/feishu-workspace.js:42
    if (!isDir) await mkdir(dir, { recursive: true });
  • 读取本地文件
    lib/rebind.js:104
    const raw = JSON.parse(await readFile(im.map.file, 'utf8'));
  • 读取本地文件
    lib/session-picker.js:84
    try { wsByReal.set(await realpath(w.path), w); } catch { }
  • 读取本地文件
    lib/session-picker.js:113
    try { rp = await realpath(cwd); } catch { skipped += 1; continue; }
  • 读取本地文件
    lib/session-picker.js:135
    try { scopeR = await realpath(scopePath); } catch { }
  • 写入本地文件
    lib/core/runtime.js:73
    void appendFile(join(cfg.storeDir ?? homedir(), 'boot-diag.log'), `${new Date().toISOString()} [core] ${m}\n`).catch(() => {});
  • 写入本地文件
    lib/core/runtime.js:964
    await mkdir(this.cfg.storeDir, { recursive: true });
  • 写入本地文件
    lib/core/runtime.js:965
    await appendFile(join(this.cfg.storeDir, `${kind}.log`), JSON.stringify(line) + '\n', 'utf8');
  • 发起网络请求
    lib/feishu/channel.js:65
    const res = await fetch(`${baseUrl}/open-apis/auth/v3/tenant_access_token/internal`, {
  • 发起网络请求
    lib/feishu/channel.js:85
    const json = await (await fetch(`${baseUrl}/open-apis/bot/v3/info`, {
  • 发起网络请求
    lib/feishu/channel.js:262
    const tokRes = await fetch(`${base}/open-apis/auth/v3/tenant_access_token/internal`, {
  • 发起网络请求
    lib/feishu/channel.js:276
    const listed = await (await fetch(`${base}/open-apis/application/v7/app_slash_commands`, {
  • 发起网络请求
    lib/feishu/channel.js:300
    const deleted = await (await fetch(`${base}/open-apis/application/v7/app_slash_commands/${item.command_id}`, {
  • 发起网络请求
    lib/feishu/channel.js:312
    const created = await (await fetch(`${base}/open-apis/application/v7/app_slash_commands`, {
  • 读取本地文件
    lib/core/session-map.js:44
    const raw = await readFile(this.file, 'utf8');
  • 写入本地文件
    lib/core/session-map.js:242
    await mkdir(this.storeDir, { recursive: true });
  • 写入本地文件
    lib/core/session-map.js:262
    await writeFile(tmp, JSON.stringify(payload, null, 2), 'utf8');
  • 写入本地文件
    lib/core/session-map.js:263
    await rename(tmp, this.file);
  • 读取本地文件
    lib/core/pending-auth.js:40
    const raw = JSON.parse(await readFile(this.filePath(), 'utf8'));
  • 写入本地文件
    lib/core/pending-auth.js:163
    await mkdir(this.dir, { recursive: true });
  • 写入本地文件
    lib/core/pending-auth.js:174
    await writeFile(tmp, JSON.stringify({ version: VERSION, items }, null, 2), 'utf8');
  • 写入本地文件
    lib/core/pending-auth.js:175
    await rename(tmp, this.filePath());
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

把飞书变成 DSH 的远程控制台:桌面 GUI 会话的任务、审批、提问都能在手机上继续;任务结束主动通知;GUI 与飞书双端同时受理。扫码即可接入,离开电脑也不停。

README

由 DeepSeek 最新模型翻译生成
飞书远控 · dsh-feishu-pilot 把飞书变成 DSH 的远程控制台:桌面 GUI 会话的任务、审批、提问都能在手机上继续;任务结束主动通知;GUI 与飞书双端同时受理。扫码即可接入,离开电脑也不停。 界面预览 飞书里远程派活、审批,桌面会话同步执行: 飞书远程派活与进度卡 飞书审批与桌面执行结果 功能亮点 - 任意会话可远程:不只飞书创建的会话——桌面 GUI 里的任意会话,任务通知、审批、提问都能推到飞书。 - 审批/提问双端竞速:GUI 与飞书同时受理,任一端先处理即生效,另一端自动失效并更新卡片。 - 扫码一键接入:飞书扫码自动创建应用并绑定机器人,预填权限、写入凭据、直接连接,无需手工配置应用。 - 切换会话,GUI 自动跟随:在飞书 /ws 选工作区/会话后,桌面侧栏自动打开对应会话。 - 文件与图片直达模型:飞书发来的文件自动作为附件(≤20MB/个,单条最多 2 个);图片可开启(默认关,单条最多 4 张、单张 ≤10MB)。 - 换机器人免重启:换 bot 后热重连,旧绑定/授权自动清理;同一时间只连一个机器人。 - 进度与结果:绑定会话用进度卡展示过程与终态(耗时、token),非绑定会话推送任务完成通知。 - 任务中插话:任务执行中发 /steer <文本>(或 /插话 <文本>)即可把补充要求插入当前任务,不用等它跑完。
展开完整文档(README 剩余 1 节)
飞书远控 · dsh-feishu-pilot

把飞书变成 DSH 的远程控制台:桌面 GUI 会话的任务、审批、提问都能在手机上继续;任务结束主动通知;GUI 与飞书双端同时受理。扫码即可接入,离开电脑也不停。

界面预览

飞书里远程派活、审批,桌面会话同步执行:

飞书远程派活与进度卡

飞书审批与桌面执行结果

功能亮点

- 任意会话可远程:不只飞书创建的会话——桌面 GUI 里的任意会话,任务通知、审批、提问都能推到飞书。
- 审批/提问双端竞速:GUI 与飞书同时受理,任一端先处理即生效,另一端自动失效并更新卡片。
- 扫码一键接入:飞书扫码自动创建应用并绑定机器人,预填权限、写入凭据、直接连接,无需手工配置应用。
- 切换会话,GUI 自动跟随:在飞书 /ws 选工作区/会话后,桌面侧栏自动打开对应会话。
- 文件与图片直达模型:飞书发来的文件自动作为附件(≤20MB/个,单条最多 2 个);图片可开启(默认关,单条最多 4 张、单张 ≤10MB)。
- 换机器人免重启:换 bot 后热重连,旧绑定/授权自动清理;同一时间只连一个机器人。
- 进度与结果:绑定会话用进度卡展示过程与终态(耗时、token),非绑定会话推送任务完成通知。
- 任务中插话:任务执行中发 /steer <文本>(或 /插话 <文本>)即可把补充要求插入当前任务,不用等它跑完。
- 多选提问也能答:飞书收到多选提问后,点「回复编号作答」再回复编号(如 1,3)即可完成多选。
- 支持 DSH 原生命令:/goal、/plan、/compact;另有插件命令 /new、/status、/output、/ws、/steer、/approve、/permission、/model、/help。

环境要求

- 已安装并运行的 DSH(DeepSeek Harness,Web GUI);
- 一个飞书账号,且在该企业内有权限创建/管理自建应用(通常为企业管理员或被授予开发者权限;扫码自动建应用需要该权限);
- 应用需以 企业自建应用 形式创建并开启 机器人 能力;事件订阅使用长连接——长连接仅企业自建应用支持(应用商店/ISV 应用不支持);
- 若使用已有机器人:需要该应用的开发者/管理员权限,以便填写 App ID/Secret 或扫码绑定;
- 网络:DSH 所在机器可直接访问飞书开放平台(长连接,无需公网 IP)。

安装

通过 DSH 插件管理器安装:

1. 打开 DSH → 设置 → 插件管理器;
2. 按包名 dsh-feishu-pilot 搜索并安装,或者直接添加git+https://github.com/pxvp2008/dsh-feishu-pilot.git;
3. 安装完成后重启 DSH。

运行依赖(飞书 SDK、qrcode)会自动安装,不需要单独处理。

在插件管理器中安装

让 AI Agent 安装

把下面这句话直接发给你的 AI Agent:(强烈建议还是通过DSH 插件管理器安装)

从 https://github.com/pxvp2008/dsh-feishu-pilot.git 安装 DSH 插件 dsh-feishu-pilot

快速开始

1. 打开 DSH → 设置 → 飞书远控;
2. 点「扫码连接」,用飞书扫码创建/选择机器人(或手动填 App ID/Secret);
3. 连接成功后,飞书私聊机器人发一条任务 —— 手机端即可远程操作桌面会话;
4. 群聊使用时需 @机器人(默认;可在高级设置关闭)。

飞书应用配置

扫码模式会自动预填以下权限;手动配置应用时请自行开通:

| 权限 | 用途 |
| im:message:send_as_bot | 发消息 / 卡片 |
| im:message.p2p_msg:readonly | 接收私聊消息 |
| im:message.group_at_msg:readonly | 接收群聊 @ 消息 |
| im:message:readonly | 下载图片(图片入模型) |
| im:resource | 上传文件(/output) |
| application:application:self_manage | 查询本应用权限(自动检查缺失权限) |
| application:app_slash_command:read / write | 斜杠命令面板 |

可选:im:message.group_msg(敏感权限)。关闭「群聊仅 @」后,设置页会自动检查并只提示真正缺失的权限。

- 事件订阅:im.message.receive_v1(长连接模式);
- 卡片回调:card.action.trigger;
- 创建版本并发布应用,把机器人加入可用范围(群聊使用需拉入群)。

常用命令

| 命令 | 说明 |
| /ws | 工作区 / 会话选择器(接管或新建) |
| /new | 新建会话(飞书专用工作区) |
| /status | 连接、绑定、审批、授权状态 |
| /output | 上一任务的完整输出 |
| /approve <id> yes\|no | 文本方式处理审批 |
| /steer <文本> | 插话:把内容插入当前正在执行的任务(别名 /插话;空闲时等同普通消息) |
| /goal | 设置长期任务目标 |
| /plan [off\|消息] | 计划模式开关 |
| /compact | 压缩对话 |
| /permission | 权限预设(按钮选择) |
| /model | 模型选择(按钮卡) |
| /help | 帮助 |

设置页

DSH 设置 → 飞书远控,一页管理,修改即时生效:

- 连接:二维码扫码 / 手动凭据 / 断开(二次确认);
- 远程功能:任务通知、审批、提问开关,含子智能体开关;
- 会话:自动建会话、绑定列表(可解绑)、绑定会话名(只读);
- 授权用户:当前用户 + 待批准列表(一键批准/忽略);首次连接后的首个来信用户会自动成为管理员;
- 高级设置:群聊仅 @、接收图片、审批/提问有效期。

日常配置全部可在设置页完成,无需修改文件。

连接与远程功能授权用户与高级设置

隐私与安全

- 凭据只留在你的机器上:扫码或手填的飞书 App Secret 只写入本机插件状态目录(写入时请求 0600 权限:类 Unix 生效;Windows 下由用户目录 ACL 限制),不经过浏览器,也不上传到任何第三方;
- 运行数据本地化:会话绑定、审批/提问记录、日志全部保存在本机的插件数据目录;
- 无遥测:插件不收集、不上报任何使用数据;
- 断开连接会清除本地凭据并停止推送。

故障排查

| 现象 | 处理 |
| 设置页显示未连接 | 检查网络与凭据;重新扫码或手填 App ID/Secret |
| 群聊里机器人不响应 | 默认仅响应 @ 消息;确认已 @机器人且应用开通群消息权限 |
| 收不到审批/提问卡 | 确认设置页对应开关开启;检查该会话的审批策略是否过于宽松 |
| 飞书切换后 GUI 没跟随 | 保持 DSH 页面打开;若页面长时间后台可能超时,飞书会提示手动打开 |
| 设置页空白 / 旧页面报错 | 页面停留在旧版本时刷新一次(插件更新后需刷新) |
| 升级后无绑定 | 状态目录在升级时自动迁移,正常无需重扫码;异常时查看插件日志 |

日志与数据都保存在本机的插件目录中,排障时可查看插件日志。

代码结构

index.js 宿主装配:配置合并、启动编排、RPC 与工具注册(插件入口) cordis.patch.yml 插件装配声明(实例 id / name 与默认配置说明) lib/identity.js 身份与路径单一事实源(包名、状态目录、RPC 前缀、旧目录迁移) lib/boot.js 启动编排:初始化会话运行时与飞书接入 lib/core/ 会话运行时(消息处理、渲染、审批、通知、待批准、会话映射) lib/feishu/ 飞书接入(长连接渠道、凭据、扫码建应用、断线重连) lib/client.js 浏览器半部:设置页 UI 与桌面跟随导航 lib/*.js 桥接、命令、卡片、工作区切换、通知、审批/提问处理、RPC 路由等 locale/ 中英文案 assets/ 图标资源

- 宿主半部:index.js + lib/(运行在 DSH 宿主进程);
- 浏览器半部:lib/client.js(由 package.json 的 exports["./client"] 暴露,并声明 dsh.client 元数据)。

License

MIT License,见 LICENSE。
预览分享卡片长什么样 ↓pxvp2008/dsh-feishu-pilot
分享 · DeepSeek Harness Hub
pxvp2008/dsh-feishu-pilot

在手机上远程派活、审批并接收任务完成通知

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部