tesser dev
printed, http://<box_id>.localhost:<port>, and that is the whole story.
When it does not, or when the browser should outlive the laptop’s lid, it
runs one on the worktree’s workbench instead. The workbench reaches every
box in the org at that same address (see
localhost), so nothing has to be
tunnelled, declared, or wired for it.
Setup
Once per workbench. This installs agent-browser, a CLI that drives a headless Chrome and keeps it running between calls, and the Chrome it needs.--allow-scripts is npm 11 asking permission for the package’s postinstall,
which downloads the platform binary. --prefix /usr/local puts the binary
where exec finds it. And --no-sandbox in the config is Ubuntu 24.04:
it restricts unprivileged user namespaces, and Chrome refuses to start
without them unless told to skip its sandbox. Writing the flag to
~/.agent-browser/config.json once beats passing it on every call.
The workbench keeps all of it until tesser rm, sleep included.
Looking at a page
exec is a round trip of about a second. The browser is one process
on the workbench that agent-browser starts on the first command and keeps
around, so the page, its cookies, and a sign-in persist across calls, and
across a tesser sync of the box being looked at. agent-browser --help
lists everything else it can do; agent-browser close ends the session.
Any box in the org is reachable this way, not only your own: a teammate’s
dev box, or the shared instance of api at http://api.localhost:<port>.
A port the box does not declare is refused. Bare localhost:<port> on the
workbench is the workbench itself, which runs no server.
When the workbench sleeps
A workbench sleeps after ten minutes without a command from the laptop, and the browser is a user process, so it goes with the box. The nextexec
wakes the box (about a minute) and the next open starts a fresh browser;
the install stays. While the agent is driving it, every exec resets the
idle clock.