Open Relay:我想把 AI Agent 跑 CLI 的方式,彻底改掉

79 阅读9分钟

项目地址:slaveOftime/open-relay: `oly` turns long-running and interactive CLI workflows into persistent, supervised sessions for humans and AI agents. Close the terminal, keep the process alive, get notified when input is needed, and jump back in from anywhere.

如果你最近经常用 `GitHub Copilot CLI`、`Claude Code`、`Gemini CLI`、`OpenCode` 这类工具,应该很容易遇到一个特别真实的问题:

你让它跑一个任务,可能要 10 分钟、20 分钟,甚至更久。中间它突然卡在一个 `y/n`、权限确认、密码输入,或者某个需要人工判断的步骤上。于是整个流程就变成了

**你必须一直盯着终端。**

我做 Open Relay,最初就是因为这个体验太别扭了。

一方面,大家都在说 AI Agent 可以自主执行、长时间工作;另一方面,我们现实里的使用方式却还是“人肉守着终端,等它来喊你”。

所以我做了 **Open Relay(命令行名叫 `oly`)**。它想解决的,恰好就是这个问题。

一句话概括:

**我想把长时间运行、可交互的 CLI 任务,变成“可托管、可恢复、可审计、可远程接管”的会话。**

它不是一个“又一个终端美化工具”,而更像是 **AI Agent 时代的 CLI 基础设施**。

## 我到底想解决什么问题?

传统 CLI 工作流的问题,在 AI Agent 场景下会被放大:

- 任务一跑就是几十分钟

- 中途可能弹出确认、密码、审批、选择菜单

- 终端一关,任务可能就断了

- 你离开工位时,很难知道它有没有卡住

- 出现需要人介入的节点时,缺少一个顺手的“接管入口”

`tmux`、`zellij` 当然能解决一部分“会话持久化”问题,但它们的产品目标并不是 **监督 AI Agent**。

我对 Open Relay 的定位一直很明确:

**它不是终端复用器替代品,而是面向 Human-in-the-Loop 的 agent supervision relay。**

我不是要把终端分屏、窗口管理做得更炫;我关注的是:

- 任务能不能在后台持续活着

- 人能不能随时重新接管

- 系统能不能判断“现在可能需要你输入了”

- 整个过程能不能留下审计痕迹

- 一台机器上的 Agent,能不能被另一台机器上的人远程监督

- 一个 Agent 能不能监督另一个 Agent

## Open Relay 是怎么做的?

它的核心思路很简单,但非常实用:

**把 PTY 会话的所有权,从当前终端,交给一个后台 daemon。**

也就是说,真正拥有这个交互式进程的,不再是你眼前开的那个 terminal tab,而是 `oly` 的后台守护进程。

于是能力就自然出来了:

- 你可以启动一个 CLI 任务后立刻 detach

- 关掉终端,任务继续跑

- 之后随时 `attach` 回去

- 没接回去之前,也可以先看日志

- 如果只是需要按个回车、输个 `yes`,甚至不用 attach,直接注入输入就行

- 它还能检测“像是卡在 prompt 上了”,主动提醒你

README 里有一句我自己很喜欢的话:

> Run any CLI like a managed service.

这句话其实就是我想表达的产品本质:

**把原本一次性的 CLI 进程,提升成可管理的长期会话。**

## 我最想做的,不只是“能后台跑”

Open Relay 不是只做了一个 detach/reattach。

从一开始,我想搭的就是一整套 **“人监督 Agent,Agent 也可以监督 Agent”** 的运行模型。

比如:

- 一个代理可以长时间自主执行任务

- 它遇到不确定的步骤,可以升级给“监督代理”

- 监督代理如果仍然不确定,或者需要更高权限,再升级给人

- 人不需要一直坐在终端前,只在关键节点介入

我觉得这才是未来真实可行的协作方式。

不是所有任务都要全自动,也不是所有风险都靠人全程盯着。更现实的模式是:

**让系统先自动跑,把“真正值得打断人类”的时刻筛出来。**

而 Open Relay 做的,就是这个模式最底层的执行基座。

## 从技术上看,我为什么觉得它不是“玩具”?

我在 `README.md`、`SPEC.md`、`ARCHITECTURE.md` 和 `ARCHITECTURE_PTY.md` 里写了不少细节,因为这个项目从一开始就不是停留在点子层面。

**我是真的在认真处理 PTY / 终端里那些最容易把产品做崩的边缘问题。**

### 1. Daemon 持有 PTY,客户端只是代理

我采用的是 daemon-side PTY ownership,会话由 daemon 持有,CLI 和 Web 只是连接与控制入口。

好处非常直接:

- 终端断开不影响任务继续

- 多个客户端可以同时 attach

- 后续做网页终端、远程节点代理也顺理成章

### 2. 有 ring buffer,可回放最近输出

我不是简单把输出刷到屏幕上,而是维护一个内存环形缓冲区,并把日志落盘。

所以当你重新 attach 时,不会面对一个“突然开始直播”的黑盒,而是可以先看到最近发生了什么,再进入实时流。

