交互式终端界面(TUI)
RelayCore 自带功能完整的终端 UI,可实时检查流量。基于 ratatui 构建,使用体验类似 Shell 里的轻量级 Charles / Proxyman。0.8 起整体改写为响应式双面板布局,引入命令面板、流标记、Body 视图切换与状态栏优先级提示。
启动
relay-core-cli run --ui
# 可选:与 REST/SSE API 搭配使用,便于外部工具(如 flows)共享同一代理实例
relay-core-cli run --ui --api-port 8082 启用 --ui 后 TUI 会接管终端,代理进程本身仍在同一进程中运行,无需启动额外服务。终端最小尺寸 60 × 12,低于此值会拒绝启动并提示调整窗口。
布局
TUI 根据终端宽度自适应切换 5 档 profile,列预算由窄到宽自动展开:
| 宽度 | 布局 | 面板与列 |
|---|---|---|
| < 60 列 | — | 终端过窄,TUI 拒绝启动并提示调整窗口 |
| 60–79 列 | 单面板(Tab 切换) | 全屏流量列表 或 详情 |
| 80–99 列 | 双面板(紧凑) | 流量列表 · 详情(列:Method、Code、Dur、URL) |
| 100–119 列 | 双面板(标准) | 更长 URL 列 |
| 120–179 列 | 双面板(宽) | 新增 Size、Host、Path 列 |
| ≥ 180 列 | 双面板(超宽) | Path 列获得额外列预算 |
0.8 起四面板(Flow list / Detail / Rules / Pending intercepts)布局被移除;规则与待处理拦截面板仅在 --api-port 模式下保留。脱离 API 时统一回退为本地双面板视图。
快捷键
全局
| 按键 | 动作 |
|---|---|
q | 退出 TUI(代理在后台继续运行,SIGINT 时结束) |
: | 打开命令面板(:help 查看完整命令) |
? | 切换应用内帮助浮层 |
Esc | 返回流量列表 / 关闭浮层 / 退出命令面板 |
Tab | 循环切换活动区域(列表 ↔ 详情) |
1 / 2 / 3 / 4 | 跳转到详情选项卡:概览 · 请求 · 响应 · 消息 |
y | 将当前选中的 HTTP 流量复制为 cURL 命令 |
Ctrl+C | 强制结束进程 |
流量列表(默认焦点)
| 按键 | 动作 |
|---|---|
j / ↓ | 下一行 |
k / ↑ | 上一行 |
g / Home | 跳到最新(顶部)并重新启用自动滚动 |
G / End | 跳到最旧(底部) |
Enter / l / → | 聚焦详情面板 |
m | 在当前流量上切换 A–Z 标记(再次按同一字母移除) |
'(反引号 / backtick) | 跳转到下一个被标记的流量 |
d | 从本地列表中删除当前选中流量 |
c | 清空整个流量列表(不影响代理) |
p | 暂停/恢复捕获。暂停时新流量计入待处理计数,不进列表。 |
/ | 打开过滤栏 |
被标记的流量在列表中显示一个 Mk 列(标记字母)。该列在窄终端下会被压缩进 Status 列以节省列预算。
流量详情
| 按键 | 动作 |
|---|---|
j / k 或 ↓ / ↑ | 逐行滚动 |
Ctrl+d / PageDown | 向下滚动 10 行 |
Ctrl+u / PageUp | 向上滚动 10 行 |
g / Home | 滚到顶部 |
G / End | 滚到底部 |
Tab | 循环切换详情选项卡(概览 → 请求 → 响应 → 消息 → 概览) |
h / ← / Esc | 返回流量列表 |
v | 循环切换 Body 视图:auto → pretty → raw → hex |
过滤栏
在流量列表中按 / 开始过滤,Enter 或 Esc 提交/关闭。语法见下方的过滤表达式语法。
命令面板(:)
在任意面板按 : 打开命令面板,输入子命令并 Enter 执行。命令面板可访问所有常用操作的稳定别名,也支持主题切换、过滤器、复制等。
| 命令 | 动作 |
|---|---|
:q / :quit | 退出 TUI |
:c / :clear | 清空流量列表 |
:p / :pause | 暂停捕获 |
:r / :resume | 恢复捕获 |
:f <expr> / :filter <expr> | 设置过滤表达式 |
:uf / :unfilter | 清除过滤 |
:t <name> / :theme <name> | 切换主题(relay / slate / high-contrast) |
:cp / :copy | 复制当前流量为 cURL |
:v <mode> / :view <mode> | 切换 Body 视图(auto / pretty / raw / hex) |
:h / :help | 列出所有命令 |
Body 视图(v)
详情面板内,按 v 循环切换请求/响应 body 的渲染模式:
- auto — 根据
Content-Type自动选择:JSON 走pretty,文本与图片走raw,未知二进制走hex - pretty — 语法高亮(JSON / YAML / XML / HTML / JavaScript / CSS),并尝试 JSONPath 折叠
- raw — 原始字节流(适合看压缩或二进制 payload)
- hex — 十六进制转储,常用于二进制协议调试
WebSocket 消息页同样受 v 控制:文本帧走 pretty/raw,二进制帧走 hex。
状态栏
底部状态栏始终显示运行状态,0.8 起增加 优先级提示:当存在暂停捕获、待处理流量、待处理拦截或脚本错误时,相关指示会以高亮占据状态栏左侧,直到处置完毕。
- 实时请求速率(5 秒滑动窗口,req/s)
- 启动以来累计捕获的流量数
- 当前活动区域指示(LIST / DETAIL)
- 运行时长
hh:mm:ss - 捕获暂停或自动滚动关闭时的待处理计数
- 当前 Body 视图(仅在详情面板时显示)
鼠标支持
已启用鼠标捕获。可使用滚轮滚动列表,点击切换行或面板焦点。终端尺寸变化会立即触发布局重新计算。
过滤表达式语法
TUI 过滤栏、命令面板 :filter 与 relay-core-cli flows --filter、HTTP API 的 search_flows 共享同一解析器。按 / 打开过滤栏后输入表达式即可。完整语法见 过滤表达式。
速览:
host:api method:POST status:>=400 # 失败的对 api 的 POST
ws status:500-599 # 5xx 的 WebSocket
health # URL 含 "health" 的任意流 详情选项卡
- 概览 (Overview) — 方法、URL、状态、耗时、大小、主机、远端地址、命中的规则、错误信息
- 请求 (Request) — 起始行、请求头、请求体(受
max_body_size限制,按v切换视图) - 响应 (Response) — 状态行、响应头、响应体
- 消息 (Messages) — WebSocket 消息日志(opcode、方向、大小、base64 内容)。普通 HTTP 此页为空。
复制为 cURL
在任意 HTTP/WebSocket 流量上按 y 或在命令面板执行 :cp,即可将一条可移植的 POSIX shell cURL 命令复制到剪贴板。Header 值使用单引号转义;body 使用 --data-binary 写入。macOS 需要 pbcopy,Linux 需要 wl-copy / xclip;未找到时仍会构造命令并通过 toast 提示剪贴板不可用。
主题
TUI 内置三种配色方案。默认 relay 与 relaycore.dev 品牌色一致(近黑底 + 青色强调)。
| 主题 ID | 别名 | 说明 |
|---|---|---|
relay | brand、default | relaycore.dev 品牌色 — 近黑底 + 青色强调(默认) |
slate | legacy | Tokyo Night 风格 slate 背景 + 琥珀色焦点 |
high-contrast | hc、high_contrast、highcontrast | 更亮的强调色与边框,适合对比度低的终端 |
解析优先级
主题按以下顺序解析(优先级从高到低):
--theme <name>CLI 参数RELAY_CORE_TUI_THEME环境变量(clap 已将其绑定到--theme)~/.relay-core/config.toml中的[tui].theme- 默认值
relay
# 临时覆盖
relay-core-cli run --ui --theme slate
# 持久化到本机
cat >> ~/.relay-core/config.toml <<'EOF'
[tui]
theme = "high-contrast"
EOF
# 环境变量覆盖(如 CI 场景)
RELAY_CORE_TUI_THEME=slate relay-core-cli run --ui 颜色语义
- HTTP 方法:GET = 绿,POST = 橙,PUT = 青,DELETE = 红,PATCH = 蓝绿,HEAD = 紫,OPTIONS = 灰,WS = 青
- 状态码:2xx = 绿,3xx = 橙,4xx/5xx = 红,在途 = 暗色斜体
- 耗时:< 100 ms = 绿,< 500 ms = 暗,≥ 500 ms = 红
- 主机:8 色调色板,基于主机名哈希确定
主题名大小写不敏感。未知名称会报错并列出可选值。
捕获暂停与待处理计数
按 p 切换"暂停"模式。代理继续运行,TUI 仍持续跟踪新的流量更新,但列表被冻结,每次新事件都计入待处理计数。再按 p 恢复,清空待处理计数并重新跟随实时流量。
使用提示
- 多按
g重新启用自动滚动——使用j/k手动滚动时会暂时关闭自动滚动,便于在持续流量中查看某一行。 - 用
m给关键流量打标记(如m后A),再用'快速跳转——替代上一会话中的"记忆位置"。 - 不确定快捷键?按
:打开命令面板,所有动作都有稳定的文本别名。 - TUI 仅在内存中保留最近 1,000 条流量。可结合
--save-stream <PATH>将所有流量以 JSONL 形式落盘,供 离线分析。 - 搭配
--api-port可让relay-core-cli flows等下游工具共享同一代理实例。