# Codex Setup

Codex hook 事件建议映射：

| Codex event | Signal |
| --- | --- |
| `SessionStart` | `session_start` |
| `UserPromptSubmit` | `thinking` |
| `PreToolUse` | `working` |
| `PostToolUse` | `tool_done` |
| `PermissionRequest` | `permission_request` |
| `Stop` | `done` |

普通 `Stop` 表示成功完成，会进入短暂的绿色 completed。Codex 当前公开 hook 事件不包含 `SessionEnd`，所以 Codex 侧完成态主要依赖 `Stop`；内部 CLI 和 Claude Code adapter 仍支持 `session_end`。若当前 session 已经是 `permission`、`blocked` 或 `attention`，这个完成事件只会写入最近事件，不会覆盖仍需处理的提示。如果 hook payload 中包含 `error`、`failure`、`exception`、非零 `exit_status` 等结构化失败字段，会映射为 `blocked`。

事件名会做容错归一化，`PreToolUse`、`pre_tool_use`、`pre-tool-use` 和 `pre tool use` 都会映射到同一个 signal。
常见 payload 字段名也会容错归一化，例如 `session_id` / `sessionId`、`hook_event_name` / `hookEventName`、`exit_status` / `exitStatus`。

## Codex Desktop

Codex Desktop 不需要手动安装 hook 也可以被 Agent Signal Bar 监控。Codex Desktop 当前线程可能不会执行 `.codex/hooks.json`，所以 Agent Signal Bar 内置了一个本地 Codex Desktop 监控器。它会读取 `~/.codex/sessions/**/*.jsonl` 中的本机事件：

| Codex Desktop session event | Signal |
| --- | --- |
| `reasoning` | `thinking` |
| `function_call` / `custom_tool_call` | `working` |
| `function_call_output` | `tool_done` |
| `task_complete` / `final_answer` | `done` |

这个监控只读本地 Codex session 文件，不上传数据。可以在 App 设置的 `通用` > `Agent 来源` 里用「监控 Codex Desktop」开关打开或关闭。普通浏览器使用不会触发 Agent Signal Bar；只有 Codex 任务本身在思考、调用工具或写入本地 session 日志时才会触发。

## Recommended Install

先安装 release 版 CLI，避免 hook 第一次触发时临时编译：

```bash
./script/install_cli.sh
```

Codex CLI/TUI 仍推荐项目级 hook，也就是当前仓库里的 `.codex/hooks.json`。先预览，再写入：

```bash
./script/install_hooks.py --target codex --codex-scope project --dry-run
./script/install_hooks.py --target codex --codex-scope project --install
```

如果你不是在项目 checkout 里运行，而是只想给独立安装包提供用户级退回配置，可以使用：

```bash
./script/install_hooks.py --target codex --codex-scope user --install
```

不建议同时启用项目级和用户级同一套 Agent Signal Bar hook；Codex 可能会对同一个事件执行两次，导致状态文件出现重复事件。

安装脚本会保留已有 JSON 字段，只追加缺失的 Agent Signal Bar hook block，并在写入已有文件前生成 `hooks.json.bak-YYYYmmddHHMMSS` 备份。如果发现旧路径的 `codex-signal-hook`，会迁移到当前 checkout 或当前 app bundle 的 wrapper 路径，避免同一个事件重复触发多个 Agent Signal Bar hook。项目级 `.codex/hooks.json` 含有本机路径，默认被 `.gitignore` 忽略。

## Manual Shape

通常不需要手写 JSON。若要手动配置，command 中的 wrapper 路径必须 shell-safe；路径含空格时要用单引号包住：

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "'/path/to/AgentSignalLight/scripts/codex-signal-hook' PreToolUse",
            "timeout": 5
          }
        ],
        "matcher": ""
      }
    ],
    "PermissionRequest": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "'/path/to/AgentSignalLight/scripts/codex-signal-hook' PermissionRequest",
            "timeout": 10
          }
        ],
        "matcher": ""
      }
    ]
  }
}
```

完整事件列表以 `./script/install_hooks.py --target codex --codex-scope project --dry-run` 输出为准。
