Skip to content

Version 0.28.0

Latest

Choose a tag to compare

@umputun umputun released this 09 Sep 18:39
6305191

New Features

  • Live panes keep their agterm attribution across a restart. A Live pane's session outlives the agterm process that started it, and macOS then charges its microphone and App Data requests to each command inside the pane rather than to agterm, so the consent dialog returns on the next command and reattaching does not stop it. agterm now runs a small bundled host, one per state directory, that outlives the app and keeps those sessions resolving to agterm. Verified on a signed build: a microphone request from a pane created through the host was charged to the app under the existing grant, with no new dialog. Panes created before this version keep the old behaviour until they are recreated; restarting does not repair them. agtermctl tree reads the state back per pane #574 @umputun
  • the remote host on a session attached to another Mac. The title bar shows a cloud and the ssh target after the session and window names, on line one in both normal and compact modes, and remote sidebar rows take the same cloud in place of the arrow-in-rectangle glyph. It is shown by default and hidden with Remote host in Settings > Interface. The host takes its natural width up to 240 points and truncates in the middle when space is short; on a narrow compact bar the identity and the host keep their place ahead of the session context #572 @umputun
  • three control-API additions. The tree reports a split pane's working directory as splitCwd, the one thing a caller could not read about a split it could otherwise inspect; it falls back to the restored directory and then to the primary's, so the human tree line prints it only when it differs from the primary while the JSON carries it either way. window resize now answers with the size it actually applied, which can be smaller than asked when the window minimum or the display's visible frame clamps it, instead of a bare ok that left a second window list as the only way to find out. zmx attach takes --window, so a script can place a remote session in a background window without selecting that window first and moving the user's focus; an invalid or closed target fails without creating a session rather than falling back to the frontmost one #566 @umputun

Improved

  • two cookbook recipes. remote-claude-session runs Claude Code in a tmux session on a remote host from one chord, so closing the laptop no longer takes the agent with it: the tab reconnects by itself after a dropped connection, comes back reattaching after an agterm restart when Restore sessions is on Re-run commands or Live sessions, and the agent's status still reaches its sidebar row through a relay on the Mac that accepts one line and only if it is a status for the tab it was started for. claude-account-swap switches the left pane between two or more authenticated Claude accounts and carries a summary of the conversation you were having into the new one, so the work continues instead of restarting; it identifies both the transcript and the account it belongs to from the map Claude itself writes, and refuses the switch when that map's owning process is gone, replaced or backgrounded #563 @andr81 #571 @umputun

Bug Fixes

  • a chord fired from a scratch or overlay pane could run against a different session than the one on screen, with ordinary unique session ids. The sidebar selection moves ahead of the asynchronous focus handoff, and in that interval the chord matched no session and built its context from the active one instead, so every $AGT_SESSION_* value described a session the user was not looking at and a command typing back through session type --pane could write into the wrong shell #568 @umputun
  • reopening a session from Recent Closed into a different window and then undoing the original close could leave the same session live in two windows, after which every lookup keyed on its id answered with whichever window came first. Reopen now restores into the window that still owns the session, its own window ahead of the one holding its workspace, and rebuilds nothing another open window already holds. An incomplete restore keeps the recent entry until every member is accounted for, since a member left in no window would otherwise become unreachable the moment the entry went #568 @umputun
  • window list kept naming the previous window as active after another window was revealed, while untargeted commands already routed to the new one, so a script reading the active window acted on the wrong one. Revealing a window assigned the frontmost id without publishing the change, and the reporting path gates both the saved index and the change notification on that id having changed 9416408 @umputun
  • renaming a session in the flagged sidebar view stripped the row's : workspace tail, leaving it reading api where its neighbours read api : work until a badge or status delta redrew it. The editor seeds its field with the bare session name so an edit cannot bake the decoration into the custom name, and nothing put the tail back when the rendered label did not change f81b4db @umputun
  • the two-agent chat recipe refused to send while Claude Code was drawing one of its own suggestions in an idle composer. agterm drops the dim styling that marks a suggestion, so on pane text alone it reads as a draft, and a mid-session suggestion is a free-form prediction with no fixed wrapper that no text pattern can separate from one. The check now gates on where the caret rests rather than on the composer's content #569 @umputun #564 @pySilver

Signed with a Developer ID certificate and notarized by Apple, so macOS Gatekeeper opens it with no extra steps. Apple Silicon (arm64) only, macOS 14 or later.

  • Homebrew: brew install --cask umputun/apps/agterm
  • Direct download: open the .dmg and drag agterm.app into /Applications.