前言¶
做智能体或本地工具联调时,常常需要同时开着 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。