对 AI Agent 场景来说,这特别重要。因为很多时候你不是要“看现在”,而是要先补上“刚才错过了什么”。

### 3. 会做 prompt 检测和通知

在规格设计里,我会结合两类信号来判断“现在可能需要输入”:

- 最近输出里出现 prompt-like 模式

- 一段时间没有新输出

这比单纯看进程是否存活,更接近真实状态。

换句话说,我关注的不是“程序还在不在”,而是:

**它是不是在等你。**

### 4. 认真处理了终端模式和转义序列

文档里我专门提到:

- `DECCKM` 光标键模式跟踪

- bracketed paste 模式跟踪

- 跨 chunk 的 escape sequence 正确性

- OSC/CPR/DA 等终端查询拦截和响应

- Windows ConPTY 的特殊兼容处理

因为如果你想做“可恢复的交互式 CLI 会话”,真正难的不是命令入口,而是复杂、脏、平台差异极大的终端字节流处理。

## 它为什么不是 tmux 的替代品?

很多人第一反应会问:这不就是另一个 `tmux` 吗?

我的回答通常是:

`tmux` 解决的是 **人类终端会话的持久化和复用**;

Open Relay 解决的是 **Agent CLI 任务的托管与监督**。

两者有交集,但不在一个抽象层。

`tmux` 更像“终端空间管理器”;

`oly` 更像“长运行 CLI agent session manager”。

它不强调窗口、pane、screen buffer,而是强调:

- 会话生命周期

- 可注入输入

- 可审计日志

- prompt 检测

- 远程监督

- 多节点联邦

如果说 `tmux` 是给“我本人在终端里工作”设计的,

那 Open Relay 更像是给“**我让一个 agent 在终端里替我工作**”设计的。

## 我觉得它最适合哪几类人?

### 1. 高频使用 AI Coding Agent 的个人开发者

如果你经常让 agent 跑代码生成、重构、测试、构建、修 bug,这个项目会很自然地切中你的痛点。

尤其是那种任务长、中途偶尔需要确认、你又不想一直盯着它的情况。

### 2. 做平台工程、自动化运维的人

这类人真正关心的不是“有没有一个更酷的 terminal UI”,而是:

- 会话是否持久

- 事件是否可追溯

- 权限边界是否清晰

- 远端节点是否可以统一接入

我设计 primary/secondary federation,也是朝这个方向走的。

### 3. 想做“人类审批 + Agent 执行”工作流的人

比如:

- 自动化代码修改,但关键步骤要人批准

- 批处理脚本长期运行,中间遇到风险动作要停下来问

- 一个 agent 负责执行,另一个 agent 负责监督升级

这时候,Open Relay 提供的就是一层很顺手的基础能力。

## 它现在已经能怎么用?

上手路径其实很直接:

```bash

oly daemon start

oly start --title "code is cheap" --detach copilot

oly ls

oly logs

oly input --text "yes" --key enter

oly attach

oly stop

```

你可以把它理解成:

1. 先启动一个后台守护进程

2. 把 CLI 任务扔进去跑

3. 平时靠 `ls` 和 `logs` 看状态

4. 需要介入时,用 `input` 或 `attach` 接管

5. 结束时再 `stop`

这个交互模型我一直希望做得足够克制。它没有试图发明一套全新的开发方式,而是在尽量保留 CLI 原有习惯的基础上,补上“托管”和“监督”这两层能力。

## 一个我很坚持的设计:默认不内建公网监听

很多人做远程控制工具,第一反应是“直接内置一个网络服务”。

但 Open Relay 的思路不是这样。

我更倾向于:

- daemon 本身保持本地访问

- 远程访问通过用户自己控制的 tunnel

- 外面再套一层 auth gateway

- 所有动作都要可归因、可审计

这不是保守,而是我觉得更成熟。远程访问这件事,本来就不该假装“一个二进制解决所有安全问题”,而是要结合你自己的身份系统、网络边界和权限规则。

## 为什么我还会继续做它?

因为它踩在一个很明确的趋势上:

**以后会越来越多的工作,不是人直接敲命令,而是人发起、监督、接管 Agent 在 CLI 里的长流程执行。**

而我们今天的终端工具链,其实还没有完全准备好迎接这件事。

我们有 shell,有 terminal,有 tmux,有 IDE 插件,但缺的那一层是:

**一个对“长运行、可交互、可监督、可恢复的 agent session”足够友好的基础设施。**

Open Relay 想补的,就是这层。

## 最后

如果你对下面这些关键词感兴趣:

- AI Agent

- Human-in-the-Loop

- 长时间 CLI 任务托管

- 可恢复交互式会话

- PTY / terminal runtime

- 远程监督与节点联邦

欢迎来看看 **Open Relay / `oly`**。

我现在最想把它做好的,不是“功能清单再多几项”,而是把这个问题真的解决透。

很多项目是在“造一个更炫的界面”,而 Open Relay 更像是在补齐 **AI Agent 时代缺失的运行时基础设施**。