交互式终端界面(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 视图:autoprettyrawhex

过滤栏

在流量列表中按 / 开始过滤,EnterEsc 提交/关闭。语法见下方的过滤表达式语法

命令面板(:

在任意面板按 : 打开命令面板,输入子命令并 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 过滤栏、命令面板 :filterrelay-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 内置三种配色方案。默认 relayrelaycore.dev 品牌色一致(近黑底 + 青色强调)。

主题 ID别名说明
relaybranddefaultrelaycore.dev 品牌色 — 近黑底 + 青色强调(默认)
slatelegacyTokyo Night 风格 slate 背景 + 琥珀色焦点
high-contrasthchigh_contrasthighcontrast更亮的强调色与边框,适合对比度低的终端

解析优先级

主题按以下顺序解析(优先级从高到低):

  1. --theme <name> CLI 参数
  2. RELAY_CORE_TUI_THEME 环境变量(clap 已将其绑定到 --theme
  3. ~/.relay-core/config.toml 中的 [tui].theme
  4. 默认值 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 给关键流量打标记(如 mA),再用 ' 快速跳转——替代上一会话中的"记忆位置"。
  • 不确定快捷键?按 : 打开命令面板,所有动作都有稳定的文本别名。
  • TUI 仅在内存中保留最近 1,000 条流量。可结合 --save-stream <PATH> 将所有流量以 JSONL 形式落盘,供 离线分析
  • 搭配 --api-port 可让 relay-core-cli flows 等下游工具共享同一代理实例。