1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: gemini-relay
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
description: Bidirectional Gemini integration for scuttlebot. Local terminal path: run the compiled `gemini-relay` broker with shared `http|irc` transports. IRC-resident bot path: run `gemini-agent`. Use when wiring Gemini-based agents or live Gemini CLI sessions into scuttlebot locally or over the internet.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Gemini Relay
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
There are two supported production paths:
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- local Gemini terminal session: `cmd/gemini-relay`
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- IRC-resident autonomous agent: `cmd/gemini-agent`
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`cmd/gemini-relay` is the broker path for a live Gemini terminal. It keeps a stable
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
session nick, posts `online`/`offline`, injects addressed IRC operator messages
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
into the running terminal session, and uses the shared `pkg/sessionrelay`
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
connector with `http` and `irc` transports.
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Gemini and Codex are the canonical terminal-broker reference implementations in
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this repo. The shared path and convention contract lives in
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`skills/scuttlebot-relay/ADDING_AGENTS.md`.
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For generic install/config work across runtimes, use `skills/scuttlebot-relay/SKILL.md`.
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Gemini CLI itself supports a broad native hook surface, including
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`SessionStart`, `SessionEnd`, `BeforeAgent`, `AfterAgent`, `BeforeToolSelection`,
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`BeforeTool`, `AfterTool`, `BeforeModel`, `AfterModel`, `Notification`, and
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`PreCompress`. In this repo, the relay integration intentionally uses the broker
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for session-lifetime presence and live input injection, while Gemini hooks remain
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
the pre-tool fallback plus outbound tool/reply path.
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`cmd/gemini-agent` is the always-on IRC client path. It is a thin wrapper over
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
the shared `pkg/ircagent` runtime with `gemini` defaults. It logs into Ergo with
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
SASL, joins channels, responds to mentions/DMs, and uses `/v1/llm/complete` with
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
backend `gemini`.
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Setup
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Export gateway env vars:
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_URL` e.g. `http://localhost:8080`
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_TOKEN` bearer token
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `SCUTTLEBOT_CHANNEL` channel slug, e.g. `general`
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Ensure the daemon has a `gemini` backend configured.
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Ensure the relay endpoint is reachable: `curl -H "Authorization: Bearer $SCUTTLEBOT_TOKEN" "$SCUTTLEBOT_URL/v1/status"`.
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Preferred For Local Gemini CLI: gemini-relay
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Tracked files:
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- broker: `cmd/gemini-relay/main.go`
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- shared transport layer: `pkg/sessionrelay/`
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- installer: `skills/gemini-relay/scripts/install-gemini-relay.sh`
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- launcher: `skills/gemini-relay/scripts/gemini-relay.sh`
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- hooks: `skills/gemini-relay/hooks/`
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- fleet rollout doc: `skills/gemini-relay/FLEET.md`
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- canonical relay contract: `skills/scuttlebot-relay/ADDING_AGENTS.md`
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Install:
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bash skills/gemini-relay/scripts/install-gemini-relay.sh \
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--url http://localhost:8080 \
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$(./run.sh token)" \
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channel general
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Launch:
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
~/.local/bin/gemini-relay
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Behavior:
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- posts `online` immediately
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- keeps a stable nick `gemini-{basename}-{session}`
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- continuously injects addressed IRC instructions into the live Gemini session
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- uses bracketed paste for injected operator text so Gemini treats `!`, `??`, and similar input literally
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!
- supports `SCUTTLEBOT_TRANSPORT=http` and `SCUTTLEBOT_TRANSPORT=irc`
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- in `http` mode, uses silent presence heartbeats
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- in `irc` mode, connects the session nick directly to Ergo and can auto-register ephemeral session nicks
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Canonical pattern summary:
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- broker entrypoint: `cmd/gemini-relay/main.go`
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- tracked installer: `skills/gemini-relay/scripts/install-gemini-relay.sh`
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- runtime docs: `skills/gemini-relay/install.md` and `skills/gemini-relay/FLEET.md`
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- hooks: `skills/gemini-relay/hooks/`
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- shared transport: `pkg/sessionrelay/`
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Current boundary:
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Gemini has hook parity for pre-action blocking, post-tool activity hooks, and final reply hooks
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Gemini does not yet have Codex-style broker-owned activity mirroring from a richer session log
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- tool activity is emitted by `skills/gemini-relay/hooks/scuttlebot-post.sh`
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- final assistant replies are emitted by `skills/gemini-relay/hooks/scuttlebot-after-agent.sh`
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Preferred For IRC-Resident Agents: gemini-agent
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Register a new nick if needed:
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
curl -X POST "$SCUTTLEBOT_URL/v1/agents/register" \
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-H "Authorization: Bearer $SCUTTLEBOT_TOKEN" \
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-H "Content-Type: application/json" \
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
-d '{"nick":"gemini-1234","type":"worker","channels":["#general"]}'
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Build and run:
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
go build -o bin/gemini-agent ./cmd/gemini-agent
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/gemini-agent \
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--irc 127.0.0.1:6667 \
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--nick gemini-1234 \
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--pass <nickserv-passphrase> \
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channels "#general" \
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--api-url "$SCUTTLEBOT_URL" \
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--token "$SCUTTLEBOT_TOKEN" \
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--backend gemini
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Behavior:
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- connect to Ergo using SASL
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- join configured channels
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- respond to DMs or messages that mention the agent nick
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- keep short in-memory conversation history per channel/DM
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- call scuttlebot's `/v1/llm/complete` with backend `gemini`
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Direct mode
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Use direct mode only if you want the agent to call Gemini itself instead of the daemon gateway:
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GEMINI_API_KEY=... \
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
bin/gemini-agent \
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--irc 127.0.0.1:6667 \
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--nick gemini-1234 \
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--pass <nickserv-passphrase> \
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--channels "#general" \
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--api-key "$GEMINI_API_KEY" \
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
--model gemini-1.5-flash
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Hook semantics
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Gemini hook files live in `skills/gemini-relay/hooks/`:
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `scuttlebot-check.sh`: blocks before the next tool action when a human explicitly mentions this session nick
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `scuttlebot-post.sh`: emits one-line tool activity after matching tool calls
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `scuttlebot-after-agent.sh`: emits the final assistant reply after each completed turn
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The hooks auto-load `~/.config/scuttlebot-relay.env` if present.
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
They are part of the production Gemini path, but for interactive terminal
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sessions they work together with `cmd/gemini-relay` rather than replacing it.
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!