Integrating the “Team · Board” into DSH: dsh-team

前言

在 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 派发链路对齐,而不是再搭一套平行流程。

一个包内包含四块能力:

  1. 12 个 board_* 工具 —— 查板、建单、认领、续租、交付、打回、播报、派工、上报能力等。
  2. 4 个 sh_* 工具 —— sh_run / sh_read / sh_write / sh_list,为副机 worker 会话补上默认没有的 pwsh / 读写 / 列目录能力(由 dsh-shell 合并而来)。
  3. GUI 面板 —— 侧栏「作业板」:任务表(筛选、搜索、展开详情、认领、交付、打回)、机器能力卡、一行派工、可拖动桌宠状态卡。
  4. 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

典型用法

  1. Agent 查板并认领:调用 board_status 看总览,再用 board_list 按 status 过滤;对本机 machine 执行 board_claim,处理过程中用 board_beat 续租并写备注。
  2. 建单交给 Host 自动派发:board_dispatch 指定 goal 与目标机(goal ≤ 300 字);v1.1 建单带 dispatch:'auto',由 Host 后台 take → dispatch → attach 完成,无需浏览器常开派工。
  3. 副机缺 shell 能力时:在 allowedRoots 配置好后,用 sh_read / sh_write / sh_list / sh_run 完成文件与命令操作。
  4. 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,减轻浏览器重复派工与关页停调度的问题。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye