Repository navigation
Releases: spacesheep-dev/sessionpipe-gui
Release list
sessionpipe-gui v0.7.3
Fixed
- The pairing link the terminal prints names a passkey origin.
sessionpipe control pairprinted the address the daemon reached the GUI on (a tailnet IP, a LAN name), and
a page on that address can neither read the board without its key nor make or use a
passkey, which belongs to the https host or to localhost. The link now names an origin
passkeys work on: the daemon's own when it is one, else the first. Seen pairing a Mac
mini with the GUI on a laptop: the printedhttp://100.68.187.81:7373/pairlink met the
key wall, then "Sending works from https://…; open it there".
sessionpipe-gui v0.7.2
Fixed
- Files shows the text of a file the agent read. Claude Code hands a Read's result
to its hooks as an object (the file's lines, from the line it started at), and the
drawer only knew the numbered text older builds sent, so every file the agent only read
said "Nothing to show yet", and an edited one showed its edits with no text around them.
Both forms read now, and the edits apply to the text they changed. - The app says "confirm with Touch ID" only when Touch ID will ask. With the day's
grant held, an answer or a message is signed with the day key and no sheet comes, but
the app said "confirm with Touch ID" while it signed, so a slow send read as a Touch ID
prompt that never showed. It now says so only for a confirm, a fresh grant, or when no
grant is held, as the browser does.
sessionpipe-gui v0.7.1
Fixed
- A harness that a program starts and stops no longer fills the board. An IDE that
probes its provider (bb'sprovider-maintenance-workspace, for one) starts Claude Code
and stops it without a prompt, many times a day, and each probe was a row: untitled,
"unattended", under Idle or Done. A session nothing has happened in (no turn, tool,
subagent, prompt or ask) that is unattended or has already ended now stays off the
board, the palette, and the folders and agents New session, Ask another agent and a
workflow step offer, until its first turn; its end is no longer news. The receiver
keeps it, so its page and Search still find it. A terminal someone has just opened
stays on the board, so its first message can come from here.
sessionpipe-gui v0.7.0
Added
- The phone's first run. With no computer connected yet, the iPhone and Android
apps open on the lockup and three ways in: scan the code under Connect on your
computer (a full-screen viewfinder; the camera is asked for only then), enter its
address, or try the demo. A code the app can't use, a refused camera, a computer out
of reach and the TLS code's trust page (open it in Safari, come back, Connect) each
get one plain screen. Once the board is up, one sheet says the step left: the
computer approves this iPhone once, where that is in the computer's own labels, "Ask
to approve" (which files the request) and Later. - Files beside a session. A Files button on the session's bar (and the panel's head,
⇧F, the "⋯" menu) opens a drawer of every file the session read or changed, from the
events it already sent: the receiver's index of the whole session
(GET /api/ui/sessions/:harness/:id/files, the same reading the Review page makes) and
the live events since; nothing is asked of the machine. The list is the repo's tree, by
folder, each file with what happened to it and when; a filter narrows it; a file can be
marked viewed. - A file's changes, its text, and every version. A file opens on its Changes: the
lines taken out and put in against the text the agent last read, the rest folded past
three lines of context and opened in place; Text is the whole file as it stands,
rebuilt from its last Read or Write with the Edits after it applied in order and the
lines they wrote marked (hover one for the edit that wrote it). Every Read or Write the
agent made is a version, one step away. Edits the text cannot hold (a patch, a page of a
big file, a notebook cell) read as hunks. The page's?file=<path>opens the drawer on
one file; "Copy link to this file" writes it. - Comment on a line to ask for a change. Click a line number (shift-click, or ⇧↓, for
a range) and say what should change, or suggest a replacement for the lines; a
comment can be on the whole file. The comments gather at the drawer's foot and go to the
session as one review message (path:line, the lines quoted in a fence tagged by the
file's language, "Replace with:" for a suggestion, a per-item reply asked for), the same
signedpromptthe composer sends, or into the composer to finish by hand. While the
agent is mid-turn the button says the review is read when the turn ends. Afterwards the
list says which files changed since your review. - Problems. The drawer's second tab lists every tool that failed and every error the
session raised, each a jump to its row in the timeline. - Open in editor. Where the session runs on this machine, a file opens in VS Code,
Cursor, Zed or Windsurf (the drawer's "⋯" chooses), at the commented line. - The drawer from the keyboard.
⇧Fopens it with focus in the filter; ↓ ↑ (j k) move
over the files and the lines, Enter opens a file or the comment on a line, n and p go to
the next and previous change, Esc steps back (the comment, the file, the drawer) wherever
focus is. Focus follows each step and returns where it was on close; over the timeline
(the panel, a narrow page) what is under the drawer is inert meanwhile; a status line
says what happened for a screen reader; forced colours draw the changes as borders. - Go to file from ⌘K.
/then a path finds any file changed in the last thirty days,
across every session and machine (the Review page's reading); a query that reads as a
path brings the files in beside the sessions. Enter opens the newest session that touched
it, on that file; a file several sessions touched asks which (›); ⇧↵ opens it beside.
On a session's page, "Files of this session" toggles its drawer.
Changed
- The phone's Settings › App no longer shows the Mac's rows (the Dock badge, keeping
the app running with the window closed) or names System Settings; the device key's
rows and the device request say "this iPhone" / "this phone".
Fixed
- The phone app at tablet width (an iPad): the rail's head and the page bar start under
the status bar, and the compose glyph no longer pushes the mark off the rail's edge.
sessionpipe-gui v0.6.2
Added
- Pull down to refresh on the phone's list pages (Board, Inbox, Search, Feed, Review,
Machines), as a native list does: a ring draws in the tint as you pull, a tick as it
arms, and the stream reopens for a fresh snapshot. While the stream is down the same
pull is the retry. - The phone's tint. The sessionpipe orange on the selected tab, the back chevron, a
sheet's Cancel and Start, a switch that is on, the text-size slider, the caret and
links. Needs you keeps its own orange; everything else stays graphite. Skins may set
--tintand--tint-fg. - The phone app feels native. Taps and outcomes play the phone's haptics; the status
and navigation bars follow a forced Light or Dark (or a one-scheme skin); the edge swipe
goes back on iPhone and the back button goes back on Android instead of closing the
app; the session's message bar rises above the keyboard on iPhone. - Push and pop. Opening a session from a list slides it in as a native push and Back
slides it out, the tab bar staying put; the back button names the page it returns to.
Changed
- The phone's tab bar and bars are translucent material, as iOS's are, with the page
blurring under them (solid under Reduce Transparency). - Rows highlight under the finger and release as native cells do; an empty Inbox or Feed
centres on the screen. - The phone names the device it runs on: "Approve this iPhone", "Face ID signs what
you send" (on Android "this phone" and "your fingerprint") everywhere it said "this
Mac" and "Touch ID". - On the phone an Inbox row, and anything that opens a session "beside", opens the
session's own page, pushed with Inbox behind Back, instead of the desktop's panel as a
sheet; the panel is never restored on the phone at launch. - A dropped stream on the phone is said under the large title ("Reconnecting · 3 s ·
Retry") instead of a pill over it; the pill stays only on pages without one. - With a permission pending on a machine the phone isn't paired with, the session's dock is
the Allow and Deny card alone with one hint, and a command moves to the next line whole
with its question mark. - In the phone app the Inbox's notification banner and bell read the app's own permission
("Notifications are off · Turn on", or "Open Settings" once refused), and the empty
Inbox no longer talks about "this page" or "your phone".
Fixed
- Notification banners on the phone fit the screen on every title length and sit under
the status bar; a long one ends in an ellipsis instead of running off the edge. - Every scrollbar on a desktop is the app's own: a thin grey thumb on no track, the
window's and the popovers' included (the Mac app showed the OS's), and the Display
popover can no longer scroll sideways. - The Add account sheet is New session's dialog: 640 px under the title bar over a
scrim that dims the whole window, Cancel and Sign in in its footer (in the top bar on a
phone), the command and the sign-in as grouped rows. It had taken the Usage page's
reading measure and left the sidebar undimmed. - "Sign in to Claude…" on a machine whose pool is off turns the pool on first, then
opens the sign-in, and says so, instead of being refused with "the pool is off on that
machine".
sessionpipe-gui v0.6.1
Added
- The Mac app updates itself. Settings › App › Updates has "Check for updates
automatically" (on by default: 10 s after launch and every 6 hours), the version you have,
"Last checked 5 min ago" and Check now. A newer release is downloaded in the background
and verified against sessionpipe's key; then "0.7.0 is ready" with Install and relaunch
in Settings and the menu bar item. "Check for Updates…" in the app menu runs the same check
and, with no window open, answers in a dialog: up to date, ready to install, or why it
failed. A failed check says so in plain words (offline, no manifest, no build for this
computer, a signature that doesn't match) and leaves nothing half-installed.
Fixed
service installupgrades the service it finds instead of refusing. The app's
"Start sessionpipe" (and the command) used to stop at "a service is already installed"
whenever an earlier version had installed the LaunchAgent / systemd unit, which is every
upgrade of the app. Now a service of ours under the label is rewritten in place with this
version's node and cli (its port, state dir and options kept unless flags say otherwise),
restarted (launchctl bootout+bootstrap;systemctl --user daemon-reload+restart),
and waited for until the new version answers:updated dev.spacesheep.sessionpipe-gui: 0.4.1 → 0.6.0. The same service answering already isalready running 0.6.0 on …(exit 0); one
still starting is left to it. A plist under our label that runs something else is still
refused, as is another program on the port.--dry-runshows the rewrite and the restart.- A big board gets time to start. The installer waited 10 s for the receiver and then
printed what read as a failure, while a 1 GB state dir takes ~30 s to index at boot. It now
waits up to 90 s (SP_SERVICE_WAIT_MS), says what it is waiting on ("starting on :7373…
283 sessions to load; a big board takes a minute"), and a service that is running but not
answering yet ends with "still starting", exit 0. The desktop app shows those lines on the
welcome ("Updating sessionpipe 0.4.1 → 0.6.0…", "Starting… this can take a minute on a big
board") and waits as long itself. service uninstallno longer says "still loaded" on the first call:launchctl bootout
returns before the job is gone, and the command now waits for it (as the upgrade's
restart does before it bootstraps again).service statusprints the running receiver's version beside the pid.- The Windows installers build again:
icons/icon.icois in the bundle's icon list, where the MSI
bundler looks for it.
sessionpipe-gui v0.6.0
Added
- A session another session launched (
session.launched_by, sessionpipe 0.10.0) says so in its
header with a link to the launcher, and the launcher's header links what it launched. Neither is
read as a subagent: no nesting, no muted toasts, no "N subagents" count. - A paired machine you rely on that went offline gets one quiet line at the top of the
board: "build-box is offline, last heard 14:02. 2 messages wait until it's back.", with
Machines beside it. Only a paired machine with a message waiting or a session that needs
you, works or went stale counts; one that only sends events has no heartbeat and is never
called offline. × hides the line on this device until something changes: it clears
itself when the machine is back, and a new drop brings it back. - Since you looked. An idle or done session with news you haven't seen (a turn ended
or the session ended since you last had it open) draws its glyph filled in, in ink, and
the folded Done header says "3 unread". Opening it for a second, as a page or the
panel's tab, marks it read on every device. A turn you typed at the terminal of a
session you attend is not news; working, needs-you and unattended rows are never
unread, and nothing from before the first run is. - Mark as read / Mark as unread in an idle or done session's menu and the phone's
long-press sheet,uon the board's cursor, and Mark all as read in the board's
view menu. The marks live in<stateDir>/marks.json(GET/PATCH /api/ui/marks, a
marksframe on every change); a forgotten session loses its marks. - Notify me, per session. Every session's menu (and the phone's long-press sheet) has
Notify me: When it needs me, as before; When it needs me or finishes, which
also sends "Deploy billing finished" with its last answer each time it has news and is
idle or done (a click opens it); or Never, which sends no notification, banner or
sound for it while it still waits in Needs you and the Inbox. A row set to Never shows a
small bell with a slash. A parent session can quiet its subagent sessions, never make
them louder. The choice is kept inmarks.json(notify), so it holds on every device;
the browser's permission, the global Notify me and sounds stay per device. - A New line where you left off. A session with news since you looked opens with a
quiet "New" hairline above the first answer you haven't read, in Simple and Advanced
and on a phone. When there's more than a screen of it, the session opens with the line
a third of the way down instead of at the bottom. Your own turns at the terminal never
count, the line doesn't move while the page is open, and it's gone when you come back.
A session you haven't opened yet opens at the bottom as before. - Hidden sessions can be found again. The board keeps what this device hid in a
Hidden group after Done, folded like Done and under the same filters; its rows are
ordinary rows, and Unhide (the row's menu,e, a phone's trailing swipe) puts one
back in its state's group. - Hide until it needs you, below Hide in a row's menu (or
⇧E), for a session that
loops ("every 30 minutes, check the nightly build"): new turns leave it hidden, and it
shows only while it needs you.ehides or unhides the row under the cursor. - How much each account has left. A Usage page, a line per account in the sidebar, and
each agent in New session say how much of its 5-hour and weekly windows is left and when
they reset, from sessionpipe'slimits.observed. Claude Code's week is "This week, all
models"; a per-model week it adds later shows as its own row ("This week, Fable only").
A window past its reset says so instead of its last number, and a report older than 15
minutes says how old. On a machine whose agent has two accounts there is no number, since
a start can't choose one. Claude Code's numbers need its status line, on Pro and Max:
sessionpipe install --status-line. Harnesses with no source say so in one line, never
0%.g uopens the page; the sidebar lines can be hidden in Settings › General. - Several Claude accounts on one machine. A machine whose sessionpipe pools accounts
(sessionpipe pool, 0.11) says so in its hello, and the GUI reads the pool: the accounts
in the machine's order, which one is in use, which is used up and when it is back, which
needs signing in again, and each one's freshest numbers on the Usage page even while it is
idle. Turning the pool on or off, reordering, enabling, disabling, removing and refreshing
an account, and signing a new one in, are signedpoolcommands through the same channel
as everything else, verified here before they are carried; a machine whose hello has no
pool is told so before anything is queued. A session the pool moved to another account
says which one serves it and since when, and its chat shows the switch. Demo mode has a
machine with the pool on, one with an account in error, and one with the pool off. - Agents that use agents. sessionpipe's next release lets a session ask another agent
on its machine (sessionpipe ask codex "…") and lets a receiver hand a task to an agent
with the answer brought back into a session (reply_toon a signedpromptor
start). The GUI reads the two events,delegation.startedanddelegation.ended, into
the session (delegations,delegatedBy,counts.delegationsRunning), keeps a session
working while an ask is open, and shows a capability only where a machine's hello says
askorhandoff, so a 0.10 daemon keeps working as before. - Ask another agent… on a session's page (the control strip, its menus, a reply's
right-click "about this…", ⌘K, ⇧A): one sheet, prefilled with the last reply, that asks
an existing session on the same machine or a new one of a harness the hello lists, with
"Bring the answer back into this session" where the machine takes handoffs. The asking
session shows the row at once. - Lineage. "Asked Codex · new session · running 1 m 20 s" where the ask happened in the
chat and the timeline, the answer folded under it or drawn as that agent's turn when it
was brought back; the asked session's bar says "for " with a link; the board nests
it under its parent; Machines says "Agents here can ask each other"; the Feed and the
Activity page word the events and the handoff. - Workflows (
/workflows,g w): chain and fan out steps across your agents and
machines (implement → review → fix; two agents in parallel, a third compares). Three
templates, an editor of native rows that saves itself, Run with the input it names, and
a run view with every step's state, elapsed, reply and session. The server owns a run
(workflows.json,workflow-runs.json, moved by control's acks); the browser is only
the signer, from any device that can sign, with claims as the guard across tabs. A
browser signs the runs it started on its own; one started elsewhere asks once ("Sign
here"), so nothing on the loopback or another site can set your passkey to work. The
signed command goes back through the run itself, queued only once the server has seen
the step is still that tab's: a step cancelled or re-offered mid-signature queues
nothing, and one the receiver refuses fails in place instead of being offered again
every minute. A step is never signed without the level or model it names when the
machine's hello does not offer it; the run says so. Every write to/api/ui/workflows
is JSON only, an empty POST too, and refuses a cross-site request. - Demo mode plays an ask and a handoff on lab-mac, whose hello now says
askand
handoff; the mock stream has the same.
Changed
- A chained shell command reads one step per line on a session's permission strip:
"Allow Bash to run:", thennpm run build,&& npm test -- bm25,&& npm run deploy …
each on its own line, so nothing wraps mid-token before you answer. Quotes,$( … )and
groups stay whole, a pipeline is one step, and a short command stays on the question's
line. The command is the call's own, whole, when the session sent it; otherwise the
first 200 characters the machine sends, ending in "…". Four steps show, then "Show 2
more lines", and Deny and Allow keep to the question's line. On a phone a longer one
scrolls inside, cut through a line, so you see there is more. - A plan review reads as a plan. When Claude Code asks to leave plan mode, the strip
asks "Ready to start on this plan?" and shows the plan under it (at tier 3), eight lines
until Show the whole plan, with Approve plan and Keep planning where Allow and
Deny were;aanddare unchanged. Keep planning carries what you type in the composer
("What should change?") to the agent as the answer's note, and Enter there sends it.
While the composer holds a note, Approve plan waits, so the note is never dropped: send
it with Keep planning, or clear it. The row menus, the command palette and the Inbox
name the same two answers, and the tool reads Plan.
Fixed
- The row menu says "Allow Shell" (and Deny), as the strip and the Inbox do, not
"Allow run_shell_command".
sessionpipe-gui v0.4.1
Fixed
- Approving the Mac app says how. Its page names the two ways: open Machines in the
browser that holds your passkey (a link opens it), or runsessionpipe control pairon
the machine and approve it in the app with Touch ID. "Sign with Touch ID" is now
Approve this Mac, and a composer on a machine that doesn't trust this Mac yet says
what approving does. - A passkey prompt that never shows no longer leaves Approve spinning in the browser:
after eight seconds the row says where the passkey may be and what else to try. - Setup in the app. Step 2 no longer asks for passkeys on the app's page (Touch ID
signs there; the https address is the phone's), so the sidebar's Setup dot can clear.
Step 3 is done only once the paired machine trusts this Mac, with Approve this Mac until
then.
sessionpipe-gui v0.4.0
Added
- sessionpipe 0.10.0. A machine in
inheritmode (no permission flag: its agents run
as your own sessions there do, whatever their settings allow) shows as that, with one
line saying what it means, on Machines, the pairing page and the New session picker,
never as safe or auto; the well-known sayscontrol.inherit: true, so a 0.10.0 machine
may pair or switch to inherit with this receiver. New session there defaults to "As your
own sessions on this machine", which is sent as no level at all, and offers Read only
and Safe; nothing wider is offered or queued there, andinheritis never signed. An
ack'sapplied: inheritreads "As your own sessions". - A session waiting on its own background work (
turn.ended.background) stays
working, "waiting on 2 background tasks", until it wakes, instead of going idle. - Unattended runs (
session.attended: false): a short one is drawn quiet on the board
("unattended"), and no unattended run raises a banner or a notification; absent is
unknown and changes nothing. - Who submitted a turn (
turn.started.submitted_by): a scheduled, loop or system turn
says so under its prompt and on its row while it runs; an injected turn (a task
notification) never becomes the row's last ask. - Accounts named by host (an API home,
api.z.ai): kept from the hello'saccounts
without an email and listed on Machines. - ACP agents: labels and monograms for the ACP registry's harness names, Machines lists
what a daemon can start, New session offers them with no permission or model pickers,
and a start delivered overapisays "Ran on …" with its reply. - Demo mode pairs two machines: studio-mac on 0.10.0 in inherit mode (goose among its
agents, an api.z.ai account, a start it ran over ACP) and build-box on 0.9.0, and plays
background work, a scheduled turn and a short unattended run.
Changed
-
The hello's
homeis gone (0.10.0 sends none). A start's folder may be~/…where the
machine's hello hasstartand this receiver's sessionpipe-core takes one (feature
detected,server/control/tilde.ts); otherwise folders stay absolute, from the
machine'sfolders. -
The receiver's second look at a command follows 0.10.0: the closed field set per kind,
files on a prompt only for a machine that saysprompt_files, and a level at most Safe
on an inherit machine. A hello keeps up to 64 harnesses. -
The Mac app sends. The macOS release carries its Touch ID signer: a key in the
Mac's Secure Enclave signs new sessions, prompts and permission answers, from the window
and from a notification's Allow, Deny and Reply. Set it up once with Sign with Touch
ID (on Machines, a session's composer or Settings › App › Signing): a browser or phone
the machine already trusts approves the Mac with its passkey, and then one Touch ID a
day unlocks sending. It needs a receiver whose sessionpipe-core verifies device keys and
a machine that takes them (sessionpipe 0.10). The release needs no new entitlement. -
Where the app can't send, it says exactly why, with the next step: this build has no
signer (Linux, Windows, a dev build), the receiver can't check the Mac's key yet (update
sessionpipe-gui), the machine predates device keys (update sessionpipe there), or the
Mac isn't set up for that machine yet (Sign with Touch ID). Notifications offer Allow,
Deny and Reply only once the Mac holds a key for that receiver.
sessionpipe-gui v0.3.2
Fixed
- The desktop app opens on the receiver it finds. 0.3.1 found a receiver already
running on this Mac and selected it, but kept the window it had opened with none, so the
board stayed on its first frame for good. Selecting a receiver now rebuilds any window
that doesn't show it; the same fix covers the welcome's Start sessionpipe and Connect. - The board and the inbox never sit on loading rows without saying why: after a few
seconds they say they're still connecting, or that the connection is down, with Retry
now. A stream that opens but never sends its first update is opened again. - The desktop app gives up on a receiver that accepts the connection and never answers
(20 s), and writes dropped streams and failed requests to its log (no keys, no queries).