Headless 帮助文档
Headless 模式让 Hawa Code 在不启动终端交互界面的情况下运行,适合无 UI 环境、远程服务和自动化场景。需要说明的是,Headless 并不是通过 --headless 参数开启的,Hawa Code 提供以下两种无终端 UI 的用法:
hcode server:Headless 常驻服务。进程常驻、不渲染终端 UI,内置 WebServer(HTTP + WebSocket),通过浏览器远程控制。这是官方的 Headless 运行模式。hcode -p "...":单轮非交互模式。执行一次任务、将结果打印到标准输出后退出,适合管道和脚本调用,但不是常驻服务。
注意:配置项
headlessBrowser(无头浏览器)用于网页抓取渲染,与 Headless 运行模式无关,不要混淆。
1. 两种模式的区别
| 对比项 | hcode server |
hcode -p "..." |
|---|---|---|
| 运行方式 | 进程常驻,不退出 | 执行单轮后退出 |
| 交互能力 | 浏览器实时交互、审批工具调用 | 无交互,一次性输出 |
| 适用场景 | 远程常驻服务、无 UI 环境 | CI/CD、脚本、管道调用 |
- 需要”在远程机器上长期运行、通过浏览器使用完整 Agent 能力”时,使用
hcode server。 - 需要”在流水线里跑一条命令、按退出码判断结果”时,使用
hcode -p。
2. 使用 hcode server 启动 Headless 服务
2.1 命令格式
hcode server [options] |
2.2 参数说明
| 参数 | 说明 |
|---|---|
--port <n> |
Web 服务端口。默认读取 settings.webServer.port,未配置时为 3210;端口冲突时自动 +1 |
--host <addr> |
绑定地址,默认 127.0.0.1。绑定非 loopback 地址(如 0.0.0.0)时必须同时配置 --token,否则启动失败 |
--token <token> |
访问令牌。WebSocket 握手通过子协议或 ?token= 传递;REST 接口通过 Authorization: Bearer <token> 传递 |
--resume <id> |
恢复历史会话(匹配日志完整路径或文件名后缀 <id>.jsonl),找不到时以退出码 1 退出 |
--cwd <path> |
指定工作目录,默认为进程启动时的当前目录 |
--verbose |
输出详细信息 |
--dangerously-skip-permissions |
跳过所有权限确认,存在安全风险,详见注意事项 |
命令行参数的优先级高于 settings.json 中的 webServer 配置;Headless 模式下 webServer.enabled 会被强制视为开启。
2.3 示例
hcode server # 本机 127.0.0.1:3210,浏览器打开即用 |
3. 前置条件
- 先完成终端模式初始化:Headless 模式跳过 Onboarding、信任对话框、MCP 审批等依赖终端交互的步骤,因此请先在终端模式中运行一次
hcode,完成模型/API 等初始化配置。 - 模型与 API 配置:请确保模型和 API 已通过终端模式配置完成且有效,配置无效时启动或查询会报错。
- 权限与 token:绑定 loopback 地址(如
127.0.0.1)无需 token;绑定非 loopback 地址必须配置--token,否则服务启动失败。 - 工作目录:进程会自动授予
--cwd目录的读取权限,无需终端信任确认。
4. 启动后如何判断成功
启动成功的标志:
- 标准输出依次出现
Hawa Code headless server starting...、Tools, commands and MCP clients loaded, starting Web server...。 - 随后出现
Hawa Code headless server started与访问 URL(例如URL: http://127.0.0.1:3210);若配置了 token,还会附带访问方式说明。实际端口以启动输出中的URL:为准(端口冲突时已自动 +1)。 - 进程保持常驻不退出,用浏览器打开该 URL 即可使用。
启动会话后,终端标准输出不再打印会话内容;会话消息以 JSONL 形式落盘,并通过 WebSocket 实时推送到浏览器。
5. 日志与排查
日志位于 UCODE_ROOT_DIR/projects/<项目目录>/ 下:
| 路径 | 内容 |
|---|---|
messages/*.jsonl |
会话消息记录 |
log/*.log |
运行日志 |
log/error-<日期>.log |
错误日志 |
errors/*.txt |
错误记录 |
mcp-logs-<server>/ |
各 MCP Server 的日志 |
常见失败信号与退出码:
| 现象 | 说明 |
|---|---|
Failed to start WebServer: ... 并以退出码 1 退出 |
WebServer 启动失败,常见于非 loopback 未配 token、端口占用等 |
Session log not found: <id> 并以退出码 1 退出 |
--resume 指定的会话日志不存在 |
| 启动成功后进程被杀或退出 | 属于异常,请查看错误日志 |
排查顺序建议:先看标准输出中的提示 → 查看 log/error-*.log → 检查浏览器端是否因 token 被拒绝连接 → 必要时查看 MCP 日志。
6. CI/CD 与脚本场景
优先使用
hcode -p:执行一次查询、将结果打印到标准输出后以退出码 0 退出,适合作为 CI 步骤按退出码判断结果。hcode -p "修复 lint 错误"
echo "说明" | hcode -p # 也支持标准输入标准输入无内容时进程以退出码 1 退出。
常驻远程服务/无 UI 环境使用
hcode server:在服务器、Docker、systemd 中常驻运行,浏览器作为前端。批量与自动化任务:可通过 WebServer 的 REST / WebSocket API 程序化提交任务(REST 接口需携带 Bearer token)。
7. 注意事项
- 权限确认需要有人在浏览器侧审批:Headless 模式下唯一的审批通道是 Web 客户端;没有任何客户端响应时,工具确认约 5 分钟后超时。
--dangerously-skip-permissions的安全风险:该参数会跳过所有权限确认,Headless 路径未执行终端模式中的隔离环境校验,请务必仅在受信任的隔离环境中使用。- 后台运行时注意标准输入:通过 systemd、
docker run -d等方式后台运行不受影响;但管道/ heredoc 场景(如somecmd | hcode server)会因等待标准输入 EOF 而阻塞启动,后台运行请确保标准输入为/dev/null或设置CI=true。 - 端口冲突自动处理:端口被占用时自动 +1 重试,实际端口以启动输出
URL:行为准。 - token 安全:token 会出现在进程参数和 URL query param 中,多用户机器上注意进程列表泄露与浏览器历史泄露。
- 其他限制:无内建任务超时与失败重试;
--resume跨会话恢复的完整性未经充分验证;Headless 路径不执行 SessionStart hooks,依赖该 hook 注入上下文的用户请注意。