在 Mac 上接收 Codex 审批提醒和任务完成提醒。
Codex 可以在完成工作或等待你批准时提醒你,但 notify 设置只负责完成通知。本指南说明 Mac 上各项 Codex 提醒设置的作用,所附代码片段已对照 OpenAI 文档核查。
Codex 的 notify 设置只会在一轮任务完成时运行你指定的程序,不会在请求批准时运行(截至 2026 年 10 月)。如需审批提醒,可以使用 Codex 内置的终端通知([tui] notifications,默认在终端处于后台时触发,只有部分终端会显示横幅),或在 ~/.codex/hooks.json 中添加 PermissionRequest 钩子。如果使用 ChatGPT 桌面应用,请在 Settings > Notifications 中开启权限通知。
了解各项 Codex 设置的作用。
Codex 可以通过以下四种方式在 Mac 上提醒你。一轮任务指的是这样一个过程:你发送消息,Codex 开始工作,随后停下来等待你回应。钩子是 Codex 在指定时机运行的命令,例如在请求你批准之前运行。
| 设置项 | 设置位置 | 一轮任务完成 | 需要批准 | 注意事项 |
|---|---|---|---|---|
notify | ~/.codex/config.toml | 是 | 否 | 配置后才会启用。运行一个由你指定的程序。 |
[tui] notifications | ~/.codex/config.toml | 是 | 是 | 默认开启。终端不在前台时触发。只有支持横幅的终端才会显示横幅。 |
钩子(Stop、PermissionRequest) | ~/.codex/hooks.json | 是 | 是 | 默认开启。每个新钩子都必须先在 /hooks 中设为信任,才能运行。 |
| ChatGPT 桌面应用 | Settings > Notifications | 是 | 是 | 一轮任务完成、权限请求和提问的提醒各有独立开关。 |
一个常见误解是:设置了 notify,就会收到审批提醒,结果却一直等不到。OpenAI 的配置文档说明,目前只有 agent-turn-complete 会触发 notify。如需审批提醒,请使用表中另外三种方式之一。
先试试 Codex 内置的提醒。
Codex 的终端通知默认开启,你可能已经收到过。只有终端(运行 Codex 的应用,例如 Terminal 或 iTerm2)不在前台时,通知才会触发。如果想自行选择哪些事件触发通知,可以在配置文件中设置。
将以下内容添加到 ~/.codex/config.toml。如果文件中已有 [tui] 配置节,请把这些键放在该节下,不要再添加一个 [tui] 节标题。注释中的终端列表来自 Codex 源代码,并非其文档(见下文)。
[tui]
notifications = ["agent-turn-complete", "approval-requested"]
notification_method = "auto" # osc9 in iTerm2/Ghostty/Kitty/Warp/WezTerm; bel elsewhere
notification_condition = "unfocused" # or "always"
将 notification_method 设为 auto 后,Codex 会自行选择提醒方式:osc9 发送一段特殊代码(转义序列),部分终端会将其转换为桌面通知;bel 则触发终端响铃。如果希望在查看终端时也收到提醒,请将 notification_condition 设为 "always"。
为什么 Terminal 只响铃。
OpenAI 文档没有列出哪些终端会显示横幅。根据 Codex 的公开源代码,它会向 Ghostty、iTerm2、Kitty、Warp 和 WezTerm 发送横幅序列,向其他所有终端发送普通响铃信号,包括 macOS 自带的 Terminal 应用。这一行为可能随源代码更新而改变。单靠响铃不会显示横幅。在 Terminal 中,Settings > Profiles > Advanced > Bell 提供视觉响铃、程序坞标记,以及窗口处于后台时让程序坞图标跳动的选项。如需在 Terminal 中显示真正的通知横幅,请使用下文的钩子。
在 tmux 中,只有开启 allow-passthrough,Codex 的横幅序列才能传出:设为 on 时,仅允许可见窗格传出;设为 all 时,隐藏窗格也可以传出(依据 tmux 手册)。将以下一行添加到 ~/.tmux.conf;如果也想收到隐藏窗格的提醒,请将 on 改为 all:
set -g allow-passthrough on
用 notify 在一轮任务完成时显示 Mac 通知横幅。
notify 会在一轮任务完成时运行一个程序,并通过一个 JSON 参数将详情传给它。在任何终端中,它的工作方式都相同。OpenAI 的示例使用 terminal-notifier,这是一个通过 Homebrew 安装的第三方工具,并非 macOS 自带。下面的脚本只使用 macOS 自带的功能:显示 Codex 最后一条回复的开头和项目文件夹,并播放 Glass 提示音。
第 1 步:将以下内容保存为新文件 ~/.codex/notify-macos.js:
// Codex notify -> macOS banner + sound. Codex appends one JSON argument.
function run(argv) {
var n = {};
try { n = JSON.parse(argv[argv.length - 1] || "{}"); } catch (e) {}
if (n.type && n.type !== "agent-turn-complete") return;
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var msg = String(n["last-assistant-message"] || "Turn complete").slice(0, 180);
var folder = String(n.cwd || "").split("/").pop();
app.displayNotification(msg, { withTitle: "Codex finished", subtitle: folder, soundName: "Glass" });
}
第 2 步:将以下一行添加到现有的 ~/.codex/config.toml 中,放在第一个 [section] 节标题之前。将 YOUR_NAME 替换为你的个人文件夹名称。Codex 会按原样执行这个列表,因此不会展开 ~(这一点依据 Codex 源代码,并非其文档)。
notify = ["/usr/bin/osascript", "-l", "JavaScript", "/Users/YOUR_NAME/.codex/notify-macos.js"]
以下三种情况会导致 notify 无法正常工作:
- 添加了第二行
notify。一个配置文件只能有一项,重复的键会导致文件无法加载。如果其他工具已经在使用它,可以让它指向一个同时运行两个程序的小脚本,也可以改用Stop钩子,因为各个文件中的钩子可以并行运行。 - 放错了位置。如果把这一行粘贴到文件末尾,放在某个
[section]节标题下,它就会归入该配置节,Codex 不会将其作为notify设置读取。 - 写进了项目配置。Codex 会忽略项目自身
.codex/config.toml中的notify。它只在~/.codex/config.toml中生效。
如果没有出现横幅,请打开“系统设置”>“通知”。Anthropic 的钩子指南指出,通过 osascript 发送的横幅会在此处列于 Script Editor 名下,你需要为它允许通知,而且 macOS 不会事先询问你。你的 Mac 上显示的名称可能有所不同。
用 Codex 钩子显示审批横幅。
钩子可以让你在任何终端中收到真正的审批横幅,包括 Terminal。Codex 会在请求你批准某项操作之前运行 PermissionRequest 钩子,在一轮任务完成时运行 Stop 钩子。不需要批准的命令不会触发 PermissionRequest。
将以下内容合并到 ~/.codex/hooks.json 中。如果文件已存在,不要覆盖它,其他工具可能在里面保存了自己的条目(在 Cowork Island 中开启 Codex 后,它也会这样做)。将下方各条目添加到 "hooks" 内对应的列表中;如果列表不存在,就创建一个。每个条目都要保留各自的花括号。
{
"hooks": {
"PermissionRequest": [
{ "hooks": [ { "type": "command", "async": true, "timeout": 10,
"command": "/usr/bin/osascript -e 'display notification \"Codex needs your approval\" with title \"Codex\" sound name \"Funk\"' >/dev/null 2>&1" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command", "async": true, "timeout": 10,
"command": "/usr/bin/osascript -e 'display notification \"Codex finished\" with title \"Codex\" sound name \"Glass\"' >/dev/null 2>&1" } ] }
]
}
}
- 保存文件,打开 Codex,然后输入
/hooks。 - 将两个新条目都设为信任。对于新增或修改过的钩子,Codex 会在你设为信任之前跳过它们,因此未受信任的钩子看起来会像是失效了。
- 保留末尾的
>/dev/null 2>&1:Stop钩子必须输出 JSON,或不输出任何内容。
如果想改用语音播报或手机提醒,通知配置生成器可以在浏览器中生成条目,并告诉你应将它放入哪个文件。
在 ChatGPT 桌面应用中使用 Codex。
自 2026 年 7 月 9 日起,Codex 应用已成为 macOS 版 ChatGPT 桌面应用的一部分。它的提醒需要在应用中设置,不在配置文件中:
- Settings > Notifications(Cmd+,):一轮任务完成提醒可设为从不显示、仅在 ChatGPT 处于后台时显示,或始终显示。权限通知和提问通知各有独立开关。
- Sound:任务完成、权限请求和提问共用一种通知提示音。可选择 Default、Classic 或 None;在 macOS 上,也可以使用系统提示音或导入的音频文件。
- Activity:在提供此功能的版本中,点按侧边栏的铃铛,或按 Cmd+Option+U,即可查看未读、正在运行或等待你回应的对话列表。
上面的 [tui] 配置键适用于在终端中运行的 Codex。OpenAI 文档没有说明桌面应用中的对话是否会运行 notify 或你自己的钩子,因此不要依赖它们来提醒你。
也可以选择免配置方案。
Cowork Island 是一款适用于 macOS 14 或更高版本的应用,它把受支持工具中的 AI 智能体会话汇集在刘海下方的面板中,显示每个会话的状态。你可以看清哪些 Codex 或 Claude Code 会话正在运行,哪些「需要你处理」,并在同一个视图中看到提醒。
Codex 在你开启之前保持关闭。你需要先在「设置」中开启它,再在 Codex 中允许 Cowork Island 的钩子,这一步与上文的信任操作类似。完成后,每个 Codex 会话都会显示状态。默认情况下,某个会话需要你处理时,小岛会自动展开;但如果该会话的终端已在前台,就不会展开。对于 ChatGPT 应用中的 Codex 对话,ChatGPT 已在前台时也一样。你可以在「设置」中关闭「收到提问时」。会话完成后,小岛默认展开 5 秒。ChatGPT 应用中的 Codex 也会显示「需要你处理」,你在 ChatGPT 中回答。对于受支持的 Claude Code 请求,你可以在小岛上允许或拒绝某项操作,或回答选择题。对于其他工具,你可能需要在各自的应用或终端中作出回应。
Cowork Island 不会发送 macOS 通知,而是让小岛本身展开。提示音在你开启之前保持关闭;「需要审批」提示音免费提供,「会话完成」提示音属于 Pro 功能。它不使用 Codex 的 notify 设置,因此你现有的 notify 脚本可以继续工作。它会将自己的条目添加到 ~/.codex/hooks.json 中,与你的条目并存。像上面的代码片段一样,让你的钩子各自保留在独立条目中,并存放在它的 ~/.perch 文件夹之外,它就会保留这些钩子。
免费版一次显示一张会话卡片。Pro 会显示你的所有会话,让你能跳转回这些会话,并增加详细用量条、完成提示音和更多角色选项。7 天 Pro 试用会自动开始,每台 Mac 仅限一次,无需填写支付信息。查看方案和安装指南。
免费下载参考来源。
- OpenAI:高级配置
- OpenAI:配置参考
- OpenAI:配置示例
- OpenAI:钩子
- OpenAI:通知
- OpenAI:设置参考
- OpenAI:更新日志
- openai/codex 源代码(仅用于核查终端列表)
- Apple:Terminal 描述文件的高级设置
- Apple:显示通知
- tmux 手册
- Anthropic:Claude Code 钩子指南(Script Editor)
来源核查日期:2026年10月18日。本指南由 Cowork Island 的作者编写。如需指正内容,请发邮件至 support@coworkisland.com,或在 GitHub 上提交 Issue。