1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Adding Another Agent Runtime
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
This repo now has two reusable relay shapes:
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- terminal-session brokers in `cmd/claude-relay/`, `cmd/codex-relay/`, and `cmd/gemini-relay/`
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- IRC-resident agents in `pkg/ircagent/` with thin wrappers in `cmd/*-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!
Shared transport/runtime code now lives in `pkg/sessionrelay/`. Reuse that
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
before writing another relay client by hand.
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If you add another live terminal runtime, do not invent a new relay model.
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Codex and Gemini are the current reference implementations for the terminal
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
broker pattern, and Claude now follows the same layout. New runtimes should
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
match the same repo paths, naming, and environment contract so operators get
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
one consistent experience.
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Canonical terminal-broker layout
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For a local interactive runtime, follow this repo layout:
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```text
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cmd/{runtime}-relay/main.go
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
skills/{runtime}-relay/
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
install.md
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
FLEET.md
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
hooks/
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
README.md
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlebot-check.sh
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlebot-post.sh
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
...runtime-specific reply hooks if needed
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scripts/
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
install-{runtime}-relay.sh
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pkg/sessionrelay/
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Conventions:
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `cmd/{runtime}-relay/main.go` is the broker entrypoint
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `skills/{runtime}-relay/install.md` is the human install primer
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `skills/{runtime}-relay/FLEET.md` is the rollout and operations guide
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `skills/{runtime}-relay/hooks/README.md` documents the runtime-specific hook contract
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `skills/{runtime}-relay/scripts/install-{runtime}-relay.sh` is the tracked installer
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- installed files under `~/.{runtime}/`, `~/.local/bin/`, and `~/.config/` are copies, not the source of truth
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use `pkg/sessionrelay/` for channel send/receive/presence in both `http` and
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`irc` modes. Use `pkg/ircagent/` only when the process itself should be a
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
persistent IRC-resident bot.
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## The contract
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Every runtime adapter must support two flows:
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. Activity out
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- during live work, mirror meaningful tool/action activity back to scuttlebot
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- if the runtime exposes assistant progress or reply text, mirror that too
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- use a stable session nick
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. Instruction back in
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- continuously or before the next action, fetch recent messages from scuttlebot
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- filter to explicit operator instructions for this session
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- surface the instruction back into the runtime using that runtime's native hook/block mechanism
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If a runtime cannot surface a blocking instruction before the next action, it does
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
not yet have parity with the Claude/Codex hook path.
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For runtimes that are live interactive terminal sessions, ship a small broker or
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
launcher wrapper that:
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- exports a stable session id before the runtime starts
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- derives and exports the session nick once
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- posts `online` immediately on startup
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- mirrors activity from the runtime's own event/session log or PTY stream
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- posts `offline` on exit
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- soft-fails if scuttlebot is disabled or unreachable
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Hooks remain useful for pre-action fallback and for runtimes that do not have a
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
broker yet, but hook-only telemetry is not the production pattern for
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
interactive sessions.
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If the runtime needs the same channel send/receive/presence semantics as
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`codex-relay`, start from `pkg/sessionrelay`:
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `TransportHTTP` for the bridge/API path
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `TransportIRC` for true SASL IRC presence with optional auto-registration via `/v1/agents/register`
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Canonical terminal-broker conventions
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Every terminal broker should follow these conventions:
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- one stable nick per live session: `{runtime}-{basename}-{session}`
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- one shared env contract using `SCUTTLEBOT_*`
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- installer default is auto-registration: leave `SCUTTLEBOT_IRC_PASS` unset and remove stale fixed-pass values unless the operator explicitly requests a fixed identity
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- one primary control channel plus optional joined work channels
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- one broker process owning `online` / `offline`
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- one broker process owning continuous addressed operator input injection
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- one broker process owning outbound activity and assistant-message mirroring when the runtime exposes a reliable event/session stream
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- hooks used for pre-action fallback and for runtime-specific gaps such as post-tool summaries or final reply hooks
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- support both `SCUTTLEBOT_TRANSPORT=http` and `SCUTTLEBOT_TRANSPORT=irc` behind the same broker contract
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- soft-fail when scuttlebot is disabled or unavailable so the underlying runtime still starts
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Required environment contract
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All adapters should use the same environment variables:
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_URL`
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_TOKEN`
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNEL`
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNELS`
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_TRANSPORT`
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Optional:
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_NICK`
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_SESSION_ID`
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_ADDR`
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_PASS`
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_IRC_DELETE_ON_CLOSE`
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_HOOKS_ENABLED`
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_INTERRUPT_ON_MESSAGE`
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_POLL_INTERVAL`
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_PRESENCE_HEARTBEAT`
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNEL_STATE_FILE`
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Do not hardcode tokens into repo scripts.
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For terminal-session brokers, treat `SCUTTLEBOT_IRC_PASS` as an explicit
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
fixed-identity override, not a default.
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Channel semantics:
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNEL` is the primary control channel
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNELS` is the startup channel set and should include the control channel
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- runtime `/join`, `/part`, and `/channels` commands may change the live channel set for one session without rewriting the shared env file
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Nicking rules
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use a stable, human-addressable session nick.
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Requirements:
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- deterministic for the life of the session
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- unique across parallel sessions
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- short enough to mention in chat
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- obvious which runtime it belongs to
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Recommended patterns:
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Claude: `claude-{basename}-{session_id[:8]}`
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Codex: `codex-{basename}-{session_suffix}`
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Future runtime: `{runtime}-{basename}-{session}`
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If the runtime already exposes a stable session id, prefer that over `PPID`.
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Filtering rules
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Your inbound check must only surface messages that are:
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- newer than the last check for this session
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- not from this session nick
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- not from known service bots
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- not from agent status nicks like `claude-*`, `codex-*`, or `gemini-*`
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- explicitly mentioning this session nick
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Ambient channel chat must not block the tool loop.
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## State scoping
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Do not use one global timestamp file.
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Track last-seen state by a key derived from:
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- nick
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- working directory
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
That prevents parallel sessions from consuming each other's instructions while
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
still allowing one session to join or part channels without losing its check
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
state.
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## HTTP API contract
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All adapters use the same scuttlebot HTTP API:
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Post activity:
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```http
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
POST /v1/channels/{channel}/messages
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Authorization: Bearer <token>
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Content-Type: application/json
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"nick":"runtime-session","text":"read internal/api/ui/index.html"}
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Read recent messages:
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```http
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GET /v1/channels/{channel}/messages
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Authorization: Bearer <token>
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Optional lower-latency path:
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```http
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GET /v1/channels/{channel}/stream?token=<token>
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Accept: text/event-stream
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!
## Runtime integration points
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For each new agent runtime, identify the equivalents of:
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- post-action hook
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- pre-action hook
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- session-start / session-stop wrapper
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- blocking/instruction surfacing mechanism
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Examples:
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Claude Code: `PostToolUse` and `PreToolUse`
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Codex: `post-tool-use` and `pre-tool-use`
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If the runtime has no native pre-action interception point, you need an explicit
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
poll call inside its step loop. Document that clearly as weaker than the hook path.
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If the runtime has no native startup hook, use the launcher wrapper for `online`
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
and `offline` presence instead of trying to fake it inside the action hooks.
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If the runtime is an interactive terminal application and you want operators to
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
talk to the live session mid-work, prefer a PTY/session broker over hook-only
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
delivery. The broker should own:
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- session presence (`online` / `offline`)
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- continuous operator input injection
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- outbound activity mirroring
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Hooks are still useful for pre-action fallback and runtimes without richer
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
integration points, but they do not replace continuous stdin injection or
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
broker-owned activity streaming.
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Reference implementation checklist
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When adding a new runtime, ship all of the following in the repo:
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. Hook or relay scripts
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. A launcher wrapper or broker if the runtime needs startup/offline presence
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. A tracked installer or bootstrap command for local setup
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. A runtime-specific install primer
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5. A smoke-test recipe
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
6. Default nick format documentation
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7. Operator usage examples
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
8. An explanation of what blocks and what stays ambient
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Minimal algorithm
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pseudocode:
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```text
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
broker loop:
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
post online presence on startup
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
tail runtime events / session log / PTY output
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
summarize tool activity and assistant progress in one line
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
POST them to /v1/channels/{channel}/messages as this session nick
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
on pre-action:
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GET recent channel messages
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
discard bot traffic, status nicks, self messages, and old messages
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
keep only lines explicitly mentioning this session nick
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if any remain:
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
surface the most recent one through the runtime's block/intercept mechanism
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
on exit:
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
POST offline presence
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Smoke test requirements
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Every new adapter should be verifiable with the same basic test:
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. launch the runtime or broker and confirm `online` appears in the channel
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. trigger one harmless tool/action step and confirm the mirrored activity appears
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. send an operator message mentioning the session nick
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. confirm the runtime surfaces it immediately or at the next action boundary
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5. confirm `offline` appears when the session exits
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If you cannot do that, the adapter is not finished.
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Where to put new adapters
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Recommended layout:
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```text
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cmd/{runtime}-relay/
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
skills/{runtime}-relay/
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
FLEET.md
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
hooks/
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
README.md
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlebot-post.*
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scuttlebot-check.*
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
...runtime-specific reply hooks
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
scripts/
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
install-{runtime}-relay.*
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{runtime}-relay.*
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
install.md
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Keep the hook scripts in the repo. Home-directory installs are copies, not the
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source of truth.
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!