dsh 一次性任务组合包:在 dsh-base 上挂载 headless-runner,命令行收一个任务,跑完把最后回复写到 stdout 并退出,无 Web/HTTP 层
ⓘ 此插件是大仓库 ayuanwong/deepseek-harness-ux 的子包,星数与活跃度统计的是整个仓库。
- 语言
- TypeScript
- License
- BSD-3-Clause
- 分支
- main
安装
$ dsh plugin --profile web add @deepseek-ai/dsh-headless在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 ayuanwong/deepseek-harness-ux/packages/bundle/headless:先查看仓库 https://github.com/ayuanwong/dsh-ux 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
本文档对应
packages/bundle/headless子路径,是落地页/plugins/{owner}/{repo}中插件百科模块的内容来源。该目录属于 DSH 主仓自带的 profile 组合包层,并非独立插件;安装命令把它作为headlessprofile 的整包补足加进dsh。
一句话定位
@deepseek-ai/dsh-headless 是 DSH 的"一次性任务"profile 组合包:基于 dsh-base 之上挂载 headless-runner 插件,从命令行读一个任务文本、创建一个全新的持久化 Agent、等模型跑完、把最后一条非空 assistant 回复写到 stdout,然后请求启动器退出进程;不挂载任何 Host、HTTP server、Web runtime 或浏览器插件。
核心能力
- 从命令行接收单个任务文本(多个词自动用空格拼成一个任务),通过 commander 提供
--help与空任务/纯空白任务校验 - 创建一个全新的持久化 Agent(带随机 sessionId),将任务作为普通用户消息提交,等 Agent 完全停稳
- 在所有事件落地后聚合本轮区间内的 assistant 文本,把最后一条非空回复写到 stdout
- 退出码映射
turn/end原因:completed→ 0,其他(含aborted)→ 1;error还会把code: message写到 stderr - 退出前调用
ctx.sessions.flush落盘会话日志,再请求ctx.appExit终止进程 - 在
dsh-base之上挂载 worker-thread 版 code-runtime(Code Mode 作为核心执行能力)、禁用 HMR;不挂载 Host / HTTP / Web / 浏览器
技术实现
- 语言: TypeScript(ESM)
- 关键依赖:
@deepseek-ai/dsh-cmdline(命令行参数解析 + 退出钩子)、@deepseek-ai/dsh-code-runtime-worker-thread(Code Mode 执行能力)、commander(CLI 子命令定义与解析)、@deepseek-ai/schemastery(Config schema 校验) - 架构模式: profile 组合包 + 服务/消费者配对。
cordis.patch.yml通过 manifest 字段dsh.bundle.patch暴露给 profile 组合器,组合器读取后向 base 之上注入两条新行:headless-startup(provider,把命令行解析成headlessStartup服务)和headless-runner(consumer,injectheadlessStartup,从其task字段读取任务文本) - 入口文件:
src/startup.ts(CLI provider,导出name = 'headless-startup')+src/index.ts(runner,导出name = 'headless-runner'、apply(ctx, config))+src/invariant.ts(空实现的 invariant 配套,仅注册包名)+cordis.patch.yml(profile 组合器读取的 patch 载荷)
适用场景
适合把 DSH 当成命令行工具嵌进自动化:CI 流水线、cron 任务、批处理脚本等需要"调一次模型、拿一次回复、判断成败"的场景。和 dsh-web-app 不一样,本组合包不打开任何 HTTP/Web 端口、不依赖浏览器,跑完即退出;不需要多轮交互、不需要 Web UI 时用它最省心。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 0.0.1-rc.2+ | 自身版本号;需宿主已装好 dsh-base 与同名工作区包(@deepseek-ai/dsh-agent、dsh-llm、dsh-session 等 peerDeps) |
| Node | >=22.19.0 | 来自 monorepo 根 engines.node:^22.19.0 || >=24.0.0 |
| 平台 | macOS / Windows / Linux | 同一份 patch 在各平台都加载;shell 栈由 dsh-base 内按 process.platform 自动二选一(bash / pwsh) |
| 原生模块 | 无 | 本包无原生模块依赖;Code Mode 由 @deepseek-ai/dsh-code-runtime-worker-thread 提供,走 worker_thread,不引入原生绑定 |
安装方式
dsh plugin --profile web add github:ayuanwong/deepseek-harness-ux/packages/bundle/headless
注:此命令把包安装到
webprofile;如要把它作为独立 profile 触发"一次性任务"语义,请用dsh --profile headless "任务文本"调用(这是 DSH 启动器识别组合包 profile 的方式)。
配置项
本组合包对外只暴露一个 config:
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
task | 字符串(必填) | 这一轮要交给 Agent 的任务文本。普通用户不需要直接填这个字段,它由 headless-startup provider 从命令行位置参数解析并通过 ctx.headlessStartup.task 注入;schema 在 src/index.ts:36-38 声明为必填字符串 | 无(必填) |
下面这些是 cordis.patch.yml 在 patch 内声明的底层默认值,普通用户不需要也不应该直接覆盖:
| 行 ID | 默认值 | 含义(人话) |
|---|---|---|
system-prompt.config.persona | You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}. | 一次性任务的系统人设:编码 agent,模板变量在运行时替换 |
hmr.disabled | true | 关掉模块热替换;watch 模式下仅保留用户 patch 层的热加载 |
tools.config.mode | process.env.DSH_TOOLS_MODE | Code Mode / Function Mode 等工具模式开关,由环境变量 DSH_TOOLS_MODE 控制 |
常见问题
Q: 这个组合包和 dsh-web-app 有什么区别?
A: dsh-web-app 是浏览器面:挂载 HTTP server、Web runtime 和浏览器插件,可以持续对话;本组合包不开任何端口,只跑一次任务、输出结果、退出进程。脚本化调用选 headless,要 Web UI 选 web-app。
Q: 想在 CI 里调用 dsh 跑一个任务该怎么写?
A: 用 dsh --profile headless "任务内容",任务结束后进程自动退出;退出码在 turn/end.reason.kind === 'completed' 时为 0、其他情况为 1,shell 流水线里可以直接 if 判断。要捕获最终回复用 stdout 重定向:dsh --profile headless "..." > answer.txt。
Q: 运行时报 must provide ctx.appExit 是什么意思?
A: ctx.appExit 是由 dsh 启动器注入的退出钩子,本包不自带。必须用 dsh --profile headless 启动器跑;如果自己在 Cordis 树里直接挂 headless-runner 而不带启动器,会在 apply 阶段立刻抛错退出。
Q: 怎么控制最终回复写到哪?
A: 写到进程 stdout(process.stdout.write,在 src/index.ts:129)。普通用户用 shell 重定向即可;测试场景下本包把 stdout/stderr 引用挂在 internals 上可被替换(见 tests/headless.spec.ts:55-58)。
Q: 任务跑失败了怎么拿到错误信息?
A: 当 turn/end.reason.kind === 'error' 时,本包会把错误以 dsh: CODE: message 的格式写到 stderr(src/index.ts:131);stdout 同时输出一个换行占位,进程退出码为 1。
Q: 能把多次调用串起来、像聊天那样来回对话吗?
A: 不能。runner 没有交互式后续输入的 surface(README.md:19-20 明确说明);每跑一次就是一个新进程。需要多轮对话请用 dsh-web-app 或 dsh-acp。
上手难度
入门 — 装好组合包后只要写一行 dsh --profile headless "任务" 就能跑;要自定义行为只需在自己的 profile cordis.patch.yml 里按 id 覆盖 patch 中已声明的行(headless-runner、headless-startup、system-prompt、hmr、tools)。
已知问题与限制
- 只提交一个任务:runner 没有交互式后续输入面;它会等待 Agent 在返回 idle 前完成的所有工作,并打印该区间内最后一条非空 assistant 消息。多次对话场景请改用
dsh-web-app或dsh-acp(README.md:19) ctx.appExit由启动器持有:在dsh启动器之外启动 headless profile 会在激活时立即报错headless-runner: the launcher must provide ctx.appExit before the tree mounts,直到宿主提供该退出请求(src/index.ts:144-147、README.md:20)- 空任务会被启动器拒绝:命令行没传位置参数或全是空白时,
headless-startup会用 commander 报"a task is required"并以退出码 1 终止,runner 永远不会激活(src/startup.ts:53)
English | 中文
让 DeepSeek Harness 的长任务更容易看懂、更容易跟进。
DeepSeek Harness UX 是一个非官方社区源码版本。它没有重写 Agent 的工作方式,而是重点改进网页里的任务过程、长回答、会话查找和文件入口。
本项目不是 DeepSeek 官方发行版,也不享有上游官方支持。DeepSeek Harness 及相关名称归其权利人所有。
你会直接感受到什么
1. 会话进行时,思考和工具步骤不会一直刷屏
任务运行时,思考、上下文、命令和工具调用会被收进一个稳定的“过程”区域。你可以直接看到当前做到哪一步、已经运行多久,不必在大量技术消息里寻找进度。
如果启用展示辅助,界面还会用一次很小的模型请求,把 Todo、思考和工具证据整理成更容易理解的阶段名称。这个请求只负责显示,不会改变 Agent 的回答。
2. 任务完成后,过程自动折叠,答案回到主视线
正常完成的任务会自动收起思考过程,让最终答案留在最显眼的位置。遇到失败或中断时,过程会继续展开,方便检查问题。
任务完成后,过程会自动收起:

