DeepSeek Harness 的 --host 0.0.0.0:笔记说已实现,代码直接报错
如果你在 deepseek-harness 仓库里翻 .agents/notes/,看到一篇状态写着 Status: implemented 的笔记,说 dsh web --host 0.0.0.0 是官方支持的「全接口模式」,然后照着这句去组命令——那么在同一个仓库快照里,另一处源码写的是遇到这个值就报一句用法错误。
这不是什么隐藏彩蛋,就是同一件事在三个地方留下了三种描述。这篇把三处逐一摆出来,说明该去哪一层找可执行的口径,以及怎么自己在仓库里把它核一遍。
先把限定说在前面:我们采集的快照是 47f9438,采集日 2026-08-16,仓库建立于 2026-08-13,根 package.json 里 version 是 0.1.0-rc.5。README 自述处于「开发者预览」阶段,英文原文明写 THERE WILL BE COMPATIBILITY-BREAKING CHANGES.(README.md:9-11),中文侧对应写「未来将出现破坏兼容性的变更」(README.zh.md:9-11)。所以下面这三处口径本身也随时可能变,本文只描述我们读到的那一刻。
三处分别写了什么
第一处:Agent Note,状态标着 implemented。
.agents/notes/implemented/feature/2026-07-22-web-bind-address.md 的 :3 是 Status: implemented。同文 :15 原文写的是:The CLI accepts --host 0.0.0.0 as the explicit all-interface mode and rejects other values——即「CLI 接受 0.0.0.0,并拒绝其它值」。同文 :29 接着写「a browser on another machine must opt in with dsh web --host 0.0.0.0」,中文侧 2026-07-22-web-bind-address.zh.md:29 是同义表述。
第二处:源码,遇到这个值直接 program.error。
packages/bundle/web-app/src/startup.ts:69-70:
if (options.host === '0.0.0.0') {
program.error('error: --host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead')
}
请注意这两处的方向是反的:笔记写的是「接受 0.0.0.0、拒绝其它值」,而这段判断恰恰只对 0.0.0.0 这一个值走进报错分支。至于其它 host 值在这段之外是否还有别的校验,超出我们核过的范围,本文不作判断。
第三处:CLI 参考文档,与源码一致。
apps/cli/reference/README.md:64 与中文侧 apps/cli/reference/README.zh.md:64 写的是:CLI 有意还不支持 --host 0.0.0.0,会以一个用法错误退出。也就是说,三处里有两处(源码与 CLI 参考)说的是同一件事,另一处(Agent Note)说的是相反的事。
还有一处容易被顺手拿来当证据、但其实在讲另一层的:docs/subsystems/web-server.md:35,41 描述的是承载层的 WebServerOptions.host,原文说它「accepts only 127.0.0.1 (default posture) and 0.0.0.0 (deliberate network exposure)」。这句讲的是 web server 这个包的配置接口能取哪两个值,不是 dsh web 这个命令行会接受什么。把它当成「命令行支持 0.0.0.0」的旁证,是把两层看混了。
到这里就该停:我们只陈述这四处的位置与原文差异,不推断哪一处「本来是对的」,不猜谁有没有同步,也不拿这条差异去评价这个项目。以我们实读的仓库快照为准。
这个参数为什么会同时出现在三层材料里
单看这一点不必绕弯,命令面的归属在仓库里是分开写的。
dsh 的启动器自己只认四个 flag:--profile <name>、可重复的 --patch <path>、--dump-config、--dump-default-config(apps/cli/src/args.ts:131-134)。web 是一个硬编码别名(args.ts:156-169),等价于 --profile web。而 --host <host>、--port <port>、可重复的 --trusted-host <authority...> 这三个,是 web app 这个 bundle 自己定义的 flag,定义在 packages/bundle/web-app/src/startup.ts:48-50;apps/cli/reference/README.md:27 的参数表也是这么归的。
所以 --host 这一个参数的说法,天然会出现在三层材料里:写决策过程的 Agent Note、写命令面的 CLI 参考、写承载层配置的子系统文档。对使用者来说,能被执行的只有源码那一层,其余两层是围绕它的说明性材料。
顺便说一句默认值的来历:dsh web 默认地址 http://127.0.0.1:3080 里的端口,硬来源在组合配置 packages/bundle/web-app/cordis.patch.yml:118-120,写法是 port: !!js ctx.webStartup.port ?? 3080;packages/boot/cmdline/src/index.ts:14 的注释举的也是这个例子。这是配置里的默认值,不是对运行表现的承诺。
自己核一遍:五个可执行的判定动作
不必信本文,仓库里这几步是可以自己走的:
- 打开
packages/bundle/web-app/src/startup.ts,找options.host === '0.0.0.0'这个判断。这一处是唯一会被执行的口径,先看它。 - 打开
apps/cli/reference/README.md:64,看这一行与上一步是否一致。这是命令面的参考文档,和源码同仓同快照。 - 只有在需要理解「当初为什么这么定」时,再去看
.agents/notes/implemented/feature/2026-07-22-web-bind-address.md。笔记的Status:字段说明的是这条决策的处理状态,不是当前命令行的接口文档。 - 如果你手上出现的是
docs/subsystems/web-server.md里那段Config接口的描述,先确认自己问的是「CLI 会不会接受这个 flag」还是「web server 包的host字段能填什么」——这是两个问题。 - 组命令前跑一次
dsh web --help。web app 的 flag 定义在startup.ts:48-50,帮助文本由它自己出,以--help的实际输出为准——我们没有安装、没有运行过这个项目,所以本文不描述它打印出来的具体样子。
处置与验证
按源码这一层的语义,dsh web 的可用姿势就是默认的 127.0.0.1,报错信息本身也把替代方案写进去了:use 127.0.0.1 instead。仓库里另一处也把这条列在「尚未支持」的清单上:packages/bundle/web-app/src/startup.ts:70 原文含 intentionally not supported yet for safety,apps/cli/reference/README.md:64 与其中文侧同。
改完之后怎么确认自己没绕错弯:核对你启动时用的 host 值,以及 packages/bundle/web-app/cordis.patch.yml 里 host / port 两行的组合值来源——命令行 flag 与组合配置是同一件事的两个入口,弄清是哪一个在生效,比反复试命令有用。
什么情况说明不是这条原因:
- 报错文案是
error: --profile <name> is required(args.ts:140),或者error: --dump-config and --dump-default-config are mutually exclusive(args.ts:90)——这些来自启动器层,跟--host无关。 - 从源码跑而没有先执行过
pnpm run build:apps/cli/reference/README.md:84写明,缺少 host 产物会以模块解析错误让 profile boot 失败,且不会给出构建提示;同处还写「The launcher does not check freshness」,旧 bundle 不会自动被判定为过期。这类失败与绑定地址没有关系。 - 你根本没在用源码路径,而是走 README 给的
npx @deepseek-ai/dsh web(README.md:20)——那么你手上的版本与本文核的快照47f9438未必是同一份,上面所有行号都要重新对。
一点使用材料的方法
这个仓库的 .agents/notes/ 体量不小:按状态目录数,implemented 507 篇、archived 143 篇、proposed 25 篇、rejected 11 篇,英文侧合计 686 篇(截至 2026-08-16 的快照)。.agents/notes/README.md:12 对 proposed/ 的定义原文是「proposals reviewed before implementation; not yet built (or only partly)」。
另有两条读这些材料时用得上的仓库约定。一是 .rgignore(全文 3 行)把 /.agents/notes/archived/ 整个排除在检索之外,注释原文是「Frozen Agent Notes are historical snapshots, not current search authority.」——归档笔记不作为当前的检索权威,这条约定本身就写在仓库里。二是中英材料的组织方式:docs/i18n/README.md:10 原文「A pair is three sibling files.」,即 foo.md、foo.zh.md、foo.i18n.yaml 三个同目录文件;同文 :9 写「Both languages carry equal authority.」(两种语言权威性对等)。这也是本文每处都把英文侧与中文侧行号一并给出的原因:两边指的是同一条内容,不存在「中文是译文所以次一等」的读法。
把这类笔记当成设计背景来读,收益很高;把它当成接口文档来抄命令,就会撞上本文这一类差异。判据很简单:能被执行的是源码,其余都是说明。
最后一件不能省的事。这个报错文案自己点明了风险面:把服务绑到非回环地址等于把远程代码执行暴露到网络上。与之配套的还有一条得照实说的默认姿势——apps/cli/reference/README.md:70 写明新会话默认权限预设是 workspace-write,bash 与文件系统写入被限制在会话 workspace 与平台临时目录,但「reads, network access, and process visibility are not confined」(读取、网络访问与进程可见性不受限制)。dsh 会在你的机器上执行工具、跑 shell、起子进程,这一点不该被淡化,也不该因为「有沙箱」就当成安全结论。
延伸阅读
- 从头读起:DeepSeek Harness 是什么:建仓三天、13 万 star 的 Agent 框架
- 本专题共 45 篇,完整分组目录见专题页
- DeepSeek Harness 的 Node 门槛:230 份 manifest 没一份写 engines
- DeepSeek Harness 中英文档怎么防漂:1078 组配对与 blob hash 校验
本文依据 DeepSeek Harness 官方仓库(github.com/deepseek-ai/deepseek-harness)的 README、docs/ 下的
架构与子系统文档、以及 packages/ 下的源码整理,核对日 2026-08-16,对应仓库快照 47f9438(版本 0.1.0-rc.5)。
本文内容为仓库源码与文档口径,我们没有安装、也没有运行过这个项目,
因此不涉及界面外观、操作手感与运行速度的任何描述。
该仓库建立于 2026-08-13,README 自述处于开发者预览阶段并明确说明未来会有破坏兼容性的变更,
文中出现的命令、配置与默认值随时可能变动,请以仓库最新内容为准。
安全与合规相关做法请结合自身环境评估,本文不构成安全方案建议。