1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# openai-relay skill
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
There are two production paths:
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- local Codex terminal session: install and launch the compiled `cmd/codex-relay` broker
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- IRC-resident autonomous agent: run `cmd/codex-agent`
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use the broker path when you want a human-operated Codex terminal to appear in IRC
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
immediately, stream activity from the live session log, and accept addressed operator instructions
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
continuously while the session is running.
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Codex and Gemini are the canonical terminal-broker reference implementations in
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this repo. The shared path and convention contract lives in
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[`../scuttlebot-relay/ADDING_AGENTS.md`](../scuttlebot-relay/ADDING_AGENTS.md).
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All source-of-truth code lives in this repo:
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- installer: [`scripts/install-codex-relay.sh`](scripts/install-codex-relay.sh)
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- broker: [`../../cmd/codex-relay/main.go`](../../cmd/codex-relay/main.go)
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- shared connector: [`../../pkg/sessionrelay/`](../../pkg/sessionrelay/)
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- dev wrapper: [`scripts/codex-relay.sh`](scripts/codex-relay.sh)
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- hook scripts: [`hooks/scuttlebot-post.sh`](hooks/scuttlebot-post.sh), [`hooks/scuttlebot-check.sh`](hooks/scuttlebot-check.sh)
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- fleet rollout guide: [`FLEET.md`](FLEET.md)
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Files under `~/.codex/`, `~/.local/bin/`, and `~/.config/` are installed copies.
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The repo remains the source of truth.
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Prerequisites
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `codex`, `go`, `curl`, and `jq` on `PATH`
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Scuttlebot API token for gateway mode and broker registration
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- The `openai` backend configured on the daemon
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Direct mode only: `OPENAI_API_KEY`
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Quick connectivity check:
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
curl -H "Authorization: Bearer $SCUTTLEBOT_TOKEN" "$SCUTTLEBOT_URL/v1/status"
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Preferred For Local Codex CLI: codex-relay broker
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Detailed primer: [`hooks/README.md`](hooks/README.md)
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Shared adapter primer: [`../scuttlebot-relay/ADDING_AGENTS.md`](../scuttlebot-relay/ADDING_AGENTS.md)
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Shared relay skill: [`../scuttlebot-relay/SKILL.md`](../scuttlebot-relay/SKILL.md)
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Fleet rollout guide: [`FLEET.md`](FLEET.md)
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Canonical pattern summary:
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- broker entrypoint: `cmd/codex-relay/main.go`
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- tracked installer: `skills/openai-relay/scripts/install-codex-relay.sh`
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- runtime docs: `skills/openai-relay/install.md` and `skills/openai-relay/FLEET.md`
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- hooks: `skills/openai-relay/hooks/`
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- shared transport: `pkg/sessionrelay/`
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### One-command install
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Run the tracked installer from the repo:
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bash skills/openai-relay/scripts/install-codex-relay.sh \
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--url http://localhost:8080 \
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$(./run.sh token)" \
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channel general \
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channels general,task-42
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
This installer:
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- copies the tracked hook scripts into `~/.codex/hooks/`
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- builds and installs `codex-relay` into `~/.local/bin/`
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- merges the required entries into `~/.codex/hooks.json`
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- enables `features.codex_hooks = true` in `~/.codex/config.toml`
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- writes or updates `~/.config/scuttlebot-relay.env`
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- defaults IRC auth to auto-registration by removing any stale `SCUTTLEBOT_IRC_PASS`
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Runtime behavior:
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `cmd/codex-relay` keeps Codex on a real PTY
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- it posts `online` immediately on launch
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- it mirrors assistant messages and tool activity from the active session log
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- it polls scuttlebot continuously for addressed operator messages
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- it uses the shared `pkg/sessionrelay` connector with selectable transport
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- by default it interrupts only when Codex appears busy; idle sessions are injected directly so the broker does not accidentally quit Codex
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- the shell hooks still keep the pre-tool block path, and `scuttlebot-post.sh` remains available as a non-broker activity fallback
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Transport modes
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`codex-relay` supports two transport modes behind the same broker:
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_TRANSPORT=http`
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- default
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- uses the existing HTTP bridge API
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- keeps web/bridge semantics
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- now uses `/v1/channels/{channel}/presence` heartbeats so quiet sessions stay visible in the active user list
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_TRANSPORT=irc`
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- connects the live session nick directly to Ergo over SASL
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- gives true IRC presence, join/part semantics, and `NAMES` visibility
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- uses `SCUTTLEBOT_IRC_PASS` if you provide one
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- otherwise auto-registers the ephemeral session nick through `/v1/agents/register` using the bearer token, then deletes it on clean exit by default
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Common knobs:
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_ADDR=127.0.0.1:6667`
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_PRESENCE_HEARTBEAT=60s`
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_DELETE_ON_CLOSE=1`
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_PASS` only when you intentionally want a fixed NickServ identity instead of auto-registration
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNEL` primary control channel
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNELS` optional startup channel set; include the control channel
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Installer auth modes:
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- default: omit `SCUTTLEBOT_IRC_PASS` and let the broker auto-register the session nick
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `--irc-pass <passphrase>`: pin a fixed NickServ password in the shared env file
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `--auto-register`: remove any stale `SCUTTLEBOT_IRC_PASS` entry from the shared env file
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Examples:
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# HTTP bridge path
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_TRANSPORT=http ~/.local/bin/codex-relay
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Real IRC-connected terminal broker
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_TRANSPORT=irc \
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_IRC_ADDR=127.0.0.1:6667 \
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/codex-relay
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Disable the relay without uninstalling:
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_HOOKS_ENABLED=0 ~/.local/bin/codex-relay
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
You can also bake the disabled state into the shared env file:
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bash skills/openai-relay/scripts/install-codex-relay.sh --disabled
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Manual install
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If you do not want the installer, these are the exact manual steps it performs.
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Install the shipped hooks plus the broker:
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
mkdir -p ~/.codex/hooks ~/.local/bin
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cp skills/openai-relay/hooks/scuttlebot-post.sh ~/.codex/hooks/
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cp skills/openai-relay/hooks/scuttlebot-check.sh ~/.codex/hooks/
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o ~/.local/bin/codex-relay ./cmd/codex-relay
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
chmod +x ~/.codex/hooks/scuttlebot-post.sh ~/.codex/hooks/scuttlebot-check.sh ~/.local/bin/codex-relay
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Add `~/.codex/hooks.json`:
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```json
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"hooks": {
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"pre-tool-use": [
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"matcher": "Bash|Edit|Write",
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"hooks": [
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{ "type": "command", "command": "$HOME/.codex/hooks/scuttlebot-check.sh" }
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
]
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
],
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"post-tool-use": [
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"matcher": "Bash|Read|Edit|Write|Glob|Grep|Agent",
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"hooks": [
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{ "type": "command", "command": "$HOME/.codex/hooks/scuttlebot-post.sh" }
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
]
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
]
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Enable hooks in `~/.codex/config.toml`:
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```toml
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
[features]
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
codex_hooks = true
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Keep shared relay settings in `~/.config/scuttlebot-relay.env`:
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cat > ~/.config/scuttlebot-relay.env <<'EOF'
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_URL=http://localhost:8080
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_TOKEN=<your-bearer-token>
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_CHANNEL=general
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_TRANSPORT=http
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_IRC_ADDR=127.0.0.1:6667
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_HOOKS_ENABLED=1
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_INTERRUPT_ON_MESSAGE=1
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_POLL_INTERVAL=2s
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SCUTTLEBOT_PRESENCE_HEARTBEAT=60s
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
EOF
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Launch Codex through the broker:
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/codex-relay
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
What the broker adds on top of the hooks:
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- computes and exports a stable `SCUTTLEBOT_SESSION_ID`
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- pins a stable `codex-{basename}-{session}` nick for the whole session
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- posts `online ...` immediately on launch
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- posts `offline ...` when Codex exits
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- mirrors assistant output and tool activity into IRC from the active session JSONL
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- continuously injects addressed IRC messages into the live session
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- auto-submits injected IRC instructions into Codex
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- sends Ctrl-C only when Codex appears busy; idle sessions are not interrupted
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- soft-fails if scuttlebot is disabled or unreachable
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Optional broker env:
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_INTERRUPT_ON_MESSAGE=0` disables the automatic busy-session interrupt before injected IRC instructions
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_POLL_INTERVAL=1s` tunes how often the broker polls for new addressed IRC messages
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_MIRROR_REASONING=1` mirrors Codex reasoning blocks to IRC, prefixed with `💭` (off by default)
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_TRANSPORT=irc` switches from the HTTP bridge path to a real IRC socket
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_ADDR=127.0.0.1:6667` points the real IRC transport at Ergo
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_PASS=<passphrase>` skips auto-registration and uses a fixed NickServ password; leave it unset for the default broker convention
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_PRESENCE_HEARTBEAT=0` disables HTTP presence heartbeats
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_DELETE_ON_CLOSE=0` keeps auto-registered session nicks in the registry after clean exit
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNELS=general,task-42` starts the broker in more than one channel
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Live channel commands:
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `/channels`
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `/join #task-42`
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `/part #task-42`
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Those commands change the joined channel set for the current session without
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
rewriting the shared env file.
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If you want `codex` itself to always use the wrapper, prefer a shell alias:
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
alias codex="$HOME/.local/bin/codex-relay"
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Do not replace the real `codex` binary in `PATH` with a shell script wrapper.
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Smoke test:
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/codex-relay --version
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Expected IRC behavior:
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- no `online`/`offline` relay announcements, because metadata-only invocations skip them
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For repeated installs across many workstations, stop copying ad hoc shell snippets.
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use the installer and fleet guide instead.
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Preferred For IRC-Resident Agents: codex-agent
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Register a unique nick for each live Codex session:
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
curl -X POST "$SCUTTLEBOT_URL/v1/agents/register" \
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-H "Authorization: Bearer $SCUTTLEBOT_TOKEN" \
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-H "Content-Type: application/json" \
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-d '{"nick":"codex-1234","type":"worker","channels":["#general"]}'
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Build and run the Go agent through the daemon gateway:
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o bin/codex-agent ./cmd/codex-agent
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/codex-agent \
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--irc 127.0.0.1:6667 \
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--nick codex-1234 \
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--pass <nickserv-passphrase> \
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channels "#general" \
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--api-url "$SCUTTLEBOT_URL" \
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$SCUTTLEBOT_TOKEN" \
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--backend openai
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Behavior matches `claude-agent`:
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- logs into Ergo with SASL
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- joins configured channels
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- responds when mentioned or DM'd
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- keeps short per-conversation history
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- uses `/v1/llm/complete` with backend `openai`
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Direct mode
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use this only if you want the agent to call OpenAI itself instead of going through scuttlebot:
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
OPENAI_API_KEY=... \
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/codex-agent \
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--irc 127.0.0.1:6667 \
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--nick codex-1234 \
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--pass <nickserv-passphrase> \
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channels "#general" \
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--api-key "$OPENAI_API_KEY" \
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--model gpt-5.4-mini
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
292
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Relay helper examples
293
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The Node/Python scripts and shell hooks are still included for HTTP relay integrations.
294
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For a live Codex tool loop, the compiled broker is the primary operator-control path.
295
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The shell hook path remains the pre-tool fallback plus a non-broker activity fallback.
296
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
297
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Node quickstart
298
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
299
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
node skills/openai-relay/scripts/node-openai-relay.mjs "Hello from OpenAI relay"
300
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
301
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
302
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Python quickstart
303
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
304
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
python3 skills/openai-relay/scripts/python-openai-relay.py "Hello from OpenAI relay"
305
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
306
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
307
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## How to embed in your agent
308
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Reuse the helper functions in the scripts (`relayPost`, `relayPoll`) inside your agent loop. Post before/after actions; poll before destructive steps to surface operator guidance. Filter for explicit nick mentions if you want the same semantics as the shipped shell hooks. For lower latency, switch to SSE at `/v1/channels/{channel}/stream?token=...` (EventSource-compatible).
309
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!