需要检查时,点一下就能重新展开:

3. 长日志可以单独滚动,不会带着整个对话乱跳
展开“运行详情”后,长命令输出和工具日志会在自己的区域里滚动。滚到边缘时不会突然把整个对话带走,底部输入框也不会把页面顶出一大片空白。
4. 长回答更适合阅读
回答的段落、标题和不同轮次之间更紧凑。任务结束后,可选的展示辅助还能优化答案标题;复制内容、会话历史和模型看到的原始答案都不会被改写。
任务刚结束时,网页会在后台补齐最后一段历史,避免晚到的结束事件让界面看起来还在运行,也不会闪出新的加载页。
5. 以前的会话更容易找
会话默认按最近更新时间排列,也可以切回手动排序。侧边栏可以搜索标题、工作区名称和当前进程中的对话内容;“未分组”区域也能直接新建不属于任何工作区的会话。
6. 生成的文件更容易找到
除了工具明确写出的文件,UX 版还会识别答案里清楚列出的文档、表格、数据集、图片、音视频、压缩包、数据库和 3D/CAD 文件路径,把它们显示成可打开的产物入口。普通文字、网址、命令和示例代码不会被误当成文件。
7. 模型配置集中在设置页
首次使用时会直接进入“设置 → 模型”的完整配置卡,不再维护另一套简化的密钥弹窗。提供方、模型、API Key 和错误恢复都在同一个地方完成。
它没有改变什么
- Agent Loop、模型路由、工具、权限、沙箱和 Session Log 仍沿用 DeepSeek Harness 的执行方式。
- 原始思考、上下文、命令和工具证据没有被删除,只是收进“运行详情”。
- 展示辅助不会修改 System Prompt、用户消息、工具、原始回答或会话历史。
- Session Log 默认仍保存在本地。
和官方版本相比,还需要知道这些
- 这是基于上游源码快照维护的社区版本,不会自动获得官方后续的修复、兼容性更新和安全更新。
- 这个快照还没有官方后来加入的部分能力,例如更严格的冷会话校验、隐藏当前无法登录的 OAuth-only 提供方,以及新的全局界面扩展位。
- 当前没有内建的 Codex OAuth 登录和 Token 自动刷新;选择
openai-codex路由时需要手动提供 Token。 - 基础 Bundle 会安装休眠状态的 Codex 和 Claude Code 子代理提供方,但不会因此自动启动对应产品进程。
- 官方版提供 npm 包;这个仓库只提供源码运行,不会向
@deepseek-aiscope 发布包。 - 当前官方源码使用 MIT 许可证;这个分支保留其上游快照当时采用的 BSD 3-Clause 许可证和相关声明。
应该选哪个版本?
如果你主要在网页里运行长任务,希望过程更清楚、回答更好读、会话和文件更容易找到,可以选择 DeepSeek Harness UX。
如果你更在意最新官方更新、npm 安装、Headless 或 CLI 工作流,应优先选择官方 DeepSeek Harness。
对比依据
UX 功能源码基于 35c6172。本说明以 2026-08-17 的官方 47f9438 为对照,只把用户能直接感知的差异写成功能,不把测试、包元数据和机械性源码差异包装成产品能力。
从源码运行
环境要求:
- Node.js
^22.19或>=24 - pnpm 11
- 兼容 DeepSeek 的 API Key
git clone https://github.com/ayuanwong/deepseek-harness-ux.git
cd deepseek-harness-ux
pnpm install
pnpm run build
pnpm run dsh -- web --port 3081
打开 http://127.0.0.1:3081,在“设置 → 模型”中添加模型提供方,然后新建会话。如果 3081 已被占用,可以换成其他端口。
本仓库交付的是完整源码版本,不是能直接安装到干净上游仓库的补丁,也没有单独发布为 npm 插件。
隐私
不要提交 .env、.npmrc、API Key、本地 Session、构建产物或 profile 数据。启用任何非默认遥测模式前,请先阅读上游遥测设置。展示辅助使用当前 Session 配置的模型提供方,因此启用阶段或标题整理时,会把受限的运行证据发送给该提供方。
开发
修改包之前,请阅读 AGENTS.md、开发指南和架构文档。
pnpm run lint
pnpm run build
pnpm run hygiene
pnpm run doc-sync
友情链接
— 带 TDD、证据检查、视觉和代码智能工作流的交互式终端 UI。
— Claude Code 风格的全屏终端 UI,支持实时任务状态、流式思考、回滚和上下文指标。
— DSH Find 上整理的 DeepSeek Harness 资源与生态项目。
许可证与归属
本仓库派生自 DeepSeek Harness,并保留其源码快照中的上游声明。本源码树使用 BSD 3-Clause 许可证;第三方依赖及许可条款见 THIRD_PARTY_NOTICES.md。
查看使用指南 →
该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。
收录徽章
[](https://deepseek-plugin.org/plugins/ayuanwong/deepseek-harness-ux/packages/bundle/headless)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。