@hanskristoffer/agentpool 0.25.0 → 0.26.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 +35 -33
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ Without npm:
|
|
|
31
31
|
curl -fsSL https://raw.githubusercontent.com/HansKristoffer/agentgate/main/install.sh | sh
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
Update a machine installed this way with `agentgate update`: it installs the latest release and restarts the service, and also updates a global npm or bun install of agentgate that your PATH finds first. The CLI warns when it is not the release the daemon runs. `agentgate update <node>` does the same on a paired machine. Both wait until the machine reports the new release, and say so if it is still restarting after 90 seconds. The app lists machines on an older release on the overview with an **Update** button under Machines. With npm, run `npm install -g @hanskristoffer/agentpool@latest` and `agentgate service restart`; the Mac app updates itself and its daemon.
|
|
34
|
+
Update a machine installed this way with `agentgate update`: it installs the latest release and restarts the service, and also updates a global npm or bun install of agentgate that your PATH finds first. The CLI warns when it is not the release the daemon runs. `agentgate update <node>` does the same on a paired machine. Both wait until the machine reports the new release, and say so if it is still restarting after 90 seconds. The app lists machines on an older release under **Needs attention** on the overview, with an **Update** button under Machines. With npm, run `npm install -g @hanskristoffer/agentpool@latest` and `agentgate service restart`; the Mac app updates itself and its daemon.
|
|
35
35
|
|
|
36
36
|
Or from source: `bun install && bun run build` (binaries land in `dist/`), or run `bun run cli -- …` directly.
|
|
37
37
|
|
|
@@ -47,7 +47,7 @@ agentgate service install # launchd (macOS) or systemd --user (Linux)
|
|
|
47
47
|
|
|
48
48
|
You can do every setup step with the CLI. To use the native app, build it with `bun run build:desktop` and open **Agentgate.app**. It connects to `http://127.0.0.1:7878` by default. On a fresh machine, **Set up this machine** installs the bundled CLI in `~/.config/agentgate/bin`, initializes the store, and starts a launchd service. Add that folder to your shell PATH to use the CLI. Closing or removing the app leaves that service and its CLI running.
|
|
49
49
|
|
|
50
|
-
The app has Overview, Accounts, MCP servers, Skills, Projects, Machines, T3 Code, and Settings screens
|
|
50
|
+
The app has Overview, Accounts, MCP servers, Skills, Projects, Machines, T3 Code, Activity, and Settings screens. Overview lists anything that needs you, such as an account or MCP server to sign in to again, and the sidebar marks the screen where you fix it. **Settings → Configure coding tools** generates the Claude/Codex folders and T3 settings. The app's service and coding-tool controls apply only to its configured local daemon; remote setup and services use the CLI on that machine. The one exception is routing: Machines shows whether each machine's own Claude Code and Codex go through agentgate, and its row menu turns that on or off there.
|
|
51
51
|
|
|
52
52
|
## A second machine (e.g. an always-on server)
|
|
53
53
|
|
|
@@ -62,7 +62,7 @@ On the first machine, run `agentgate pair` or use **Pair a machine** in the app.
|
|
|
62
62
|
curl -fsSL https://raw.githubusercontent.com/HansKristoffer/agentgate/main/install.sh | AGENTGATE_NAME=srv sh -s -- join agr1.…
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
If agentgate is already installed there, `agentgate join agr1.…` (relay) or `agentgate join http://mac.<tailnet>.ts.net:7878 <code>` (Tailscale) joins without reinstalling. Mark an always-on server with `agentgate init --always-on` or
|
|
65
|
+
If agentgate is already installed there, `agentgate join agr1.…` (relay) or `agentgate join http://mac.<tailnet>.ts.net:7878 <code>` (Tailscale) joins without reinstalling. Mark an always-on server with `agentgate init --always-on` or **Mark as always on** in its ⋯ menu on Machines.
|
|
66
66
|
|
|
67
67
|
The server now has every account, MCP instance and repo mapping, and takes over token refreshes.
|
|
68
68
|
|
|
@@ -76,7 +76,7 @@ To control the server from the native app over Tailscale, open the connection se
|
|
|
76
76
|
|
|
77
77
|
## Machine dashboard
|
|
78
78
|
|
|
79
|
-
Each machine can show its own health: CPU, load, memory, disk, time spent waiting for CPU, memory or disk, disk and network traffic, the agents and CI runners it is running, Docker's disk use and containers, the programs using the most CPU, and the last hour as charts. In **Machines**,
|
|
79
|
+
Each machine can show its own health: CPU, load, memory, disk, time spent waiting for CPU, memory or disk, disk and network traffic, the agents and CI runners it is running, Docker's disk use and containers, the programs using the most CPU, and the last hour as charts. In **Machines**, choose **Turn on health dashboard** in a machine's ⋯ menu, then **Open health dashboard** opens it in your browser. The page is `/health` on the machine's address, and `agentgate dashboard on|off [--node <node>]` switches it from the CLI.
|
|
80
80
|
|
|
81
81
|
- It runs on Linux machines only, since it reads `/proc`. On a Mac, opening it only says so.
|
|
82
82
|
- Anyone on your tailnet can open it without signing in, as they could the server health page before. It shows program names and resource use, never command lines, credentials or accounts. Turn it off on machines you don't want it on.
|
|
@@ -87,10 +87,10 @@ Each machine can show its own health: CPU, load, memory, disk, time spent waitin
|
|
|
87
87
|
|
|
88
88
|
`agentgate setup` writes a Claude config dir (whose `settings.json` points Claude Code at the daemon) and a Codex home. In T3 Code, add one provider instance per provider:
|
|
89
89
|
|
|
90
|
-
| Provider | T3 setting
|
|
91
|
-
|
|
92
|
-
| Claude
|
|
93
|
-
| Codex
|
|
90
|
+
| Provider | T3 setting |
|
|
91
|
+
| -------- | ------------------------------------------------------- |
|
|
92
|
+
| Claude | `CLAUDE_CONFIG_DIR path` = `~/.config/agentgate/claude` |
|
|
93
|
+
| Codex | `CODEX_HOME path` = `~/.config/agentgate/codex` |
|
|
94
94
|
|
|
95
95
|
One instance per provider covers every account; the daemon switches eligible accounts when quota is exhausted. Account-specific continuations require their original account; if it is unavailable, the client receives an explicit restart error. In the app's **Accounts** screen, click an account's pin to prefer it for its provider. The pin applies to the next request in every routed session and syncs to paired machines; while the pinned account has no room, the pool falls back to another one. Click the pin again to go back to automatic. The CLI equivalent is `agentgate accounts pin <id>` / `agentgate accounts unpin <id>`.
|
|
96
96
|
|
|
@@ -138,19 +138,20 @@ The proxy now provides quota freshness and reset visibility, searchable **Activi
|
|
|
138
138
|
|
|
139
139
|
## MCP servers per repo
|
|
140
140
|
|
|
141
|
-
In the native app (MCP servers), paste a server's URL and a name and click **Connect
|
|
141
|
+
In the native app (MCP servers), paste a server's URL and a name and click **Connect**, then choose the projects that use it (**Global defaults** puts it in every repository). If the server uses MCP OAuth, the browser opens to sign in; its callback completes in the daemon, which connects to the server and shows it as available. agentgate keeps the login, refreshes it, and syncs it to your other machines. **Choose projects** in a server's ⋯ menu changes where it is used later. Presets cover common hosted servers (PostHog, Linear, Sentry, Notion, Supabase, Stripe, Vercel, Cloudflare, Neon, Railway, Context7), a per-worktree filesystem server, and Infisical, which signs in with the [Infisical machine identity](#a-second-machine-eg-an-always-on-server) set under **Shared logins**. Servers that take an API key instead get it under **Extra headers** (`Authorization: Bearer …`); the same field pins a server to one project (`x-posthog-project-id: 12345`).
|
|
142
142
|
|
|
143
143
|
From the CLI:
|
|
144
144
|
|
|
145
145
|
```sh
|
|
146
|
-
agentgate mcp add geysier https://app.geysier.com/api/mcp
|
|
147
|
-
agentgate mcp login geysier #
|
|
146
|
+
agentgate mcp add geysier https://app.geysier.com/api/mcp # opens the login page when the server needs one
|
|
147
|
+
agentgate mcp login geysier # sign in again; the daemon receives the callback
|
|
148
148
|
agentgate mcp add posthog-lullu posthog --header "x-posthog-project-id: 12345"
|
|
149
149
|
agentgate mcp add fs filesystem # presets: agentgate mcp presets
|
|
150
150
|
agentgate mcp add mytool --command "npx -y @some/mcp-server" [--per-session]
|
|
151
151
|
|
|
152
|
-
agentgate
|
|
153
|
-
agentgate
|
|
152
|
+
agentgate mcp projects fs '*' # * = Global defaults, in every repository
|
|
153
|
+
agentgate mcp projects geysier Geysier/gey-mono Geysier/gey-fw
|
|
154
|
+
agentgate project set Lullu-ai/lullu posthog=posthog-lullu # under a tool prefix of your own
|
|
154
155
|
agentgate mcp test posthog-lullu
|
|
155
156
|
```
|
|
156
157
|
|
|
@@ -247,13 +248,13 @@ Running from a git checkout keeps its state in the checkout's gitignored `.agent
|
|
|
247
248
|
|
|
248
249
|
## Monorepo
|
|
249
250
|
|
|
250
|
-
| Workspace
|
|
251
|
-
|
|
252
|
-
| `apps/agentgate` (`@agentgate/daemon`)
|
|
253
|
-
| `apps/desktop` (`@agentgate/desktop`)
|
|
254
|
-
| `apps/site` (`@agentgate/site`)
|
|
255
|
-
| `apps/relay` (`@agentgate/relay`)
|
|
256
|
-
| `packages/protocol` (`@agentgate/protocol`) | Shared control API types and configuration schemas
|
|
251
|
+
| Workspace | Role |
|
|
252
|
+
| ------------------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
253
|
+
| `apps/agentgate` (`@agentgate/daemon`) | Bun daemon, standalone CLI, provider proxies, SQLite, sync, and MCP gateway |
|
|
254
|
+
| `apps/desktop` (`@agentgate/desktop`) | Tauri 2 shell with React/Vite, system appearance, translucent sidebar, and remembered window state |
|
|
255
|
+
| `apps/site` (`@agentgate/site`) | Static Astro landing page for Cloudflare Pages |
|
|
256
|
+
| `apps/relay` (`@agentgate/relay`) | Cloudflare Worker and Durable Objects for the encrypted sync relay |
|
|
257
|
+
| `packages/protocol` (`@agentgate/protocol`) | Shared control API types and configuration schemas |
|
|
257
258
|
|
|
258
259
|
The app uses Tauri commands to send HTTP requests from Rust. It has no browser HTTP fallback, server-rendered pages, cookies, or CORS management access. The daemon's `/api/*` management endpoints reject browser Origin/Fetch Metadata headers; remote requests require the node's admin bearer token. Status omits credentials, header values, command environments, and URL credentials/query strings. `/oauth/callback` is a small text response for MCP sign-in, including CLI sign-in. Provider and MCP traffic remains loopback-only. Backup export/restore and login-directory import require a local connection.
|
|
259
260
|
|
|
@@ -273,16 +274,17 @@ Nodes use **sync protocol 5** (update every paired machine together) and the app
|
|
|
273
274
|
|
|
274
275
|
`setup` preserves unrelated Claude/Codex settings and first-run backups. Generated shims/services include `AGENTGATE_HOME` and `AGENTGATE_PORT`; rerun setup and reinstall the service if you change either value or move the binary. An unsuccessful temporary CLI login/import keeps its folder for recovery instead of deleting the only credential copy.
|
|
275
276
|
|
|
276
|
-
The proxy bounds request bodies to
|
|
277
|
+
The proxy bounds model request bodies to 128 MiB, waits at most 30 seconds for upstream headers, and cancels a response stream after five minutes without data. MCP tool calls allow five minutes without progress, with a 30-minute total limit. Status reports expired logins, refresh failures, sync errors, and quota headers that could not be recognized.
|
|
277
278
|
|
|
278
279
|
Network partitions can still cause separate machines to compete for a rotating upstream token. Reconnect and sync the newer credential first; if the provider revoked it, log in again. Live subscription traffic, T3 provider sessions, physical Tailscale failover, and installed service reboot/logout behavior remain release checks.
|
|
279
280
|
|
|
280
281
|
## Development checks
|
|
281
282
|
|
|
282
|
-
Use Bun 1.4.
|
|
283
|
+
Use Bun 1.4.4 and the committed lockfile:
|
|
283
284
|
|
|
284
285
|
```sh
|
|
285
286
|
bun install --frozen-lockfile
|
|
287
|
+
bun fmt --no-script --check .
|
|
286
288
|
bun run typecheck
|
|
287
289
|
bun test
|
|
288
290
|
bun run build
|
|
@@ -297,17 +299,17 @@ bun scripts/codex-smoke.ts # optional: installed Codex CLI, f
|
|
|
297
299
|
|
|
298
300
|
Builds produce four macOS/Linux binaries and `dist/SHA256SUMS`. Releases use [release-please](https://github.com/googleapis/release-please): conventional commits on `main` (`feat:`, `fix:`) keep a release PR open with the next version and changelog, and merging it publishes the binaries to npm (`@hanskristoffer/agentpool` plus one `agentpool-<os>-<cpu>` package per binary, via `scripts/npm.ts`; npm trusted publishing is configured for each generated package) and to a GitHub release. The installer verifies the checksum from the same resolved release before replacing an installed binary. CI runs tests, typechecking, frontend builds, and compiled CLI checks on macOS and Linux, plus Rust checks and app packaging on macOS. Releases also attach a universal macOS DMG, signed with a Developer ID certificate and notarized (`.github/workflows/build-macos.yml`; run it by hand with a tag to rebuild one). It needs these repository secrets:
|
|
299
301
|
|
|
300
|
-
| Secret
|
|
301
|
-
|
|
302
|
-
| `APPLE_CERTIFICATE`
|
|
303
|
-
| `APPLE_CERTIFICATE_PASSWORD`
|
|
304
|
-
| `APPLE_SIGNING_IDENTITY`
|
|
305
|
-
| `APPLE_TEAM_ID`
|
|
306
|
-
| `APPLE_API_KEY`
|
|
307
|
-
| `APPLE_API_ISSUER`
|
|
308
|
-
| `APPLE_API_KEY_CONTENT`
|
|
309
|
-
| `TAURI_SIGNING_PRIVATE_KEY`
|
|
310
|
-
| `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | its password
|
|
302
|
+
| Secret | Value |
|
|
303
|
+
| ------------------------------------ | -------------------------------------------------------------------------------------------- |
|
|
304
|
+
| `APPLE_CERTIFICATE` | base64 of the Developer ID Application `.p12`, including the G2 intermediate |
|
|
305
|
+
| `APPLE_CERTIFICATE_PASSWORD` | its password |
|
|
306
|
+
| `APPLE_SIGNING_IDENTITY` | `Developer ID Application: Name (TEAMID)` |
|
|
307
|
+
| `APPLE_TEAM_ID` | ten-character team id |
|
|
308
|
+
| `APPLE_API_KEY` | App Store Connect API key id |
|
|
309
|
+
| `APPLE_API_ISSUER` | its issuer id |
|
|
310
|
+
| `APPLE_API_KEY_CONTENT` | contents of the `.p8` |
|
|
311
|
+
| `TAURI_SIGNING_PRIVATE_KEY` | contents of the updater key from `bun run --filter @agentgate/desktop tauri signer generate` |
|
|
312
|
+
| `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | its password |
|
|
311
313
|
|
|
312
314
|
The release also carries a signed app archive and `latest.json`. Installed apps check that on launch and every four hours and offer a restart to update; the public key in `tauri.conf.json` rejects anything not signed with the updater key. Keep that key: without it, installed copies can never update again. On launch, an updated app also replaces the daemon copy the service runs when it differs from the bundled one, then restarts the service.
|
|
313
315
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanskristoffer/agentpool",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"agentgate": "bin/agentpool.js"
|
|
23
23
|
},
|
|
24
24
|
"optionalDependencies": {
|
|
25
|
-
"agentpool-darwin-arm64": "0.
|
|
26
|
-
"agentpool-darwin-x64": "0.
|
|
27
|
-
"agentpool-linux-x64": "0.
|
|
28
|
-
"agentpool-linux-arm64": "0.
|
|
25
|
+
"agentpool-darwin-arm64": "0.26.0",
|
|
26
|
+
"agentpool-darwin-x64": "0.26.0",
|
|
27
|
+
"agentpool-linux-x64": "0.26.0",
|
|
28
|
+
"agentpool-linux-arm64": "0.26.0"
|
|
29
29
|
}
|
|
30
30
|
}
|