Skip to content

Releases: spacesheep-dev/sessionpipe-gui

sessionpipe-gui v0.7.3

Choose a tag to compare

@github-actions github-actions released this 03 Nov 12:33
80a1445

Fixed

  • The pairing link the terminal prints names a passkey origin. sessionpipe control pair printed 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 printed http://100.68.187.81:7373/pair link met the
    key wall, then "Sending works from https://…; open it there".

sessionpipe-gui v0.7.2

Choose a tag to compare

@github-actions github-actions released this 03 Nov 01:45
6d7b691

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

Choose a tag to compare

@github-actions github-actions released this 02 Nov 21:46
334f2b5

Fixed

  • A harness that a program starts and stops no longer fills the board. An IDE that
    probes its provider (bb's provider-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

Choose a tag to compare

@github-actions github-actions released this 31 Oct 09:18
62aa52f

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
    signed prompt the 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. ⇧F opens 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

Choose a tag to compare

@github-actions github-actions released this 30 Oct 19:23
1dee4b9

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
    --tint and --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

Choose a tag to compare

@github-actions github-actions released this 30 Oct 00:19
78a1258

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 install upgrades 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 is already 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-run shows 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 uninstall no 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 status prints the running receiver's version beside the pid.
  • The Windows installers build again: icons/icon.ico is in the bundle's icon list, where the MSI
    bundler looks for it.

sessionpipe-gui v0.6.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 18:50
f157439

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, u on 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
    marks frame 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 in marks.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. e hides 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's limits.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 u opens 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 signed pool commands 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_to on a signed prompt or
    start). The GUI reads the two events, delegation.started and delegation.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
    ask or handoff, 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 ask and
    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:", then npm 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; a and d are 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

Choose a tag to compare

@github-actions github-actions released this 27 Oct 01:09
8ec1da2

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 run sessionpipe control pair on
    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

Choose a tag to compare

@github-actions github-actions released this 26 Oct 23:25
38b976a

Added

  • sessionpipe 0.10.0. A machine in inherit mode (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 says control.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, and inherit is never signed. An
    ack's applied: inherit reads "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's accounts
    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 over api says "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 home is gone (0.10.0 sends none). A start's folder may be ~/… where the
    machine's hello has start and this receiver's sessionpipe-core takes one (feature
    detected, server/control/tilde.ts); otherwise folders stay absolute, from the
    machine's folders.

  • 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 says prompt_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

Choose a tag to compare

@github-actions github-actions released this 26 Oct 21:35
c482fb6

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).