OSC 7501 是 Mitchell Hashimoto 提出的一种新终端转义序列,使任何程序能够告诉终端它正在做什么:空闲、工作中、等待用户输入、已完成或失败,以及原因。该协议源自 Superlogical 和 Ghostty 项目的工作,但被设计为通用的终端原生规范,不依赖于任何特定产品或语言。它解决了长时间运行的终端任务(如构建、部署、包升级、数据处理和编码代理)中常见的困扰——用户常常无法判断程序是仍在运行、被输入阻塞,还是已经结束。

该协议使用操作系统命令(OSC)引导符 ESC ] 7501 ; 后跟冒号分隔的 key=value 对,并以 ESC 终止(即 ESC 反斜杠)。唯一必需的键是 state,其值可为 idle、working、done、blocked 或 error。可选键包括 app(用于提供稳定的机器可读程序名称,如 terraform 或 claude‑code)、msg(用于单行可读文本,以 Base64 UTF‑8 编码)以及 kind(用于说明程序被阻塞的原因,如 permission、question、auth)。管理多个并发活动的程序可以通过斜线分隔的层级 ID 报告状态——例如,部署工具在根级别显示为 working,而 us‑east/push 显示为 working 且进度 40%,eu‑west 则显示为 blocked 并等待批准。如果报告的 ID 不符合语法,则会被忽略;未知的键会被安全跳过,使得协议既健壮又可扩展。

来自 Rex 文档的 OSC 7501 协议语法和使用示例的插图
OSC 7501 协议使用 ESC ] 7501 ; key=value 对来报告程序状态,如 Rex 文档所示。www.superlogical.com

此图展示了 OSC 7501 协议的格式,文章中将其描述为一种用于报告程序状态(空闲、工作中、完成、阻塞、错误)的终端转义序列,并包含可选的 app 名称、消息和阻塞原因键。

由于 OSC 7501 通过现有的伪终端发出,它可以在 SSH 会话、容器内以及任何存在 PTY 的环境中工作,避免了依赖解析窗口标题或屏幕内容的脆弱启发式方法,也无需每个程序去适配各种特定的收件箱 API。与较旧的 OSC 9;4 进度指示器相比(后者只能传达 busy/not busy),OSC 7501 提供了更细致的状态和消息。目前已有实现存在于 libghostty、Rex 终端模拟器中,并且已通过小型插件或分支集成到 Terraform、Claude Code、Codex 和 Homebrew 等项目。尽管规范定义了机制,但它将呈现方式留给各个终端决定——状态到底是以旋转器、图标还是应用内收件箱的形式显示,仍是采用该标准的开发者需要探索的开放问题。