dsh-foreman:單賬本主 loop,把工單派到多臺 DSH 設備

前言

在 DeepSeek Harness(DSH)裏跑智能體,常見做法是本機一個實例:工單、策略、評估和會話都在同一進程裏。當你有多臺機器——公司筆記本、宿舍電腦、一臺常駐服務器——希望「在一個地方說話、在對應機器的工作區裏幹活」,而又不想在每臺設備上各維護一套賬本,就會遇到路由與狀態一致性的問題。

下面介紹社區插件 dsh-foreman(維護者 niechao136)。它在服務器側保留唯一賬本(Engine、SQLite、Policy、Tickets、Evals、設備表),通過 Hub 與 Selector 把工單派到遠端設備上完整運行的 DSH;設備側用配套的 dsh-foreman-node 只接單、本地執行並回報,不建工單、不持策略、不打開數據庫。項目標註爲早期開發中,MIT 許可;不是 DeepSeek 官方產品。

這是什麼

一句話定位(摘自項目 README):一個常駐的主 loop,把工單派給多臺在線設備上各自完整運行的 DSH,賬本只有一份。

架構上,服務器跑 dsh-foreman,每臺個人機器裝 dsh-foreman-node;設備通過 wss 主動連 Hub。本機也可 target.kind === 'local',行爲與不接設備時相同。

當前 package 版本爲 0.5.1(以倉庫 package.json 爲準)。運行時要求 Node ^22.19.0 || >=24.0.0,DSH ^0.2.1-alpha.2。

核心功能

單賬本與雙層角色

服務器側集中持有工單、策略與評估;每個項目一條主會話入口,操作者在此對話,主會話負責路由,Worker 在具體工作區目錄執行。設備側插件不承擔賬本職責。

Selector 與派單時機

accept 工單時,prepareTicket 即選定設備並寫入 Ticket.target,再由 newAssignment 複製到 Assignment.target——不是 Executor 選型(Executor 沒有寫庫通道)。

  • 遠端目標:以 assign 幀發給對應設備;設備不在線則報 blocked,不僞造 failed,也不悄悄改成本機跑。
  • 本地目標:交給本機 DshExecutor。

斷線不會自動重派(避免同活執行兩遍);超時轉爲 blocked,由人處理。

已落地的模塊(項目自述)

README 寫明:設備註冊表、Selector、ForemanExecutor、Hub、回報規則、設備側插件、文本渲染、遷移腳本、面板設備頁、飛書羣路由等已實現,測試 1332 項。設計、實現計劃與交接見倉庫內 docs/superpowers/ 與 HANDOFF.md。

與上游的關係

代碼以 dsh-superagent-local 爲起點,思想來自 DeepSeek Harness 團隊的 Super-agent 原型與研究文檔;本項目在多設備與遷移方向上做重寫與擴展,並對文中未解問題(如 A2A、安全)採用明確取捨,而非聲稱已全部解決。

安裝與啓用

dsh-foreman 在 npm 上以包名 dsh-foreman 發佈,並在 package.json 中聲明 dsh.bundle(profile bundle)。安裝前請確認本機 pnpm 在 PATH 中;社區插件以當前 DSH 進程權限運行,安裝前建議自行審閱源碼與許可證。

裝入 web profile(常見本機 / 面板場景)

生態目錄 dsh.works 給出的安裝方式爲:

dsh plugin --profile web add dsh-foreman

安裝或更新 bundle 後需重啓對應 profile 的 DSH Web。可用下列命令確認 bundle 層已生效(以你實際使用的 profile 名爲準):

dsh --profile web --dump-config

輸出中應能看到 dsh-foreman 相關 bundle 層。

獨立主 loop 實例(服務器部署示例)

若要把主 loop 與原有 DSH 實例隔離(獨立 DSH_HOME、profile、端口),倉庫 runbook docs/deploy-loop-instance.md 建議在主 loop 所在 profile安裝 foreman,不要在同一實例混裝 node 包。示例:

