@hanskristoffer/agentpool 0.24.0 → 0.25.1

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.
Files changed (2) hide show
  1. package/README.md +27 -25
  2. package/package.json +5 -5
package/README.md CHANGED
@@ -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 | `CLAUDE_CONFIG_DIR path` = `~/.config/agentgate/claude` |
93
- | Codex | `CODEX_HOME path` = `~/.config/agentgate/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
 
@@ -102,7 +102,7 @@ One instance per provider covers every account; the daemon switches eligible acc
102
102
 
103
103
  ### Hand threads between machines
104
104
 
105
- Start a thread on your laptop, hand it to an always-on server while you are away, and hand it back to test and push. A handed-off thread moves with its Claude session and its code: unpushed commits and uncommitted and untracked files (respecting `.gitignore`), plus your changes to the repository's [env files](#env-files-between-machines). Code travels directly between the two machines over Tailscale, or end-to-end encrypted through the relay; nothing is pushed to `origin`.
105
+ Start a thread on your laptop, hand it to an always-on server while you are away, and hand it back to test and push. A handed-off thread moves with its Claude session and its code: unpushed commits and uncommitted, untracked and gitignored files, such as plans in `.plans`. Dependency and build folders such as `node_modules`, `.venv`, `target` and `dist` stay behind, and the other machine's setup script makes them again. [Env files](#env-files-between-machines) the repository saves for every machine travel through their own store instead, so each machine keeps its own. Code travels directly between the two machines over Tailscale, or end-to-end encrypted through the relay; nothing is pushed to `origin`.
106
106
 
107
107
  Connect agentgate to the T3 Code on each machine once: on the T3 Code page open **Machines** and choose **Connect T3 Code** in that machine's row, or run `agentgate t3 connect` there (`--node srv` sets up another machine from the one you are on). T3 Code must be running on that machine; its own `t3` command creates a pairing link that agentgate redeems right away, over that machine only. Pair again the same way when agentgate asks. If that machine has no `t3` command, create a link in T3 Code under **Settings → Connections** (turn on **Network access**, then **Create link** with **Standard** permissions) and paste it into **Connect with a pasted link**, or run `agentgate t3 connect <link>`. The machines must be paired over Tailscale or in the same relay group. A handoff moves the session between the Claude homes T3 Code's Claude provider uses on each machine, whether that is `~/.claude` or the agentgate home above.
108
108
 
@@ -119,9 +119,10 @@ In the app, the **T3 Code** page shows every machine's threads with **To server*
119
119
 
120
120
  What to expect:
121
121
 
122
- - A working thread is stopped, moved, and continued on the other machine. On the source it is archived, and the uncommitted changes that were sent are kept in a `git stash` so the worktree is clean for the return trip. That stash is dropped when the thread comes back, because its changes come back with it.
122
+ - A working thread is stopped, moved, and continued on the other machine. On the source it is archived, and the uncommitted changes that were sent are kept in a `git stash` so the worktree is clean for the return trip. That stash is dropped when the thread comes back, because its changes come back with it. Gitignored files stay where they are, and the versions that come back replace them.
123
123
  - The other machine reuses a worktree already on the thread's branch, or creates one and runs the project's setup script. Later trips reuse it, so setup runs once per branch and machine.
124
124
  - If the other machine's checkout has its own changes or commits, it keeps them and the handoff reports a warning. Your uncommitted changes then stay where they were.
125
+ - If the other machine has its own version of a gitignored file the thread brings, such as a plan edited there, that version goes to a `git stash` there and the handoff reports a warning.
125
126
  - The first time a thread arrives on a machine, T3 Code fails the first message sent to it there. agentgate sends that message for you, asking the agent to reply "Ready", and sends it again when it fails, so your own first message works. A thread that was working then gets "Continue where you left off.", and messages you had queued are queued again behind it, in order. Background tasks such as a command watching a PR are stopped on the machine the thread leaves, and the agent is told which ones were running so it can start them again. Later trips to the same machine reuse the thread and skip this.
126
127
  - A thread that comes back to a machine shows the messages it got on your other machines in the meantime. T3 Code cannot add them to a thread itself, so agentgate writes them into T3 Code's own database, which T3 Code does not support. If T3 Code misbehaves after a handoff, turn this off with `agentgate t3 history off` or **Show messages from other machines** on the T3 Code page: the thread then shows only what happened on that machine, and the agent still has the whole conversation. Threads that left a machine before this release come back without them.
127
128
  - The first time a thread arrives on a machine, T3 Code's import also picks up other recent Claude sessions run in that project's main checkout, so threads that ran there can show up twice. Threads in worktrees are not affected, and later trips skip the import.
@@ -246,13 +247,13 @@ Running from a git checkout keeps its state in the checkout's gitignored `.agent
246
247
 
