dsh-switchboard
在 Telegram 和飞书中指挥 DeepSeek Harness:每轮一条实时进度消息,按钮审批与提问,收发文件和语音,断线和重启不丢消息,飞书扫码接入,按人设置权限。
安装
dsh plugin --profile web add dsh-switchboard
沙箱测试
这个插件还没测过。提交测试 →
README
掌上指挥台(Switchboard · dsh-switchboard)
[English](README.md) | 中文
<img src="icon.svg" width="72" alt="" align="right">
在手机上通过 Telegram、飞书机器人指挥 DeepSeek Harness 的 Agent:在手机上给 Agent 发文字、图片、文件和语音,看它边写边回复,审批工具调用、回答它的提问,订阅长任务的完成通知;在 Web 端查看所有渠道的聊天记录,并把任意会话关联到聊天。
机器人是 Web Host 的另一个客户端:它通过 ctx.sessionController(与 Web 界面同一条路径)创建会话和发送消息,所以聊天里开的会话会出现在 Web 侧栏中,Web 端的会话也可以接管或订阅。机器人新建的会话会放进工作目录对应的 Web 工作区(没有就自动创建),和其他会话一起显示在侧栏里。
线路
一条线路是某个聊天平台上的一个机器人,加上允许使用它的人。可以配置多条线路:例如你自己用 Telegram,团队用飞书;每条线路有自己的凭据、允许的用户和群、默认工作目录。
- 同一个会话可以同时从多条线路绑定或订阅,回复、审批、提问会发到每个关联的聊天。
- 聊天在内部以「线路:聊天 ID」区分(例如
feishu:oc_xxx);最早那条 Telegram 线路(ID 为telegram)沿用纯数字 ID,旧版本的绑定和聊天记录原样可用。 - 目前支持 Telegram 和 飞书 / Lark。
快速开始
1. 安装到 Web profile:在 Web 侧栏 插件 → 添加插件 中填 dsh-switchboard,或用命令行:
dsh plugin --profile web add dsh-switchboard
2. 打开侧栏 插件 → 已安装插件 → 掌上指挥台(也可以点侧栏 掌上指挥台 右上角的 插件设置),在 线路 里添加线路、填写凭据和 允许的用户,再填 默认工作目录,点 保存,即时生效。
3. 给机器人发 /whoami 可以查看自己的用户 ID,把它填进 允许的用户。
Telegram 线路
1. 在 Telegram 找 @BotFather,发送 /newbot 创建机器人,复制 Token。
2. 设置页点 + Telegram 线路,粘贴 Bot Token,填 允许的用户(Telegram 用户 ID 或 @用户名)。
飞书线路
飞书通过开放平台的长连接接收事件,不需要公网地址或回调 URL。
扫码创建(推荐):设置页点 + 飞书线路 → 扫码创建飞书应用,用飞书 App 扫码(或在这台电脑上点「在浏览器中打开」)并确认。机器人能力、所需权限、消息事件 im.message.receive_v1 和卡片回调 card.action.trigger 都已预先填好;确认后 App Secret 由宿主直接存入凭据库(不经过浏览器),扫码人自动加入 允许的用户,线路自动保存并连接。已有的应用可以点 补全权限,扫码补上缺少的权限、事件或回调。
手动配置:
1. 在 飞书开放平台(国际版用 Lark)创建企业自建应用,在「添加应用能力」中添加 机器人。
2. 在「权限管理」中开通:
im:message.p2p_msg:readonly(读取用户发给机器人的单聊消息)im:message.group_at_msg:readonly(接收群聊中 @ 机器人消息事件)im:message:send_as_bot(以应用的身份发消息)im:resource(获取与上传图片或文件资源)- 可选:
contact:user.base:readonly(显示用户姓名)、im:chat:readonly(显示群名)。
3. 在设置页点 + 飞书线路,填 App ID(cli_ 开头)和 App Secret,平台选飞书或 Lark,保存。线路状态显示机器人名称即连接成功。飞书要求先有客户端连上,才能在后台选择长连接,所以这一步要在下一步之前。
4. 在「事件与回调」中:
- 事件配置的订阅方式选择 使用长连接接收事件,添加事件
im.message.receive_v1(接收消息); - 回调配置同样选择长连接,添加回调
card.action.trigger(卡片回传交互,审批、模型选择等按钮需要它)。
5. 「版本管理与发布」中创建版本并发布,可用范围包含你自己(企业内需管理员审核通过)。权限和事件在发布后生效。
6. 在飞书里搜索机器人名称打开单聊,发 /whoami,把回复里的 open_id(ou_ 开头)填进线路的 允许的用户 并保存。open_id 按应用区分,同一个人在不同应用下的 open_id 不同,要用这个机器人回复的那个。
飞书没有「正在输入」提示和命令菜单,其余功能与 Telegram 一致:回复、草稿、工具活动和带按钮的消息以消息卡片发送并就地更新,普通提示用文本消息。
在聊天里
命令 · 作用
直接发文字 / 图片 / 文件 / 语音 · 交给当前会话;没有会话时自动在默认工作目录新建。引用某条消息回复时,被引用的内容会一起交给 Agent
/menu · 常用操作按钮:新会话、会话列表、模型、模式、停止、压缩上下文、状态、帮助(飞书没有命令菜单,用它最方便)
/new [目录] · 新建会话;不带目录时列出默认目录和最近用过的目录,点一下即可
/cwd <目录> · 设置本聊天新会话的工作目录
/sessions · 最近的会话(显示标题),点按钮即切换
/use <序号\ · 会话ID> · 切换到已有会话(含 Web 端会话)
/fork · 从最近完成的一轮分出新会话,聊天切到新会话,原会话保留
/watch [序号\ · 会话ID] · 订阅某个会话的完成与审批通知;不带参数列出订阅
/unwatch <序号\ · 会话ID\ · all> · 取消订阅
/stop · 中止当前工作
/steer <文字> · 在正在进行的轮次中途插话引导
/queue、/cancel <序号\ · all> · 查看、取消排队中的消息
/model [模型名] · 查看或切换当前会话的模型(按钮列表,支持模糊匹配;不影响 Web 默认)
/mode [模式] · 查看或切换当前会话的权限模式(只读 / 工作区可写 / 完全访问)
/get <路径> · 获取工作目录里的文件,或列出目录(不能越出工作目录,符号链接也不行)
/status · 当前会话、模型、工作目录、线路状态、上下文占用、本轮用时、目标、待办进度、子任务和排队条数
/digest · 订阅会话的汇总:最近 24 小时完成了什么、哪里失败、什么在等你、什么在运行
/board、/board off · 全局看板:一条消息持续显示所有会话的状态,点按钮切换;关闭看板
/away [时长\ · off] · 离开模式:审批和提问一直等你,不交回 Web,回来时发汇总。时长如 30m、2h、1d
/schedule、/schedule add … · 管理定时任务(管理员),见下方
/link <配对码> · 接管 Web 会话,配对码在会话的 掌上指挥台 标签页
/whoami · 显示你的用户 ID 与聊天 ID(任何人可用)
Harness 命令 · /compact、/plan、/goal、/permission、/export 等,与 Web 输入框一样在宿主上直接执行,结果发回聊天,耗时较长时显示进度和取消按钮;/help(以及 Telegram 的命令菜单)会列出当前可用的命令
其他 /xxx · 不是命令的,原样作为文字交给 Agent
回复的呈现
- Agent 的 Markdown 回复按平台渲染:Telegram 转成它支持的 HTML(粗体、斜体、代码块、链接、标题、引用、列表;表格转等宽块,排版被拒时退回纯文本);飞书用消息卡片的 Markdown 组件。长回复按段落和代码块安全分段。
- 一条进度消息:任务进行时只有一条「⏳ 处理中 · 用时 · 工具 N 次」消息,原地更新最近的工具调用和正在写的回复。回复写完后作为新消息发在最下面(会有通知);进度消息在 Telegram 上自动删除,在飞书上收成一行「⏱ 处理过程」小结。进度消息带 ⏹ 停止 按钮;中止或出错时直接在这条消息上说明。
- 任务清单与压缩:Agent 用待办时,进度消息显示「✅ 3/7 · 正在:…」;压缩上下文时显示「🗜 正在压缩上下文…」。
- 子任务与目标:进度消息显示运行中的子 Agent 数量;
/goal的目标完成或受阻时,关联和订阅的聊天会收到通知。 - 收到即回应:你发的消息会立即被标记(Telegram 👀,飞书「处理中」表情),完成后撤掉(出错时 Telegram 显示 👎,飞书显示「错误」)。任务正在进行时再发消息,会回复「已排队」,并附 改为插话、取消 按钮。线路的 更多设置 里可以打开「任务进行中发的消息直接插话」,文字和语音就不再排队;引用消息、图片和文件仍然排队。
- 回复下方的快捷按钮:一轮结束后,最后一条回复下方出现 继续、重试、查看改动(把本轮改动的文件以 diff 文件发来,包括新文件)、换个方向(同
/fork)、新会话;下一轮开始时自动收起。 - 回复即路由:直接回复某条通知、回复或审批消息,内容就进入它所属的会话,不用先
/use,同时跑多个任务时最方便。聊天的当前会话不变,这一轮的回复发回这里。每个聊天记住最近 200 条消息,重启后仍然有效;更早的消息按当前会话处理。 - 回合摘要:长任务结束时发一行摘要,包括用时、工具调用次数、token 用量、改动了哪些文件。默认只在超过 60 秒的任务后发送,可以设置为每轮都发或关闭。
- 长内容:超过 长回复转文件 字数(默认 6000)的回复,只发开头一段并附上完整内容的 Markdown 文件;飞书卡片里超过 15 行的代码块自动折叠。
审批与提问
- 工具审批:需要审批时,聊天里弹出 允许一次 / 拒绝 按钮;修改文件的审批直接附带改动预览(- 删除 / + 新增),写入文件附带开头内容。
- 审批解读:命令类审批发出后,用会话自己的模型补一句话,说明它会做什么、能影响什么、能不能撤销。这句话只作参考:不会替你回答审批,原始命令始终显示。模型慢或失败时不影响审批。每次多一次小的模型调用,可以在设置里关闭。
- 本轮同类都允许:文件修改(
edit、write)的审批多一个按钮,放行本轮内同一工具、同一原因的后续审批。仅管理员可用,到本轮结束失效,每次放行都写入聊天记录;命令执行类工具不提供,因为批准一条命令不代表批准下一条。 - 拒绝时说明原因:点 拒绝 后,2 分钟内你发的下一条消息会作为拒绝原因告诉 Agent。
- 计划审阅:Agent 提交计划时,完整计划先发到聊天(过长时转文件),再给 批准并执行、继续规划 按钮;直接发文字就是修改意见。访客不能批准。
- Agent 提问:Agent 调用「向用户提问」工具时,问题和选项按钮会发到聊天里,多选题勾选后点 完成。问题待回答期间,直接发文字就是自定义回答,不会被当成新消息。
- 两者都只有这条线路允许的用户能操作,超时未答(默认 300 秒)交回 Web 界面。到期前会发一条提醒(最多提前 1 分钟),审批提醒里可以直接允许或拒绝,也可以点 再等 延长。
- 交回 Web 后聊天里不能再回答。审批没有人接手时(比如没有打开 Web 页面),这一步不会执行,聊天里会说明。
全局看板
/board发一条消息并持续更新:等你处理的(❓)排最前,然后是失败(❌)、运行中(▶,含用时、工具次数和待办进度),最后是这个聊天关联的空闲会话。没有关联、也没有动静的会话不显示。- 点会话按钮切换过去(等同
/use),🔄 刷新 立即更新,✖️ 关闭 或/board off关闭;再发/board会替换旧的。重启后继续更新。 - Telegram 上会自动置顶(不打扰任何人;群里机器人没有置顶权限时不置顶)。飞书没有置顶,看板消息照常更新。
- 看板按打开它的人的权限显示:成员只看到自己目录里的会话。
离开模式
- 默认情况下,审批和提问超时后交回 Web;人不在电脑前时没有人接手,这一步就不执行了。
/away 2h(或不带参数选时长)之后,超时不再交回 Web,而是继续等,提醒间隔逐步拉长,最长 1 小时一次。这期间任务会暂停在这一步,所以时长不要超过你愿意让它等的
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:6,最后更新 2026-11-06