export DSH_HOME=/home/ubuntu/.dsh-loop
dsh --profile loop --dump-config > /dev/null
dsh plugin --profile loop add "github:niechao136/dsh-foreman"

驗收時,--dump-config 裏應只有 dsh-foreman,不應出現 dsh-foreman-node:

dsh --profile loop --dump-config | grep foreman

設備側

被派活的筆記本、宿舍電腦等應安裝 dsh-foreman-node(npm 包名 dsh-foreman-node)。設備側安裝命令見 dsh-foreman-node 目錄條目(示例:dsh plugin --profile web add dsh-foreman-node)。服務器主 loop 實例上只裝 foreman,不裝 node。

與本插件相關的配置項(獨立實例 runbook)

將 examples/profile.cordis.patch.yml 複製到目標 profile 的 cordis.patch.yml 後,runbook 中與 foreman 直接相關的鍵包括:

- id: dsh-foreman
  config:
    stateDir: /home/ubuntu/.dsh-loop/state/superagent
    hubPort: 8790          # 設備連入的環回端口;0 表示不開 Hub,工單僅本機
    hubIdleMs: 600000      # 設備無心跳多久視爲 blocked

hubPort 默認只監聽 127.0.0.1;對外常配合隧道(如 cloudflared)使用穩定域名。遷機與更多部署細節見 docs/migration.md。

典型用法

1. 在主 loop 登記設備

runbook 推薦在 Web 面板「設置 › 設備」中登記 id、顯示名、可接項目及該機器上的路徑,獲取 url、deviceId、token(令牌僅展示一次)。

headless 環境可用倉庫腳本(路徑以 runbook 爲準):

cd /path/to/dsh-foreman
export DSH_HOME=/home/ubuntu/.dsh-loop
node scripts/add-device.mjs add --home "$DSH_HOME" --id laptop --name 公司筆記本 --label intranet --root shop='D:\工作\shop'

2. 在設備上配置 node 並連通 Hub

在設備 DSH 的「設置 › 插件 › dsh-foreman-node」中配置 SSH 隧道或 wss:// 樞紐地址,填入主 loop 下發的 deviceId 與 token,映射項目路徑後保存並重啓設備側 DSH。主 loop 側無需因登記而重啓。

3. 接受工單時的行爲預期

工單 accept 後,若目標設備離線或超時,狀態爲 blocked,不會自動改派或靜默回落本機。確認設備未在執行後,再由人工重試。

4. 飛書羣路由(可選)

整臺服務器可配置一個飛書機器人,用羣區分項目;Policy 中 routing.chats 可同時約束工作區與設備 labels,Selector 只選帶匹配標籤的設備,選不到則 blocked。示例結構見 runbook 中的 JSON 片段。

適用場景與注意

適合誰: 需要在多臺機器上保留各自工作區與執行環境,又希望工單、策略、評估與主會話入口集中在一臺(或一組)主 loop 上的 DSH 用戶;需求主要來自本機操作者主會話,而非僅 GitHub/飛書觸發(雖也支持飛書羣路由等能力)。

注意事項:

  1. 項目處於早期開發,API 與部署方式可能變動;重大部署前閱讀 HANDOFF.md 與設計文檔。
  2. 同一 DSH 實例不宜同時裝 foreman 與 foreman-node 作爲主 loop 驗收標準所描述的那樣混用;多實例應使用不同 DSH_HOME。
  3. 插件與 node 均爲第三方代碼,安裝即在本機執行;請覈對 MIT 許可與倉庫源碼。
  4. SkillHub、dsh.works 等目錄爲社區站點,與 DeepSeek / 幻方無官方從屬關係;星標在目錄快照中可能爲 0,不代表質量結論。

結尾

dsh-foreman 把「一個主 loop、一份賬本、多臺 Worker」落到可部署的 bundle:派單在 accept 時寫入 target,遠端不在線則明確 blocked,斷線不重派。若你要從單機構型擴展到多設備協同,可從 npm 或 GitHub 安裝 foreman,再按 runbook 配 Hub 與設備表。

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

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

小夜