Skip to content

Releases: tan-zhuo/AgentMux

v0.1.2

Choose a tag to compare

@tan-zhuo tan-zhuo released this 17 Aug 13:20
Manage this computer as a host of its own

The machine AgentMux runs on was the one machine it could not work on,
which is odd for a tool whose whole subject is where work runs. It is now
a host like any other: the same tree, the same shells, the same file
browser and editor, agents in a local tmux session — so quitting the
application does not stop them here either.

The transports are now a seam rather than an assumption. sshx grew a
Session and an Opener interface, so one shell manager keeps its
scrollback, its coalescing and its exit events for both, and the command
line that folds cwd and environment into a terminal is shared instead of
duplicated. A dispatching runner sits where the pool used to, so tmux,
agent detection and host metrics reach a local host without knowing there
is such a thing. internal/localx is the other side: commands through a
login shell, a real PTY, and file operations that mirror the SFTP
client's shapes and its refusals — directories, oversized files,
binaries, and the modification-time guard that stops a save from
overwriting an agent's change.

A local host has no address and no credentials, so the row stores none
and Resolve refuses it outright: every SSH path that could be reached
with one fails with a sentence rather than dialling "". It is not trusted
either — the orchestrator asks here for the same reasons it asks
anywhere, and this happens to be the machine with the user's own files on
it. Uploads and downloads are refused as meaningless: the file is already
here.

On Windows a local host is WSL. That is not a shortcut but the only
honest reading of the promise this makes — work survives the window
closing because it lives in tmux, and tmux exists there only inside WSL —
so commands run through `wsl -e sh -lc`, paths stay POSIX throughout, and
the file layer reaches them through the share Windows exposes the WSL
filesystem on. Without a distribution the host is not offered, with the
sentence that says how to get one.

The local transport is the one part of this that can be tested without a
server to talk to, so it is: real processes, a real PTY, real files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LpH1xG13FmqbgJrzezczfA

v0.1.1

Choose a tag to compare

@tan-zhuo tan-zhuo released this 17 Aug 07:47
Put the chrome back a shade, and fill the selected file row

Lifting the sidebar, inspector and title bar to ink-850 collided with
every raised card inside them, which was already ink-850 — the metric
cards vanished into their own container. The content plane is pure black,
so ink-900 chrome is layered enough on its own, and it leaves ink-850
free to mean "raised". In light mode that is also the iOS grouped look:
grey ground, white cards.

The file list now fills its selected row and turns everything in it
white, the way Finder does, with the cells' own greys overridden rather
than left to be illegible on system blue.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GpqNMx6Usfeoq7vB9HQxT

v0.1.0

Choose a tag to compare

@tan-zhuo tan-zhuo released this 17 Aug 06:35
Diagnose an unreachable Ollama by error type, not by error text

CI disagreed with a laptop about what a refused connection to port 1
says, so the diagnosis fell through to "Could not reach Ollama at …" —
a sentence that tells a reader nothing the screen had not already told
them, and two tests said so.

Matching on the operating system's wording was the mistake. The causes
are recognised by type now: ECONNREFUSED, net.DNSError, and the deadline
errors. The fallback carries the underlying error and still names the
first thing to try, because if AgentMux cannot reach Ollama then "start
Ollama" is worth saying however the failure was worded.

The branches are pinned against synthetic errors, so no machine's phrasing
can decide whether they pass. The two tests that go through a real socket
now assert only that the answer is useful.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GpqNMx6Usfeoq7vB9HQxT