247
248
  ## Monorepo
248
249
 
249
- | Workspace | Role |
250
- |---|---|
251
- | `apps/agentgate` (`@agentgate/daemon`) | Bun daemon, standalone CLI, provider proxies, SQLite, sync, and MCP gateway |
252
- | `apps/desktop` (`@agentgate/desktop`) | Tauri 2 shell with React/Vite, system appearance, translucent sidebar, and remembered window state |
253
- | `apps/site` (`@agentgate/site`) | Static Astro landing page for Cloudflare Pages |
254
- | `apps/relay` (`@agentgate/relay`) | Cloudflare Worker and Durable Objects for the encrypted sync relay |
255
- | `packages/protocol` (`@agentgate/protocol`) | Shared control API types and configuration schemas |
250
+ | Workspace | Role |
251
+ | ------------------------------------------- | -------------------------------------------------------------------------------------------------- |
252
+ | `apps/agentgate` (`@agentgate/daemon`) | Bun daemon, standalone CLI, provider proxies, SQLite, sync, and MCP gateway |
253
+ | `apps/desktop` (`@agentgate/desktop`) | Tauri 2 shell with React/Vite, system appearance, translucent sidebar, and remembered window state |
254
+ | `apps/site` (`@agentgate/site`) | Static Astro landing page for Cloudflare Pages |
255
+ | `apps/relay` (`@agentgate/relay`) | Cloudflare Worker and Durable Objects for the encrypted sync relay |
256
+ | `packages/protocol` (`@agentgate/protocol`) | Shared control API types and configuration schemas |
256
257
 
257
258
  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.
258
259
 
@@ -278,10 +279,11 @@ Network partitions can still cause separate machines to compete for a rotating u
278
279
 
279
280
  ## Development checks
280
281
 
281
- Use Bun 1.4.2 and the committed lockfile:
282
+ Use Bun 1.4.4 and the committed lockfile:
282
283
 
283
284
  ```sh
284
285
  bun install --frozen-lockfile
286
+ bun fmt --no-script --check .
285
287
  bun run typecheck
286
288
  bun test
287
289
  bun run build
@@ -296,17 +298,17 @@ bun scripts/codex-smoke.ts # optional: installed Codex CLI, f
296
298
 
297
299
  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:
298
300
 
299
- | Secret | Value |
300
- |---|---|
301
- | `APPLE_CERTIFICATE` | base64 of the Developer ID Application `.p12`, including the G2 intermediate |
302
- | `APPLE_CERTIFICATE_PASSWORD` | its password |
303
- | `APPLE_SIGNING_IDENTITY` | `Developer ID Application: Name (TEAMID)` |
304
- | `APPLE_TEAM_ID` | ten-character team id |
305
- | `APPLE_API_KEY` | App Store Connect API key id |
306
- | `APPLE_API_ISSUER` | its issuer id |
307
- | `APPLE_API_KEY_CONTENT` | contents of the `.p8` |
308
- | `TAURI_SIGNING_PRIVATE_KEY` | contents of the updater key from `bun run --filter @agentgate/desktop tauri signer generate` |
309
- | `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | its password |
301
+ | Secret | Value |
302
+ | ------------------------------------ | -------------------------------------------------------------------------------------------- |
303
+ | `APPLE_CERTIFICATE` | base64 of the Developer ID Application `.p12`, including the G2 intermediate |
304
+ | `APPLE_CERTIFICATE_PASSWORD` | its password |
305
+ | `APPLE_SIGNING_IDENTITY` | `Developer ID Application: Name (TEAMID)` |
306
+ | `APPLE_TEAM_ID` | ten-character team id |
307
+ | `APPLE_API_KEY` | App Store Connect API key id |
308
+ | `APPLE_API_ISSUER` | its issuer id |
309
+ | `APPLE_API_KEY_CONTENT` | contents of the `.p8` |
310
+ | `TAURI_SIGNING_PRIVATE_KEY` | contents of the updater key from `bun run --filter @agentgate/desktop tauri signer generate` |
311
+ | `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | its password |
310
312
 
311
313
  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.
312
314
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanskristoffer/agentpool",
3
- "version": "0.24.0",
3
+ "version": "0.25.1",
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.24.0",
26
- "agentpool-darwin-x64": "0.24.0",
27
- "agentpool-linux-x64": "0.24.0",
28
- "agentpool-linux-arm64": "0.24.0"
25
+ "agentpool-darwin-arm64": "0.25.1",
26
+ "agentpool-darwin-x64": "0.25.1",
27
+ "agentpool-linux-x64": "0.25.1",
28
+ "agentpool-linux-arm64": "0.25.1"
29
29
  }
30
30
  }