@oddessentials/agent-guild 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -391
- package/package.json +1 -1
- package/web/app.js +34 -1
- package/web/index.html +1 -1
- package/web/styles.css +11 -0
package/README.md
CHANGED
|
@@ -11,13 +11,12 @@
|
|
|
11
11
|
<a href="https://www.youtube.com/watch?v=ziT62WtXQ1M"><img src="https://img.shields.io/badge/trailer-watch%20on%20YouTube-e5534b?logo=youtube&logoColor=white" alt="Watch the Agent Guild trailer on YouTube"></a>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
|
-
**Agent Guild** runs Claude Code, Codex CLI, Antigravity CLI, Grok Build and
|
|
15
|
-
own shell side by side, in real terminals, from one local web page.
|
|
16
|
-
|
|
17
|
-
which helper agents it has summoned. Close the page whenever you like; the
|
|
18
|
-
sessions keep working.
|
|
14
|
+
**Agent Guild** runs Claude Code, Codex CLI, Antigravity CLI, Grok Build and
|
|
15
|
+
your own shell side by side, in real terminals, from one local web page.
|
|
16
|
+
Close the page whenever you like; the sessions keep running.
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
[Try the demo](https://oddessentials.github.io/agent-guild/) in your browser
|
|
19
|
+
(simulated, nothing installed) or [watch the trailer](https://www.youtube.com/watch?v=ziT62WtXQ1M).
|
|
21
20
|
|
|
22
21
|
<picture>
|
|
23
22
|
<source media="(prefers-color-scheme: light)" srcset="docs/images/overview-light.webp">
|
|
@@ -31,409 +30,146 @@ npm install -g @oddessentials/agent-guild
|
|
|
31
30
|
agent-guild
|
|
32
31
|
```
|
|
33
32
|
|
|
34
|
-
The page opens in your browser.
|
|
35
|
-
in
|
|
33
|
+
The page opens in your browser. Press **New** on a tool's card to start a
|
|
34
|
+
session. Sign in to each tool inside its first session, as you would in any
|
|
35
|
+
terminal.
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
| Requirement | |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| Node.js | 22 or newer |
|
|
40
|
+
| Windows | 10 version 1809 or later, x64 or arm64. No WSL needed. |
|
|
41
|
+
| macOS | 11 or later, Intel or Apple silicon |
|
|
42
|
+
| Linux | x64 or arm64, with a desktop or over SSH |
|
|
40
43
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
Agent Guild installs the tools for you but never handles your sign-in. No
|
|
44
|
-
compiler and no WSL are needed.
|
|
44
|
+
No compiler is needed. A missing tool shows **Install** on its card;
|
|
45
|
+
Antigravity CLI, which is not on npm, shows its install command instead.
|
|
45
46
|
|
|
46
|
-
##
|
|
47
|
+
## Setup
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
Grok Build and a plain shell each get a card. A tool that is missing shows
|
|
50
|
-
**Install**, which runs the install in a session you can watch, or the
|
|
51
|
-
vendor's install command for a tool not published on npm. An installed
|
|
52
|
-
tool shows its version and offers **Update** when a newer one is out, using
|
|
53
|
-
the same installer that put it there: npm, Homebrew, WinGet or the vendor's
|
|
54
|
-
own. The cloud icon on each card opens the vendor's web app.
|
|
55
|
-
|
|
56
|
-
**Real terminals that outlive the page.** Every session is a full interactive
|
|
57
|
-
terminal: type instructions, answer prompts, watch output. Run as many as you
|
|
58
|
-
like. A local session manager owns them, so you can close or reload the page
|
|
59
|
-
and come back to the same screens. Drag a session card by its grip, with a
|
|
60
|
-
mouse or a finger, to put the cards in the order you want; this browser
|
|
61
|
-
remembers it, and new sessions join at the end.
|
|
62
|
-
|
|
63
|
-
**Two terminals at once.** **Split** in the terminal's header, or Ctrl+click
|
|
64
|
-
(⌘-click on a Mac) on a card's **Open**, shows a second session beside the
|
|
65
|
-
first, or above it on a tall, narrow window. Click a terminal to work in it;
|
|
66
|
-
drag the divider, or focus it and use the arrow keys, to resize them. The
|
|
67
|
-
session name in the header switches the focused terminal to another session.
|
|
68
|
-
On a phone one terminal shows at a time, with a button to switch to the
|
|
69
|
-
other. This browser reopens the terminals you had open after a reload.
|
|
70
|
-
|
|
71
|
-
On phones and tablets, a strip below the terminal provides **← ↑ ↓ → Enter
|
|
72
|
-
Esc**. Tap once to move through a prompt, confirm a choice or send Escape.
|
|
73
|
-
The keys act on the focused terminal and leave the on-screen keyboard as
|
|
74
|
-
it is. They are disabled while the terminal reconnects or after it exits;
|
|
75
|
-
taps made while disconnected are never replayed.
|
|
76
|
-
|
|
77
|
-
On a touchscreen, **Copy…** opens a still copy of the terminal text. Touch and
|
|
78
|
-
hold to select, then use **Copy selection** or the browser's Copy menu. **Done**
|
|
79
|
-
returns to the live terminal; the session keeps running while you copy. The
|
|
80
|
-
view includes retained scrollback, or the current screen of a full-screen tool.
|
|
81
|
-
|
|
82
|
-
**Pick your shell.** The Shell card offers the shells installed on your
|
|
83
|
-
computer and remembers your choice in this browser. On Windows it defaults
|
|
84
|
-
to PowerShell 7 when installed, then Windows PowerShell; Git Bash and Command
|
|
85
|
-
Prompt are also offered when found. On macOS and Linux it follows your login
|
|
86
|
-
shell. Pick the default chip to clear a saved choice and follow the default
|
|
87
|
-
again. The choice applies to new sessions.
|
|
88
|
-
|
|
89
|
-
**See the manager environment.** The Shell card summarizes detected Node.js,
|
|
90
|
-
Python, Go, .NET SDK, R and Rust versions. **Environment details** opens on
|
|
91
|
-
the manager result: resolved paths, detection results, .NET runtimes and
|
|
92
|
-
detected nvm/NVM for Windows, vfox, uv and pnpm launchers. Tools are listed
|
|
93
|
-
by presence; their activation is not inferred. The same dialog can show three
|
|
94
|
-
other facts, each refreshed on its own: pin files in the working folder
|
|
95
|
-
(configured text, not an installed version), the PATH a Guild session was
|
|
96
|
-
given when it started, and the PATH a new process receives before the shell
|
|
97
|
-
runs its startup files. tmux and herdr sessions have no spawn record to show.
|
|
98
|
-
The card itself stays the manager summary. This describes the computer running
|
|
99
|
-
Agent Guild, including when viewed remotely.
|
|
100
|
-
|
|
101
|
-
Python always uses `python` when it is found on the manager's PATH; otherwise
|
|
102
|
-
it uses `python3`. A broken `python` remains the primary result, with a
|
|
103
|
-
different `python3` shown separately. **Not found** means no command was
|
|
104
|
-
resolved, **Runtime unavailable** means a launcher was found but no runtime
|
|
105
|
-
could safely be reported, and **Probe failed** means inspection or the version
|
|
106
|
-
check failed. Missing optional runtimes never prevent starting a shell.
|
|
107
|
-
|
|
108
|
-
Discovery runs on first viewing and again on **Refresh**, in an isolated
|
|
109
|
-
helper with a neutral temporary working directory. It does not load shell
|
|
110
|
-
profiles, activate tools, download runtimes or modify installations. Unknown
|
|
111
|
-
script/shim launchers and Windows execution aliases are left unverified.
|
|
112
|
-
Refresh checks the fact selected in the dialog and leaves the others as they
|
|
113
|
-
are. The manager fact reads the manager's current environment and does not
|
|
114
|
-
reload its PATH from a shell. Existing results for that fact remain visible
|
|
115
|
-
during refresh. Go reports
|
|
116
|
-
the local bundled toolchain with automatic switching disabled, and the Node
|
|
117
|
-
version running Agent Guild is also shown in details.
|
|
118
|
-
|
|
119
|
-
**Work inside tmux or herdr.** When installed, the Shell card also offers
|
|
120
|
-
tmux (3.2 or later, on macOS and Linux) and herdr. A tmux card runs a tmux
|
|
121
|
-
session of its own, with your own configuration, and tools in it report to
|
|
122
|
-
the card as they would in a shell. A herdr card opens your herdr session and
|
|
123
|
-
shows the agents herdr sees in its panes, working, blocked or idle. Stopping
|
|
124
|
-
or closing either card only detaches it, as closing a terminal window would:
|
|
125
|
-
the session keeps running, **Reattach** on the card brings it back, and the
|
|
126
|
-
card names the command that reattaches it from a terminal. Stopping or
|
|
127
|
-
restarting the manager detaches them the same way, and the cards come back,
|
|
128
|
-
closed and ready to reattach, when it starts again.
|
|
129
|
-
|
|
130
|
-
Open **Terminal multiplexers** on the Shell card to install, update or
|
|
131
|
-
uninstall tmux and herdr. Operations run in a terminal so you can read their
|
|
132
|
-
output and answer package-manager prompts. tmux uses Homebrew on macOS and
|
|
133
|
-
Homebrew or apt, dnf, or pacman on Linux; a distribution must offer 3.2 or
|
|
134
|
-
later. Update distro packages with their package manager. Native Windows
|
|
135
|
-
offers herdr instead of tmux.
|
|
136
|
-
|
|
137
|
-
Herdr updates leave its existing servers and panes running, including
|
|
138
|
-
Homebrew updates. New starts and reattachments wait until the operation
|
|
139
|
-
finishes. Uninstall requires herdr's servers to be stopped and their status
|
|
140
|
-
to be verifiable. tmux asks before changing a copy that attached or detached
|
|
141
|
-
cards depend on. Settings and session data are kept. If a multiplexer is
|
|
142
|
-
missing when the manager starts, its saved cards wait for it and return
|
|
143
|
-
when it is detected again, provided their sessions still exist.
|
|
144
|
-
|
|
145
|
-
<img src="docs/images/terminal.webp" alt="An open Claude Code session with its helper agents shown in the header">
|
|
146
|
-
|
|
147
|
-
**Agents and models at work.** Helper agents that a tool starts appear on its
|
|
148
|
-
card as familiars while they run, and the card names the model in use. The
|
|
149
|
-
character comes alive while the session works, and the session's level rises
|
|
150
|
-
with every hour it runs.
|
|
151
|
-
|
|
152
|
-
**Several subscriptions per tool.** Add a work account next to your personal
|
|
153
|
-
one and switch with a chip on the card. Each account keeps its own sign-in,
|
|
154
|
-
usage meters and sessions. See [Accounts](docs/configuration.md#accounts).
|
|
155
|
-
|
|
156
|
-
**See what is left of your limits.** Claude Code and Codex CLI
|
|
157
|
-
cards show a meter for each rate-limit window, such as 5-hour and 7-day, with
|
|
158
|
-
the time until it resets. They also show your plan, Claude's extra-usage
|
|
159
|
-
spend and Codex's credit balance when the account has them. Any other tool
|
|
160
|
-
can supply a command that prints its usage.
|
|
161
|
-
|
|
162
|
-
**Pick the right model.** Each card grades the tool's newest fully
|
|
163
|
-
benchmarked model on coding, intelligence and agentic work, from S to D. Open it to compare every
|
|
164
|
-
model the tool offers across 13 benchmarks: Artificial Analysis indexes and
|
|
165
|
-
Design Arena results for websites, UI, game dev, data visualization, 3D, SVG,
|
|
166
|
-
web apps, full stack and mobile. It also shows context size and price.
|
|
167
|
-
|
|
168
|
-
<img src="docs/images/models.webp" alt="The Claude Code models dialog with benchmark tiers for each model">
|
|
169
|
-
|
|
170
|
-
**Pick up where you left off.** **Existing…** lists the tool's own earlier
|
|
171
|
-
sessions, newest first, read from where the tool keeps them. Filter by title,
|
|
172
|
-
folder or id and resume one in its own folder, or resume any session by id.
|
|
173
|
-
|
|
174
|
-
<img src="docs/images/history.webp" alt="The Claude Code session history with a filter and Resume buttons">
|
|
175
|
-
|
|
176
|
-
**Agentic development news.** A newsfeed gathers about 20 sources on AI
|
|
177
|
-
coding, agents and local models, including vendor blogs, Hacker News, arXiv,
|
|
178
|
-
and releases of the tools you have installed. The five latest headlines
|
|
179
|
-
appear on the page; **All news** opens the full feed with News, Releases and Research
|
|
180
|
-
filters.
|
|
181
|
-
|
|
182
|
-
<img src="docs/images/news.webp" alt="The news panel with today's items from news sources and tool releases">
|
|
183
|
-
|
|
184
|
-
**Always current.** When a new Agent Guild is published, **Upgrade to
|
|
185
|
-
vX.Y.Z** installs it while your sessions keep running, and **Restart to use
|
|
186
|
-
vX.Y.Z** switches over when you are ready. The version badge opens
|
|
187
|
-
**What's new** with the notes of every release.
|
|
188
|
-
|
|
189
|
-
<img src="docs/images/whats-new.webp" alt="The What's new panel listing the release notes of each version">
|
|
190
|
-
|
|
191
|
-
**Keep notes at hand.** **Notes** in the top bar opens a notepad for prompts,
|
|
192
|
-
commands and to-dos in the side panel, next to your terminals. It saves up to
|
|
193
|
-
100,000 characters as you type. The same notes follow every browser signed in
|
|
194
|
-
to this manager, including one opened through remote access. This browser
|
|
195
|
-
keeps a copy too: if the manager is unreachable, the line under the title
|
|
196
|
-
says the notes are saved in this browser only, and they sync when it is back.
|
|
197
|
-
|
|
198
|
-
**GitHub beside your work.** **GitHub** in the top bar opens the side panel.
|
|
199
|
-
Sign in to one or more GitHub accounts, then search the repositories of all
|
|
200
|
-
of them from the box at its top; it starts on the repository the focused
|
|
201
|
-
terminal's folder is a clone of. **Issues** lists, opens, edits and closes
|
|
202
|
-
issues. **Actions** shows the latest workflow runs and whether one is still
|
|
203
|
-
going, refreshing while it is on screen. **Pull requests** lists the open
|
|
204
|
-
ones. **Branches** lists every remote branch of the selected repository, with
|
|
205
|
-
its default and protected branches marked. Filter by name, copy a branch name,
|
|
206
|
-
or open it on GitHub. Larger lists load progressively; **Refresh** checks for
|
|
207
|
-
changes while keeping your place in the list. **Repositories** lists and creates
|
|
208
|
-
repositories and clones them over SSH with a key Agent Guild keeps for each account. On a wide window the side panel
|
|
209
|
-
makes room for itself; on a smaller one it lies over the cards, and over the
|
|
210
|
-
terminals when they would get too narrow. Drag its edge to resize it. Escape
|
|
211
|
-
or **Close** puts it away.
|
|
49
|
+
### Access token
|
|
212
50
|
|
|
213
|
-
|
|
51
|
+
You do not create one. The first run generates it, and `agent-guild` opens
|
|
52
|
+
the page with it. If a browser asks for it, open the link that
|
|
53
|
+
`agent-guild url` prints. Anyone with that link can use your terminals.
|
|
214
54
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
**Professional** is a plain business look with no characters; **Orbital**
|
|
219
|
-
puts a crew of little robots in deep space; **Grove** is a calm moss garden
|
|
220
|
-
of gentle nature spirits; **Gnomeland** is a lantern-lit village of gnome
|
|
221
|
-
builders, engineers with a little magic; **Goblinville** is a steam-powered
|
|
222
|
-
town of goblin, orc, ogre and troll builders on stilts over a bog. The page
|
|
223
|
-
follows your system's light or dark setting until you pick one. See
|
|
224
|
-
[docs/SKINS.md](docs/SKINS.md) to make another. **Alert sounds**, off until
|
|
225
|
-
you turn them on in the same menu, chime when the session manager confirms
|
|
226
|
-
a stop or restart, remains unavailable after a brief recovery check, or a
|
|
227
|
-
new version is discovered after the initial version check. Session activity
|
|
228
|
-
and assistant responses have no sounds:
|
|
229
|
-
the providers do not yet offer consistently reliable completion signals.
|
|
230
|
-
**Launch at sign-in**, in the same menu, starts the session manager in the
|
|
231
|
-
background whenever you sign in to the computer running Agent Guild; open
|
|
232
|
-
the page as usual afterwards. On Windows it is an entry in Task Manager's
|
|
233
|
-
Startup apps, on macOS a background item named Agent Guild under System
|
|
234
|
-
Settings › General › Login Items & Extensions, and on Linux an entry named
|
|
235
|
-
Agent Guild in the desktop's startup settings, so it needs a desktop session
|
|
236
|
-
there: a server reached over SSH does not start it. macOS keeps its own
|
|
237
|
-
switch for that item, which Agent Guild cannot read: switched off there, it
|
|
238
|
-
does not start even while **Launch at sign-in** is checked. While it is on,
|
|
239
|
-
the setting says when it last ran at sign-in and whether the session manager
|
|
240
|
-
started then.
|
|
241
|
-
|
|
242
|
-
On Linux the setting is one choice: **Only when I start it**, **When I sign
|
|
243
|
-
in** (the desktop entry above) or **When the computer starts**. The last
|
|
244
|
-
runs the session manager as a systemd user service, `agent-guild.service`,
|
|
245
|
-
so it is running before you connect to a machine with no desktop, and
|
|
246
|
-
systemd starts it again if it fails. Only one of the two starters is on at
|
|
247
|
-
a time, and changing the choice never stops the running session manager: one
|
|
248
|
-
started by hand hands over to systemd at its next restart. While the service
|
|
249
|
-
is on, `agent-guild open` and `agent-guild restart` start the session manager
|
|
250
|
-
through systemd, `agent-guild stop` stops it until the next start, and tmux
|
|
251
|
-
cards survive restarts as they do without it. To start before anyone signs
|
|
252
|
-
in, systemd needs lingering, which only an administrator can always turn
|
|
253
|
-
on; the setting shows the command, `sudo loginctl enable-linger <user>`,
|
|
254
|
-
until it is on. It also shows what systemd reports, such as a port another
|
|
255
|
-
session manager was using, and for a failure the command that shows its
|
|
256
|
-
log, `journalctl --user -u agent-guild.service`. `agent-guild status` prints
|
|
257
|
-
the same state, read from systemd when no session manager answers.
|
|
258
|
-
|
|
259
|
-
The browser tab icon adds a rotating green ring whenever any session card says
|
|
260
|
-
**Working**, including Shell and task cards. It mirrors the cards' terminal
|
|
261
|
-
activity, not assistant completion. The ring remains visible with reduced
|
|
262
|
-
motion or when the browser pauses animation. During a connection interruption,
|
|
263
|
-
it reflects the last card state until the page reconnects.
|
|
264
|
-
|
|
265
|
-
Sounds play in one eligible tab per browser and origin after browser playback
|
|
266
|
-
permission (usually a click or keypress). They require Web Locks and writable
|
|
267
|
-
local storage. Opening or reconnecting a page does not replay old alerts,
|
|
268
|
-
even when a different manager has taken over. Closing a browser does not
|
|
269
|
-
stop the manager. After an unexpected disconnect, an already connected page
|
|
270
|
-
checks the local health endpoint twice, two seconds apart, with a one-second
|
|
271
|
-
timeout per request. If both fail, it shows “Manager unavailable” and alerts
|
|
272
|
-
once; it cannot confirm whether the process exited or sessions ended.
|
|
273
|
-
A successful health check, reconnection, or closing the page cancels the alert.
|
|
274
|
-
There is no added polling while connected and no additional monitoring process.
|
|
55
|
+
To replace it, stop the manager (this ends running sessions), delete
|
|
56
|
+
`auth-token` from the [data folder](docs/configuration.md#data-folder), and
|
|
57
|
+
start again.
|
|
275
58
|
|
|
276
|
-
|
|
59
|
+
### Headless Linux server
|
|
277
60
|
|
|
278
|
-
|
|
279
|
-
| --- | --- |
|
|
280
|
-
| `agent-guild` or `agent-guild open` | Start the manager if needed and open the page. `--no-browser` prints the URL instead. |
|
|
281
|
-
| `agent-guild status` | Show whether the manager is running, how it starts, and list its sessions. |
|
|
282
|
-
| `agent-guild stop` | Stop the manager, ending every session. |
|
|
283
|
-
| `agent-guild restart` | Stop the manager and start it again on the version installed on disk, ending every session. |
|
|
284
|
-
| `agent-guild url` | Print the page URL with its access token. |
|
|
285
|
-
| `agent-guild start` | Run the manager in the foreground, for debugging. |
|
|
61
|
+
1. On the server:
|
|
286
62
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
63
|
+
```sh
|
|
64
|
+
npm install -g @oddessentials/agent-guild
|
|
65
|
+
agent-guild --no-browser
|
|
66
|
+
```
|
|
291
67
|
|
|
292
|
-
|
|
68
|
+
It prints `Open: http://127.0.0.1:47821/#token=…`.
|
|
293
69
|
|
|
294
|
-
|
|
295
|
-
more than one account or point usage meters at your own command, create a
|
|
296
|
-
`providers.json` in the data folder:
|
|
70
|
+
2. On your computer, open a tunnel and leave it open:
|
|
297
71
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
| macOS | `~/Library/Application Support/AgentGuild` |
|
|
302
|
-
| Linux | `~/.config/agent-guild` |
|
|
303
|
-
|
|
304
|
-
The full reference, including every field and environment variable, is in
|
|
305
|
-
[docs/configuration.md](docs/configuration.md).
|
|
306
|
-
|
|
307
|
-
## Show agents and models
|
|
308
|
-
|
|
309
|
-
Agents are reported by the coding tool's hooks, not guessed from its output.
|
|
310
|
-
Each helper agent appears on the card while it runs. Agent Guild gives every
|
|
311
|
-
Claude Code and Codex CLI session its reporting hooks for that session only,
|
|
312
|
-
without changing the tool's own settings. Antigravity CLI has no such option:
|
|
313
|
-
turn on **Agent reporting** on its card once, which installs an Agent Guild
|
|
314
|
-
plugin into Antigravity. It reports the model and the conversation, but no
|
|
315
|
-
helper agents or shell commands. Grok Build cannot take hooks for one session yet; add the hooks
|
|
316
|
-
from [examples/grok-hooks.json](examples/grok-hooks.json) to see its agents.
|
|
317
|
-
When a tool's hooks have not reported some time after a prompt was sent,
|
|
318
|
-
because hooks are turned off, restricted by an administrator or not trusted
|
|
319
|
-
for the folder, the card says so.
|
|
320
|
-
|
|
321
|
-
The card also names the model, from the hooks, from `--model` or from the
|
|
322
|
-
tool's screen.
|
|
323
|
-
|
|
324
|
-
Any other tool or script can report agents and its model too. See
|
|
325
|
-
[docs/agent-reporting.md](docs/agent-reporting.md).
|
|
326
|
-
|
|
327
|
-
## Security and privacy
|
|
328
|
-
|
|
329
|
-
* The manager listens on `127.0.0.1` only. **Settings → Remote access** sets
|
|
330
|
-
up a private Tailscale address without restarting your terminals. See
|
|
331
|
-
[remote access and other proxies](docs/configuration.md#reverse-proxies).
|
|
332
|
-
* Every API call needs a random per-user token, stored in the data folder
|
|
333
|
-
with owner-only permissions. Anyone who can run programs as your user can
|
|
334
|
-
read it, as with any local developer tool.
|
|
335
|
-
* Requests with a foreign `Host` or `Origin` header are refused, so other
|
|
336
|
-
websites cannot reach your terminals through your browser.
|
|
337
|
-
* Tools inside a session get a separate token that can only report agents
|
|
338
|
-
for that session.
|
|
339
|
-
* GitHub sign-ins, the SSH key Agent Guild makes for each GitHub account and
|
|
340
|
-
GitHub's SSH host keys are kept in the `github` folder of the data folder,
|
|
341
|
-
readable only by you. A clone uses only that key and those host keys; your
|
|
342
|
-
own `~/.ssh` and Git configuration are not read or changed.
|
|
343
|
-
* Usage meters are fetched by the manager with each tool's own sign-in. The
|
|
344
|
-
page only receives percentages. On macOS the first lookup may ask for
|
|
345
|
-
keychain access to the "Claude Code-credentials" item; choose Always Allow.
|
|
346
|
-
* **Launch at sign-in** writes outside the data folder only while it is on:
|
|
347
|
-
the `AgentGuild` value under
|
|
348
|
-
`HKCU\Software\Microsoft\Windows\CurrentVersion\Run` on Windows, which
|
|
349
|
-
runs `autostart.js` from the data folder through `wscript.exe` so no
|
|
350
|
-
console window opens;
|
|
351
|
-
`~/Library/LaunchAgents/com.oddessentials.agent-guild.plist` on macOS,
|
|
352
|
-
which runs the `Agent Guild` script in the data folder so that macOS lists
|
|
353
|
-
it by that name; and `~/.config/autostart/agent-guild.desktop` on Linux,
|
|
354
|
-
which runs `autostart.sh` from the data folder. On Linux, a Node.js,
|
|
355
|
-
package or data folder path holding `"`, `` ` ``, `$` or `\` cannot be
|
|
356
|
-
used, because desktops read those differently in a startup entry; the
|
|
357
|
-
setting then says so. Each sign-in touches `sign-in-attempt` and records
|
|
358
|
-
its outcome in `sign-in.json` in the data folder.
|
|
359
|
-
Turning it off removes them, and an entry whose Agent Guild package has
|
|
360
|
-
been uninstalled or moved removes itself at the next sign-in. With nvm,
|
|
361
|
-
the package lives in the Node.js version's folder, so uninstalling that
|
|
362
|
-
version counts as uninstalling Agent Guild; a Homebrew Node.js upgrade
|
|
363
|
-
or a Snap Node.js refresh does not. On macOS and Linux what the entry runs at sign-in, including a
|
|
364
|
-
missing Node.js, is appended to `manager.log`.
|
|
365
|
-
The entry saves the manager's listening port, including the assigned port
|
|
366
|
-
when started with `AGENT_GUILD_PORT=0`. Enabled entries are updated when
|
|
367
|
-
the manager starts. A macOS entry disabled through `launchctl` stays off
|
|
368
|
-
until you explicitly turn **Launch at sign-in** back on.
|
|
369
|
-
* **When the computer starts**, on Linux, writes
|
|
370
|
-
`~/.config/systemd/user/agent-guild.service` and enables it, which links
|
|
371
|
-
it from `default.target.wants`; the unit runs `boot.sh` from the data
|
|
372
|
-
folder, which runs `agent-guild start` in the foreground. Choosing another
|
|
373
|
-
option disables and removes both. A unit whose Agent Guild package has
|
|
374
|
-
been uninstalled or moved disables and removes itself at the next start.
|
|
375
|
-
Lingering, which lets it start before anyone signs in, is a system
|
|
376
|
-
setting that Agent Guild reads but never changes.
|
|
377
|
-
|
|
378
|
-
The manager makes these outbound requests, and none of them carry your code
|
|
379
|
-
or prompts:
|
|
72
|
+
```sh
|
|
73
|
+
ssh -L 47821:127.0.0.1:47821 you@server
|
|
74
|
+
```
|
|
380
75
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
| npm registry | Tool and Agent Guild version checks | About hourly; `AGENT_GUILD_NO_UPDATE_CHECK=1` turns them off |
|
|
384
|
-
| Anthropic and OpenAI usage endpoints | Usage meters, with the tool's own sign-in | Every minute while the page is open |
|
|
385
|
-
| OpenRouter's public model list | Benchmarks | Every 6 hours |
|
|
386
|
-
| Public news feeds, Hacker News, arXiv and GitHub | The newsfeed | Every 30 minutes while the page is open |
|
|
387
|
-
| GitHub's releases API | What's new | Hourly |
|
|
388
|
-
| herdr.dev and formulae.brew.sh | Multiplexer version checks | At most hourly, or on Refresh or a requested operation; disabled by `AGENT_GUILD_NO_UPDATE_CHECK=1` |
|
|
389
|
-
| herdr.dev, GitHub release downloads, and the selected package manager's repositories | Multiplexer installation and updates | When you request the operation |
|
|
390
|
-
| GitHub (sign-in, API, avatars and SSH) | Signing in to GitHub, listing your repositories, issues, workflow runs and pull requests, editing issues, adding your SSH key and cloning | When you use the GitHub panel; while its Actions tab shows, every few seconds during a run and every 30 seconds otherwise |
|
|
76
|
+
3. Open the printed link in your browser. The local port must be `47821`;
|
|
77
|
+
any other port is refused.
|
|
391
78
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
The page is one client of the manager's local API, documented in
|
|
395
|
-
[docs/api.md](docs/api.md). Another interface, such as a planned Unreal Engine
|
|
396
|
-
guild hall, can drive the same sessions at the same time. See
|
|
397
|
-
[docs/architecture.md](docs/architecture.md).
|
|
398
|
-
|
|
399
|
-
## Development
|
|
79
|
+
To start Agent Guild when the server boots, choose **Settings → Startup →
|
|
80
|
+
When the computer starts** in the page, then run once on the server:
|
|
400
81
|
|
|
401
82
|
```sh
|
|
402
|
-
|
|
403
|
-
cd agent-guild
|
|
404
|
-
npm install
|
|
405
|
-
npm start # open the page, starting a manager from this checkout if none runs
|
|
406
|
-
npm test
|
|
83
|
+
sudo loginctl enable-linger $USER
|
|
407
84
|
```
|
|
408
85
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
86
|
+
This needs systemd and is not offered under WSL. `agent-guild status` shows
|
|
87
|
+
the result.
|
|
88
|
+
|
|
89
|
+
### Remote access with Tailscale
|
|
90
|
+
|
|
91
|
+
Use your terminals from a phone or another computer on your
|
|
92
|
+
[Tailscale](https://tailscale.com) network.
|
|
93
|
+
|
|
94
|
+
You need Tailscale 1.52 or later, signed in on both devices in the same
|
|
95
|
+
tailnet, with MagicDNS on.
|
|
96
|
+
|
|
97
|
+
1. In the page, choose **Settings → Remote access → Enable remote access**.
|
|
98
|
+
2. If it shows **Open Tailscale approval**, approve HTTPS there, then choose
|
|
99
|
+
**Continue setup**.
|
|
100
|
+
3. If it says **Tailscale needs permission**, run the command under
|
|
101
|
+
**Connection details** in a terminal allowed to manage Tailscale, then
|
|
102
|
+
choose **Continue setup**.
|
|
103
|
+
4. Choose **Connect another device** and scan the QR code, or open the
|
|
104
|
+
sign-in link, on the other device.
|
|
105
|
+
|
|
106
|
+
The sign-in link contains your access token. **Disable remote access** turns
|
|
107
|
+
it off; sessions keep running. On a headless server, do this through the SSH
|
|
108
|
+
tunnel above. For another reverse proxy, see
|
|
109
|
+
[configuration](docs/configuration.md#reverse-proxies).
|
|
110
|
+
|
|
111
|
+
### macOS keychain
|
|
112
|
+
|
|
113
|
+
The first Claude Code usage meter may ask for access to the
|
|
114
|
+
"Claude Code-credentials" keychain item. Choose **Always Allow**.
|
|
115
|
+
|
|
116
|
+
## Features
|
|
117
|
+
|
|
118
|
+
* Real terminals that survive closing or reloading the page
|
|
119
|
+
* Two terminals side by side with **Split**
|
|
120
|
+
* Install and update each tool from its card
|
|
121
|
+
* Helper agents and the model in use, shown on each card
|
|
122
|
+
([setup per tool](docs/agent-reporting.md))
|
|
123
|
+
* Rate-limit meters for Claude Code and Codex CLI
|
|
124
|
+
* Several accounts per tool ([accounts](docs/configuration.md#accounts))
|
|
125
|
+
* Model grades and benchmarks for each tool's models
|
|
126
|
+
* Resume a tool's earlier sessions with **Existing…**
|
|
127
|
+
* GitHub issues, pull requests, workflow runs, branches and cloning
|
|
128
|
+
* Shared notes, a news feed, six skins, light and dark mode
|
|
129
|
+
* tmux and herdr sessions that keep running when the manager stops
|
|
130
|
+
|
|
131
|
+
<img src="docs/images/workspace.webp" alt="Two terminals side by side with the GitHub panel showing the workflow runs of the focused terminal's repository">
|
|
132
|
+
|
|
133
|
+
## Commands
|
|
134
|
+
|
|
135
|
+
| Command | What it does |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `agent-guild` | Start the manager if needed and open the page. `--no-browser` prints the link instead. |
|
|
138
|
+
| `agent-guild status` | Show whether the manager is running and list its sessions. |
|
|
139
|
+
| `agent-guild stop` | Stop the manager and end every session. |
|
|
140
|
+
| `agent-guild restart` | Restart the manager on the installed version and end every session. |
|
|
141
|
+
| `agent-guild url` | Print the page link with the access token. |
|
|
142
|
+
| `agent-guild start` | Run the manager in the foreground. |
|
|
143
|
+
|
|
144
|
+
Sessions end when the manager stops or the computer restarts. tmux and herdr
|
|
145
|
+
sessions survive a manager stop.
|
|
146
|
+
|
|
147
|
+
## Privacy
|
|
148
|
+
|
|
149
|
+
The manager listens on `127.0.0.1` only. Remote access goes through a private
|
|
150
|
+
Tailscale route or your own reverse proxy to that address. None of these
|
|
151
|
+
requests carry your code or prompts:
|
|
152
|
+
|
|
153
|
+
| To | For | How often |
|
|
154
|
+
| --- | --- | --- |
|
|
155
|
+
| npm registry | Version checks | Hourly |
|
|
156
|
+
| Anthropic and OpenAI | Usage meters, with the tool's own sign-in | Every minute while the page is open |
|
|
157
|
+
| OpenRouter | Model list for benchmarks | Every 6 hours |
|
|
158
|
+
| News feeds, Hacker News, arXiv, GitHub | News feed | Every 30 minutes while the page is open |
|
|
159
|
+
| GitHub releases | What's new | Hourly, more often just after a release |
|
|
160
|
+
| herdr.dev, Homebrew | Multiplexer version checks | Hourly |
|
|
161
|
+
| GitHub, GitHub Status | GitHub panel | When you use it |
|
|
162
|
+
| Package sources | Installs and updates | When you ask |
|
|
163
|
+
|
|
164
|
+
Failed news, model list and release checks retry after 10 minutes.
|
|
165
|
+
`AGENT_GUILD_NO_UPDATE_CHECK=1` turns off version checks and self-upgrade.
|
|
166
|
+
|
|
167
|
+
## More
|
|
168
|
+
|
|
169
|
+
* [Configuration](docs/configuration.md): add tools, accounts, environment variables, reverse proxies
|
|
170
|
+
* [Agent reporting](docs/agent-reporting.md): show agents from any tool
|
|
171
|
+
* [Skins](docs/SKINS.md): make your own look
|
|
172
|
+
* [Contributing](CONTRIBUTING.md)
|
|
437
173
|
|
|
438
174
|
## License
|
|
439
175
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oddessentials/agent-guild",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Launch and watch AI coding-assistant terminal sessions from one local web page. A bundled session manager owns the terminals so the page can close and reconnect.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
package/web/app.js
CHANGED
|
@@ -1787,10 +1787,43 @@ function creditsNote(usage) {
|
|
|
1787
1787
|
return [note];
|
|
1788
1788
|
}
|
|
1789
1789
|
|
|
1790
|
+
/** The same rounding the meter prints as "N% left". */
|
|
1791
|
+
function usageLeft(usedPercent) {
|
|
1792
|
+
return Math.max(0, Math.round(100 - usedPercent));
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
/**
|
|
1796
|
+
* true when every window explicitly reads 0% left.
|
|
1797
|
+
* false when the account is logged in without that reading.
|
|
1798
|
+
* null when there is no reading to count, including a signed-out account.
|
|
1799
|
+
*/
|
|
1800
|
+
function accountUsageSpent(usage) {
|
|
1801
|
+
if (!usage || usage.signedIn === false) return null;
|
|
1802
|
+
const windows = Array.isArray(usage.windows) ? usage.windows : [];
|
|
1803
|
+
const readable = !usage.error && windows.length > 0 && windows.every((w) => typeof w.usedPercent === 'number' && Number.isFinite(w.usedPercent));
|
|
1804
|
+
if (!readable) return usage.signedIn === true ? false : null;
|
|
1805
|
+
if (typeof usage.credits === 'number' && Number.isFinite(usage.credits) && usage.credits > 0) return false;
|
|
1806
|
+
return windows.every((w) => usageLeft(w.usedPercent) === 0);
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
/** The portrait is spent only when every logged-in account explicitly reads 0% left. */
|
|
1810
|
+
function cardUsageSpent(provider, usageByAccount) {
|
|
1811
|
+
if (!provider?.available || !provider.usageSource) return false;
|
|
1812
|
+
const accounts = provider.accounts?.length ? provider.accounts : [{ id: 'default' }];
|
|
1813
|
+
let spent = false;
|
|
1814
|
+
for (const account of accounts) {
|
|
1815
|
+
const reading = accountUsageSpent(usageByAccount.get(`${provider.id}/${account.id}`));
|
|
1816
|
+
if (reading === false) return false;
|
|
1817
|
+
if (reading === true) spent = true;
|
|
1818
|
+
}
|
|
1819
|
+
return spent;
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1790
1822
|
function renderUsage(card, provider) {
|
|
1791
1823
|
const host = card.querySelector('.usage');
|
|
1792
1824
|
const account = selectedAccount(provider);
|
|
1793
1825
|
const usage = usageFor(provider, account);
|
|
1826
|
+
card.classList.toggle('spent', cardUsageSpent(provider, state.usage));
|
|
1794
1827
|
renderTier(card, provider, provider.usageSource ? usage : null);
|
|
1795
1828
|
const start = card.querySelector('.new');
|
|
1796
1829
|
const unsigned = Boolean(provider.available && usage?.signedIn === false);
|
|
@@ -1808,7 +1841,7 @@ function renderUsage(card, provider) {
|
|
|
1808
1841
|
}
|
|
1809
1842
|
host.replaceChildren(...usage.windows.map((w) => {
|
|
1810
1843
|
const node = $('meter-template').content.firstElementChild.cloneNode(true);
|
|
1811
|
-
const left =
|
|
1844
|
+
const left = usageLeft(w.usedPercent);
|
|
1812
1845
|
node.classList.toggle('low', left <= 25 && left > 10);
|
|
1813
1846
|
node.classList.toggle('empty', left <= 10);
|
|
1814
1847
|
node.querySelector('.meter-label').textContent = w.label;
|
package/web/index.html
CHANGED
|
@@ -529,7 +529,7 @@
|
|
|
529
529
|
|
|
530
530
|
<template id="provider-template">
|
|
531
531
|
<article class="provider" role="listitem">
|
|
532
|
-
<span class="card-art" aria-hidden="true"></span>
|
|
532
|
+
<span class="card-art" aria-hidden="true"><span class="spent-veil"></span></span>
|
|
533
533
|
<div class="provider-head">
|
|
534
534
|
<span class="provider-icon"></span>
|
|
535
535
|
<span class="provider-text">
|
package/web/styles.css
CHANGED
|
@@ -153,6 +153,16 @@ main { max-width: calc(1200px + var(--dock-space, 0px)); margin: 0 auto; padding
|
|
|
153
153
|
.account-chip.unsigned { border-style: dashed; }
|
|
154
154
|
.provider .usage { display: grid; gap: 4px; }
|
|
155
155
|
.provider .usage:empty { display: none; }
|
|
156
|
+
/* Spent portrait: the art stills and a danger wash sits inside the frame. The card stays usable. */
|
|
157
|
+
.provider .spent-veil {
|
|
158
|
+
position: absolute; inset: 0; z-index: 1; pointer-events: none; opacity: 0;
|
|
159
|
+
background:
|
|
160
|
+
radial-gradient(ellipse at 50% 42%, transparent 28%, color-mix(in srgb, var(--danger) 46%, transparent) 100%),
|
|
161
|
+
linear-gradient(to top, rgba(0, 0, 0, 0.55), transparent 52%);
|
|
162
|
+
transition: opacity 0.4s var(--ease);
|
|
163
|
+
}
|
|
164
|
+
.provider.spent .card-art::before { filter: grayscale(1) brightness(0.82); }
|
|
165
|
+
.provider.spent .spent-veil { opacity: 1; }
|
|
156
166
|
.environment-summary { min-width: 0; font-size: .78rem; }
|
|
157
167
|
.environment-open { padding: 0; border: 0; background: none; color: var(--accent); font: inherit; cursor: pointer; text-align: left; }
|
|
158
168
|
.environment-open:hover { text-decoration: underline; }
|
|
@@ -1054,6 +1064,7 @@ a.btn.github-out::after {
|
|
|
1054
1064
|
.btn.voice[aria-pressed="true"]::before { animation: none; }
|
|
1055
1065
|
.drag-handle, .session-grid::before, .session-grid.reordering::before,
|
|
1056
1066
|
.session-grid > .session-card.dragging, .session-grid > .session-card.settling { transition: none; }
|
|
1067
|
+
.provider .spent-veil { transition: none; }
|
|
1057
1068
|
}
|
|
1058
1069
|
|
|
1059
1070
|
@media (max-width: 640px) {
|