Skip to content

Releases: 1ay1/agentty

v0.2.7

Choose a tag to compare

@github-actions github-actions released this 12 Jul 15:13

v0.2.6

Choose a tag to compare

@github-actions github-actions released this 12 Jul 15:05

v0.2.5

Choose a tag to compare

@github-actions github-actions released this 06 Jul 22:38

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 05 Jul 18:04

v0.2.3

Choose a tag to compare

@1ay1 1ay1 released this 05 Jul 12:13

v0.2.2

Choose a tag to compare

@github-actions github-actions released this 03 Jul 16:47

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 24 Jun 21:44

agentty v0.2.0

Choose a tag to compare

@1ay1 1ay1 released this 06 Jun 23:07

Added

  • agentty airgap <host> --acp [flags…] — one-command Zed-over-airgap setup. Running agentty inside Zed on an internet-less remote used to mean hand-assembling a ssh -N -R 1080 tunnel plus a Zed env block. The new --acp form prints a ready-to-paste Zed agent_servers config (and the path to your settings.json) whose command is ssh itself — its args open the reverse SOCKS5 tunnel and exec the remote agentty acp in a single invocation, with the ACP JSON-RPC riding ssh's stdio. One ssh process is the tunnel, the agent, and the transport; Zed owns its lifecycle, so there's nothing to babysit. Everything after --acp (e.g. -m, --profile, --workspace, --sandbox) is forwarded verbatim to the remote agent. Pair with --setup to copy credentials over first.
  • agentty acp now supports session/load — resume past conversations in Zed. The ACP agent advertises loadSession: true and persists every session to agentty's on-disk thread store (threads_dir()/<id>.json, the same format the TUI writes) after each turn, so sessions survive a subprocess restart. On session/load it restores the Thread (preferring an in-memory copy when the session is still live in this subprocess, else reading from disk), replays the entire conversation — user messages as user_message_chunk, assistant text as agent_message_chunk, and each tool call as a tool_call card with its final input/output/status — as session/update notifications, then resolves the request, exactly per the ACP spec. Session ids are real ThreadIds, so ACP sessions also appear in the standalone TUI's thread picker (and TUI threads are loadable from Zed). Fixes the "Loading or resuming sessions is not supported by this agent" error.
  • agentty acp ACP refinements: model + permission-profile flags, file follow-along, faster cold start. -m / --model is now an ephemeral per-subprocess override in ACP mode (it no longer clobbers the TUI's saved model), so a Zed agent_servers entry can pin a fast model (e.g. claude-haiku-4-5) without touching your interactive default. A new -p / --profile {ask|minimal|write} flag tunes which tools trigger Zed's permission prompt: ask (default — prompt write/exec/net, auto-run reads), minimal (prompt everything including reads), write (never prompt reads). Tool calls now carry ACP locations (file path + optional line) for read/edit/write/list_dir/git_diff/diagnostics, enabling Zed's "follow-along" file highlighting. ACP mode now prewarms the TLS/DNS connection to Anthropic before serving (matching the TUI), eliminating the ~150–300 ms handshake on the first prompt, and the wire tool list is built once instead of per-completion.
  • agentty acp — run agentty as an ACP agent inside Zed (or any Agent Client Protocol client). A new headless subcommand speaks newline-delimited JSON-RPC 2.0 over stdio and implements the full ACP v1 agent surface: initialize (capability negotiation), authenticate, session/new, session/prompt (drives a complete agent turn), and session/cancel. While a turn runs it streams session/update notifications — agent_message_chunk for model text, tool_call / tool_call_update for every tool (with ACP kind, rawInput, status transitions, and diff content blocks for edit/write so Zed renders changes inline) — and calls back with session/request_permission before any side-effecting tool runs (Exec / WriteFs / Net), letting Zed show its native approval UI. The headless loop reuses the exact same provider, tool registry, wire-message shaping, workspace sandbox, and permission policy as the TUI (no maya/UI dependency), so behaviour is identical to interactive agentty. Configure in Zed's settings.json under agent_servers with { "command": "agentty", "args": ["acp"] }; auth comes from your existing agentty login. See README → “Use agentty inside Zed (ACP)”.

Fixed

  • Per-error-class retry caps (Zed-aligned) so a flaky mid-stream wire stops spamming the retry banner. Previously every transient shared one global kMaxRetries (6), so a connection that kept cutting out mid-body stuttered through six loud transient — retrying (attempt N/6)… banners before giving up. Mirroring Zed's agent loop (crates/agent/src/thread.rs::retry_strategy_for), the cap is now per error shape via provider::max_retries_for: rate-limit / overload (429 / 529) keep the full budget (the server is shedding load and usually hands a Retry-After), a clean connect blip with no content keeps the full budget (a fresh connection almost always recovers), but a mid-stream failure — the stall watchdog fired, or the stream had already delivered a delta this turn and then died — gets only 2 attempts, because a wire that keeps dropping after reaching us is a real outage, not a reconnect artifact. The attempt counter in the banner now shows the real per-class cap (N/2 mid-stream, N/6 otherwise). Budget-decay and the first-delta/heartbeat budget reset still apply on top, so a stream that recovers and runs for a while resets to a fresh ladder.
  • x-stainless-retry-count now reflects the real attempt number. It was hard-coded to 0, so every retry looked like a fresh first attempt to Anthropic's edge — which reads this header for routing and to avoid penalising retried traffic, and could land a retry back on the same overloaded pop. The per-turn transient_retries count is now plumbed through provider::Requestanthropic::Request → the header, exactly as the official SDK / Zed increment it.
  • Frequent transient — retrying… banner caused by stale pooled connections. The dominant trigger for the orange retry banner was a reused h2 connection that Anthropic's edge (or an intermediate proxy) had silently half-closed: the pool's acquire-time liveness checks (nghttp2 protocol state + a non-blocking MSG_PEEK) passed because the FIN/GOAWAY was still in flight, so a corpse got handed out. The new stream submitted on it was immediately RST_STREAM'd / GOAWAY'd — and because the old retry gate (any_bytes, set on headers) considered a headers-only :status block "committed," the HTTP layer couldn't re-dial. The error bubbled to the reducer, which restarted the whole turn loudly with backoff. Two transport-layer fixes: (1) the stream-commit point is now real SSE DATA (on_chunk with body bytes), not headers — a stream that got only :status before the reset is replay-safe and re-dials transparently; (2) a reused pooled connection that dies before delivering any data gets up to 2 free fresh re-dials that don't count against the transport attempt budget, so a pool-staleness artifact never surfaces as a user-visible error. Genuine fresh-dial failures and any reset after real content still converge to a terminal error exactly as before. This is what the official Anthropic SDK / Claude Code get for free from undici's managed pool (honor GOAWAY, retry transport resets on a fresh connection); agentty now matches it.
  • Transient backoff that never recovered + frequent "stream stalled" after long sessions. transient_retries only reset to 0 on the first content delta, so a stream that connected, sent heartbeats, then went silent before any byte (common during brown-outs and long opus turns) climbed the retry ladder every attempt until it hit kMaxRetries and latched terminal — the session was dead until restart. Two fixes: (1) a heartbeat (SSE ping / thinking_delta) now resets the retry budget too, since it proves the wire is alive even pre-content; (2) the budget decays over wall-clock time — if the previous failure was longer ago than kRetryDecayWindow (90 s) the connection was healthy in between, so the new failure starts a fresh ladder instead of inheriting an unrelated earlier blip. Net effect: fast-failing connections (refused/reset within 90 s) still converge to terminal at attempt 6, but slow stalls minutes apart recover indefinitely. Esc still breaks the loop at any point.

agentty v0.1.1

Choose a tag to compare

@1ay1 1ay1 released this 06 Jun 20:24

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 01 Jun 14:36