dsh-quick-tasks:在 DSH 裏託管本地後臺服務

前言

做智能體或本地工具聯調時,常常需要同時開着 Next、API 網關、中間服務等進程。手工開終端、cd、記端口,再在 DSH 裏切窗口,既分散注意力,也容易漏關進程。DSH 左側已有「自動化任務」等入口,但「需要隨開發節奏一鍵啓停、看日誌、看端口與 PID」這一類本地服務,仍缺少專門面板。

下面介紹社區插件 dsh-quick-tasks(維護者 Theembers,分類:工作流):在 DSH 左側欄提供「後臺任務」面板,管理需要後臺運行的本地服務,支持啓動、停止、重啓與狀態查看;退出 DSH 時,默認模式下被託管的服務會一併停止。

這是什麼

dsh-quick-tasks 是 DeepSeek Harness 的 Cordis 插件(inject: ["webServer"])加瀏覽器側欄/主面板組合。宿主側暴露 REST API,客戶端在 sidebar.panellist(order 20,位於「自動化任務」之後)註冊入口,主面板 slot key 爲 dsh-quick-tasks。

任務定義寫在機器本地 ~/.dsh/dsh-quick-tasks/tasks.json(也可用 profile / 插件 cordis.patch.yml 的 config.tasks);插件包內 cordis.patch.yml 默認 tasks: [],不攜帶機器專屬配置。當前 package 版本 0.1.0,許可證 MIT,依賴 DSH >=0.2.0-rc.1 <0.3.0-0,Node ^22.19.0 || >=24.0.0。

核心功能

側欄與狀態

側欄圖標右下角有 6px 狀態點:綠=運行中、藍=啓動中、紅=異常/端口衝突、灰=未運行。

主面板

任務卡片展示狀態徽標、端口、PID、運行時長、AI Key 配置狀態(可由健康檢查 JSON 展示);操作包括啓動、停止、重啓、打開頁面、查看日誌、複製日誌路徑、刪除。

刪除採用兩步確認:第一次點擊變爲「確認刪除?」,8 秒內再點一次才執行;會停進程、從任務清單刪除項並清理 state.json 中的 PID,改清單前備份到 ~/.dsh/dsh-quick-tasks/backups/。若任務來自 config.tasks,則回退編輯對應 cordis.patch.yml(同樣帶時間戳備份)。

進程託管(attached 模式)

通過 spawn 獨立進程組啓動;停止時 SIGTERM 等待,SIGKILL 兜底。宿主 process.on("exit") 會在退出 DSH 時同步清理進程樹,因此 退出 DSH 會同時停止 attached 服務。崩潰或被 SIGKILL 時 PID 寫入 ~/.dsh/dsh-quick-tasks/state.json,下次啓動通過 #adopt 校驗 PID、命令行與端口後接管,避免重複起服務。

日誌

默認路徑 ~/.dsh/dsh-quick-tasks/logs/<任務id>.log,單文件 64MB 輪轉;面板內嵌日誌視圖約 3 秒刷新。

HTTP API

方法 路徑 說明
GET /api/dsh-quick-tasks/state 狀態快照
GET /api/dsh-quick-tasks/logs?taskId=<id>&tail=200 日誌尾部
POST /api/dsh-quick-tasks/start\|stop\|restart\|delete JSON { "taskId": "..." }

寫操作需自定義頭 x-dsh-quick-tasks: 1,且請求須來自迴環地址並滿足 Host/Origin 等校驗;JSON body 上限 64KB。

通過對話添加服務

面板頭部「通過對話添加服務」會調用 ctx.uiWorkspace.startSession,預填需求佔位與《維護說明》,用戶補全需求後發送,由新會話中的 agent 按說明寫入 tasks.json 並完成驗證。依賴客戶端注入 @deepseek-ai/dsh-client-ui-workspace。

安裝與啓用

須 完全退出 DeepSeek Harness 後安裝。README 給出的桌面 profile 安裝方式爲:

DSH="/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"
"$DSH" plugin --profile desktop add github:Theembers/dsh-quick-tasks

安裝後在插件列表中啓用對應 bundle。桌面 profile 需使用應用自帶 CLI;普通 npm 版 dsh 會拒絕 --profile desktop。

改 lib/client.js 後刷新頁面即可(dsh-client-hmr);改宿主側 lib/index.js 等通常需重啓 DSH,或通過調整 profile 的 cordis.patch.yml 觸發熱重載(不殺掉已託管進程,重啓後按 state.json 接管)。

配置任務

在本地創建或編輯:

~/.dsh/dsh-quick-tasks/tasks.json

內容爲 JSON 數組,示例如下(字段以 README 爲準):

[
  {
    "id": "my-service",
    "label": "我的服務",
    "description": "一句話說明",
    "mode": "attached",
    "cwd": "/absolute/path/to/service",
    "node": "/opt/homebrew/bin/node",
    "argv": ["node_modules/.bin/next", "dev", "--port", "3200"],
    "port": 3200,
    "url": "http://127.0.0.1:3200",
    "healthPath": "/health",
    "readyTimeoutMs": 120000,
    "stopTimeoutMs": 5000
  }
]

mode 可爲 attached(隨 DSH 退出)或 detached(退出時保留)。argv 必填;port 必填;healthPath 爲 GET 健康檢查,2xx 視爲就緒。插件每 4 秒重讀清單,保存即可生效,無需重啓 DSH。清單路徑可用環境變量 DSH_QUICK_TASKS_TASKS_FILE 覆蓋(測試用)。本地清單與 config.tasks 同 id 時,以本地清單爲準。

典型用法:裝好後用接口驗證

將 <DSH 端口> 與 <任務id> 換成實際值:

BASE=http://127.0.0.1:<DSH 端口>

curl -s $BASE/api/dsh-quick-tasks/state

curl -s -X POST $BASE/api/dsh-quick-tasks/start \
  -H 'content-type: application/json' \
  -H 'x-dsh-quick-tasks: 1' \
  -d '{"taskId":"<任務id>"}'

curl -s "$BASE/api/dsh-quick-tasks/logs?taskId=<任務id>&tail=200"

curl -s -X POST $BASE/api/dsh-quick-tasks/stop \
  -H 'content-type: application/json' \
  -H 'x-dsh-quick-tasks: 1' \
  -d '{"taskId":"<任務id>"}'

不帶合法頭或非迴環訪問時,寫操作返回 403。面板內亦可完成同等操作並查看實時日誌。

適用場景與注意

適合在 DSH 內長期聯調本地 Web/API 服務、需要集中看端口 PID 與日誌、希望關 DSH 時默認一併收掉開發服務的開發者。

插件以當前 DSH 進程權限運行子進程,安裝前宜自行查閱 GitHub 倉庫 源碼與 MIT 許可證。README 標明:多任務列表 UI 已實現但多任務場景未做完整實測;刪除若兩處配置都找不到任務會報 patch-edit-failed;宿主被 SIGKILL 且未重啓時服務可能短期成爲孤兒進程,下次啓動 DSH 會嘗試接管。側欄 pin 狀態在插件重載後會重置。

社區目錄 SkillHub 插件頁 與 GitHub 爲獨立信息源,與 DeepSeek / 幻方無官方應用商店從屬關係。

結尾

dsh-quick-tasks 把「本地後臺服務」收進 DSH 左側「後臺任務」:清單本地化、面板一鍵運維、退出宿主時默認可同步停服,並可通過對話模板讓 agent 協助接入新服務。進一步瞭解可訪問 SkillHub 目錄 與 GitHub:Theembers/dsh-quick-tasks。

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

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

小夜