heron
第 3 章

界面使用

3.1 布局

┌──────────────┬────────────────────────────────────┐
│  New thread  │  heron  ●                          │  ← 状态点
│              ├────────────────────────────────────┤
│ 会话 1       │                                    │
│ 会话 2  ◀    │        消息流                      │
│ 会话 3       │                                    │
│              ├────────────────────────────────────┤
│              │  [输入框]        📎       ↑ 发送    │
│ ──────────── │  agent: main · deepseek/deepseek-flash · …   │
│  Settings ⌘, │                                    │
└──────────────┴────────────────────────────────────┘
  • 状态点:Idle(灰)/ Running(蓝,脉动)/ Waiting for approval(黄)/ Failed(红)。
  • 输入框下方是当前会话的 agent、模型与思考档位,鼠标悬停可看完整信息。

3.2 会话

操作 怎么做的
新建 侧栏 New thread 或 /new
切换 点侧栏条目
改名 条目右侧 ⋯(鼠标悬停出现)→ Rename
删除 条目右侧 ⋯ → Delete
中止当前轮 输入框里的停止按钮或 /stop

会话历史存在 .heron/state/sessions/<id>/,重启后仍在。

有审批待处理的那条会话,标题右边会有一颗黄点 —— 即使你没开着那个会话, 也一眼能看出「有个审批在等你」。

3.3 发送与流式输出

正常输入、Enter 发送、Shift+Enter 换行。

  • 工具调用显示为可展开的卡片:工具名 + 参数摘要 + 结果。
  • 代码块带语法高亮。
  • 输出过程中可以再发一条:旧的一轮会在安全点停下,让位给新的(抢占)。

3.4 审批卡(HITL)

当 agent 要调用被标记为 ask 的工具时,轮次会停住,输入框被一张审批卡取代:

┌────────────────────────────────────────────┐
│ ⚠ Approval required                        │
│   The agent is paused until you respond.   │
│                                            │
│   write_file                               │
│   Requested by coder                       │
│   /your/project/internal/config.go         │
│                                            │
│   [ Approve ]  [ Reject ]                  │
└────────────────────────────────────────────┘
  • Approve —— 放行,agent 从 checkpoint 继续跑。
  • Reject —— 写不写理由都行,但建议写:理由会回灌给模型,它据此改路; 空理由对模型等于凭空断路(服务端不强制,界面也不拦你留空)。

Requested by xxx 只在子 agent 发起时出现。根 agent(就是当前会话自己) 的审批不标 —— 那正是「当前会话」,标了只是占地方。

★ 多个审批同时出现时,一次把它们全部答掉。只答一张,其余会带着新 id 重新中断。

3.5 附件

输入框的 📎 按钮或 /attach 可以给会话加文件。文件进该会话的独立工作区 .heron/state/sessions/<id>/workspace/,agent 通过路径访问。

3.6 斜杠命令

在输入框输入 / 会弹出命令列表。

命令 类型 作用
/new 动作 新建会话
/stop 动作 中止当前轮
/attach 动作 附件
/settings 动作 打开配置编辑器
/agents [名字] 动作 切换当前会话的 agent
/skill <名字> [任务] 提示词 用某个技能完成这项任务
/review [路径] 提示词 审阅当前改动或指定路径
/test [路径] 提示词 跑相关测试并汇总失败
/explain <路径或符号> 提示词 解释一段代码怎么工作
/fix <问题> 提示词 定位根因并做最小修复

「动作」类命令由前端直接执行;「提示词」类命令是模板,展开成一段给模型的话再发出去。

以 / 开头的绝对路径(如 /home/me/a.go)不会被当成命令,会原样发出。

3.7 用 @ 引用文件

在输入框输入 @ 会弹出项目文件列表,选中后把路径插进消息里:

看看 @internal/config.go 这个文件为什么不加载

它只是插一段路径文本,不做别的事 —— 文件不会被自动读进上下文,agent 自己决定要不要读。

3.8 切换 agent

  • 欢迎页:输入框里用 /agents 或点 agent 选择器,下次新建的会话用它。
  • 已有会话:/agents 会把当前会话的根 agent换掉。

每个声明了的 agent 都能当会话的 agent —— 没有「主 agent」那套推导。 会话选了谁,就以谁为第 0 层展开它自己的 subagents:。

3.9 技能(skills)

技能是放在 .heron/skills/<名字>/SKILL.md 的一组指令,用 /skill <名字> <任务> 调用:

---
name: refactor
description: 重构既有代码
---

保持行为不变的最小改动重构。
  • 只写 /skill(不带名字)会打开技能选择器,选一个会回填成 /skill <名字> , 你再补一句任务 —— 选中不会直接发送。
  • 名字写错(比如 /skill refactor 但没有这个技能)也会打开选择器并用它过滤, 而不是报「命令不存在」。
  • 技能实际由模型自己的 skill 工具执行,服务端展开命令时只是把 「用这个技能做这件事」的话转达给模型。

description 决定模型会不会主动选它 —— 写清楚「什么时候该用我」。 技能只扫一级子目录,嵌套更深的会被忽略。

3.10 设置(配置编辑器)

侧栏底部的 Settings,或快捷键 ⌘, / Ctrl+,。

它操作的是「某一级的一个文件」,不是合并后的配置 —— 这样才不会把 ${OPENAI_API_KEY} 展开成明文写回仓库。

能做 不能做
增删改 llm/ agents/ policy/ kb/ 下的配置文件 编辑 server/(只读 + 标注「需重启」)
保存前试合并校验,明文密钥一律拒绝 编辑 skills/(目录结构,不在编辑器范围)

两个要知道的细节:

  • 被项目级遮蔽:如果你改的是用户级文件,而项目级有同名文件,界面会提前提示 「此文件被项目级覆盖,保存不生效」,并给出跳转入口 —— 因为同名文件是整体替换。
  • 保存不等于生效:保存只做校验 + 原子写,生效由热更新 watcher 负责。 server/ 下的改动永远需要重启。