前言¶
在 DSH 里做多机协作时,常见做法是 agent 各自跑会话、人工在聊天里对任务状态,或单独维护一套任务板页面。任务认领、续租、交付、远程派发若分散在不同入口,浏览器多开还容易重复派工,关页面后调度也会停。下面介绍 maintainer shaot92-del 的客户端插件 dsh-team(GitHub:shaot92-del/dsh-team):在一个包里把作业板的 agent 工具、侧栏 GUI、Host 侧 /api/board/ui/* 路由,以及从 dsh-shell 合并来的 sh_* 命令能力接到 DSH。数据仍来自独立的 HTTP 任务板服务(仓库不含板子实现),插件负责客户端与 Host 调度。
这是什么¶
dsh-team 是 DSH 的单包插件,分类为客户端。它解决的是:让 DSH 内的 agent 和界面能统一操作「团队 · 作业板」,并与 remote-agent 派发链路对齐,而不是再搭一套平行流程。
一个包内包含四块能力:
- 12 个
board_*工具 —— 查板、建单、认领、续租、交付、打回、播报、派工、上报能力等。 - 4 个
sh_*工具 ——sh_run/sh_read/sh_write/sh_list,为副机 worker 会话补上默认没有的 pwsh / 读写 / 列目录能力(由 dsh-shell 合并而来)。 - GUI 面板 —— 侧栏「作业板」:任务表(筛选、搜索、展开详情、认领、交付、打回)、机器能力卡、一行派工、可拖动桌宠状态卡。
- Host 路由与调度器 ——
/api/board/ui/*(浏览器不直接跨网访问板子);自 v1.1 起派发与终态回写迁入 Host 后台,不依赖浏览器常开。
当前 package 版本为 1.1.10,许可证 MIT。
架构要点(v1.1)¶
派发权在 Host 一侧,浏览器面板主要负责建单(例如 POST /api/board/ui/create 且 dispatch:'auto',任务进入 queued)。Host 后台约每 4 秒执行 dispatchOnce():先 POST /api/take 原子占位,再 POST /api/remote-agent/ui/dispatch,成功则 POST /api/attach,失败则 POST /api/untake 放回队列。约每 6 秒 syncRemote() 把 remote-agent 终态同步回板子并 POST /api/mark。
这样设计是因为:浏览器多开会重复派工、关页即停;而 remote-agent 的 /dispatch 既不幂等也不等待副机受理,需要 Host 串行完成「占位 → 派发 → 回绑」。v1.1.1 起 Host 调度器通过 connection.authenticatedUrl() 换取会话 cookie(约 10 分钟缓存,401 自动重换),再调用 /api/remote-agent/ui/*,避免后台 fetch 直接 401。副机 nodeId 与板子机器别名可通过插件内 MACHINE_BY_HOSTNAME 对齐(忽略大小写与连字符)。
若板子未实现 v1.1 所需的 /api/take、/api/untake,Host 调度会一直拿不到派发权,任务停在 queued(日志可能出现 take failed)。只要 v1.0 式手动行为,可在配置里关闭 autoDispatch。
核心功能¶
Agent 工具(board_*)¶
| 工具 | 作用 |
|---|---|
board_status |
总览:待办/进行/完成/打回计数、机器在线、最近事件 |
board_list |
列任务,可按 status / machine 过滤;v1.1 起默认全量(不再只给 200 条) |
board_claim |
认领到配置的 machine |
board_beat |
续租并写进度备注 |
board_done |
交付(可带 artifact) |
board_fail |
打回(blocked)或失败(failed),须写原因 |
board_say |
往事件流播报 |
board_dispatch |
选机建单(dryRun 预览);v1.1 建单带 dispatch:'auto' 由 Host 派发;goal 须 ≤ 300 字(v1.1.3 超限直接拒绝) |
board_attach |
远程任务号绑到板子任务,状态转 running |
board_caps |
查看某台机器上报的配置清单 |
board_assess |
本机能力评估(写 ~/.dsh-board/identity.json 并上报) |
board_metrics |
各机器实时指标(内存/CPU/磁盘/运行时长) |
板子不可达时,board_caps 应返回 ok:false(插件自检中有断言)。
Agent 工具(sh_*)¶
| 工具 | 作用 |
|---|---|
sh_run |
执行命令(Windows 优先 pwsh,失败回退 powershell);输出按 maxOutputBytes 流式限流 |
sh_read |
读文本文件 |
sh_write |
写文本文件(UTF-8 无 BOM,自动建父目录) |
sh_list |
列目录 |
allowedRoots 为空时不限制路径;非空时仅允许 realpath 落在白名单内的读写与列目录。这是路径白名单,不是命令沙箱。
侧栏面板¶
路径:侧栏「作业板」。数据经 Host /api/board/ui/*。约 8 秒自动刷新;A+ 调节字号(16/18/20px,存 localStorage)。行可展开查看状态、机器、进度、产物并直接交付或打回。机器卡展示在线、能力徽章与指标。桌宠可拖、双击换尺寸、右键折叠;立绘默认 /api/board/ui/pet.png,可用 petImage 覆盖。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前建议阅读仓库源码与 MIT 许可证。DSH 生态是「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。
在 Windows 上,README 给出的安装方式如下(先定位 CLI):
$dsh = "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd"
# 本地开发目录(示例路径按你本机修改)
& $dsh plugin --profile desktop add 'file:D:\gp_video\dsh-team'
# 从 GitHub 安装
& $dsh plugin --profile desktop add 'github:shaot92-del/dsh-team'
装完后确认 profile 的 package.json 里 dsh.profile.bundles 含有 dsh-team,然后重启 DSH(Host 半边改动需重启;仅改 lib/client.js 时可刷新页面)。
依赖板子服务:默认 http://127.0.0.1:8965,可用 boardUrl 指向自实现;板子若启用 GP_BOARD_TOKEN,须在插件 token 填同一值。
配置¶
在 profile 的 cordis.patch.yml 中按 id 覆盖:
- id: team
config:
boardUrl: 'http://127.0.0.1:8965'
machine: 'host' # 副机可改为 gt14 / mb14 / pc2 等
token: ''
petImage: ''
allowedRoots: []
shellTimeoutMs: 120000
maxOutputBytes: 200000
autoDispatch: true
dispatchApproval: auto # v1.1.2:remote-agent 派发审批;自动调度须 auto,人工批改为 manual
典型用法¶
- Agent 查板并认领:调用
board_status看总览,再用board_list按status过滤;对本机machine执行board_claim,处理过程中用board_beat续租并写备注。 - 建单交给 Host 自动派发:
board_dispatch指定 goal 与目标机(goal ≤ 300 字);v1.1 建单带dispatch:'auto',由 Host 后台take → dispatch → attach完成,无需浏览器常开派工。 - 副机缺 shell 能力时:在 allowedRoots 配置好后,用
sh_read/sh_write/sh_list/sh_run完成文件与命令操作。 - GUI 操作:侧栏打开作业板,展开任务行填写产物与备注后交付或打回;或用面板一行派工创建 queued 任务,由 Host 调度。
维护者在改代码、装入 DSH 前可本地跑自检(不连真板子):
node scripts/plugcheck.mjs
真板子验收(真派发、多机、桌宠等)使用 scripts/acceptance.mjs,需板子服务与本机媒体素材。
适用场景与注意¶
- 适合:已在用或计划用 HTTP 任务板 + DSH multi-machine / remote-agent,希望 agent、GUI、Host 调度同一套板子协议的团队或个人。
- 注意:插件是客户端,不自带板子;v1.1 自动派发要求板子支持
/api/take、/api/untake。sh_*受进程权限与allowedRoots约束,不能替代系统级隔离。GitHub 仓库当前星标为 0(以目录页信息为准),功能以 README 与版本 1.1.10 为准。
结尾¶
dsh-team 把作业板上的 12 个 board_*、4 个 sh_*、侧栏面板和 Host 侧 UI 路由打成一个 DSH 客户端插件,并在 v1.1 把派发与终态回写放到 Host,减轻浏览器重复派工与关页停调度的问题。