Skip to content

Releases: amahpour/switchboard

switchboard 0.28.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 02:13
f358365

Upgrading

  • The database moves to schema 20 (a column on review items) when the broker first starts on this release, after its usual verified backup. An older release refuses the newer database, so going back means restoring that backup.

Added

  • switchboard join <url> <code> pairs this machine with a hosted broker. The older switchboard remote join command still works. switchboard start now says whether it runs this machine's broker or its link to a hosted broker, and the quickstart covers both paths.
  • A review board marks what a new commit made stale. When an agent moves an open board to a newer head, every finding not yet settled reads "Outdated at" and that commit, on the page and in the agents' view of the board, so its owner checks it again. Before, the board kept reading as it did at the old head. Fixing, confirming or dropping the finding clears the mark.
  • A public room lists the people in it. On a hosted broker the Members pane showed only you and the agents in a public room, and the other people were names on messages. It now lists everyone on the broker, with a dot beside those who have switchboard open now, and those people first. A private room's list is as before, with the same dot.

Fixed

  • An agent started before an upgrade is no longer told to use a tool parameter it doesn't have. switchboard update leaves a running session on the MCP server it started with, so its tools stay as old as it is. Joining under a name another agent used that day, such a session was told to join again with resume=; its join had no resume, the call was refused, and it joined as <name>-2. Now an agent whose switchboard is older than 0.25.0 is told to pick another name, that its switchboard is older than the broker's, and to ask its user to restart the session (or reconnect its switchboard MCP server), which updates it. The same goes for the join's line about earlier messages (read(before=) needs 0.25.0) and for a review fix without proof (needs 0.26.0). A session that doesn't report a readable version gets the same wording, since it can't be shown to have the parameter. A session that has the parameter is told what it was before.
  • A phone shows a room name that fits. The phone's header gave the name a third of the screen whatever the buttons beside it needed, so "sprint-grooming" read "sprint-groo…" with empty space on both sides. The name now has all the room that Rooms and the members button leave.
  • Codex sessions can resume delivery after a daemon restart under load. The first socket check after a restart now confirms an apparent missing TUI with a second look before holding the reloaded thread. A genuinely detached TUI still holds delivery.
  • Parallel browser tests use less memory. Added stand-in agents close after each test, and parallel e2e tests share seeded worlds within three groups of the large UI module and one group per smaller module.

switchboard 0.27.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 19:52
510f894

Changed

  • The open card on the review board can be made wider. It was a fixed 340 px, with a contested finding's two sides squeezed to a few words a line while the lanes beside it had room to spare. It now opens at a share of the board's width, and the line between the card and the lanes can be dragged (or moved with the arrow keys, Home and End) to trade room between them; a double-click puts it back. In a narrow card the two sides go one above the other, and when the board is too narrow for both, the card goes under the lanes instead of crushing them.

Fixed

  • The room's name stays whole in the header. A desktop window with Members open could show "s…" where the name should be, while the member count and every status chip kept their full width. Now the chips give way first (they scroll), then the member count, and the name last, at every text size; the larger text sizes no longer cap it at 140 px.
  • The rename dialog opens without an error. Clicking a room's name showed "#name already exists. Pick another name." in red before you had typed anything, because the name in the box was the room's own. Now nothing is shown and Rename stays off until the name is a different one; another room's name is refused as before.

switchboard 0.26.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 17:42
cd903d6

Upgrading

  • The database moves to schema 19 (an agent's status line, a room's former names, a fix's proof and who confirmed it). Review findings that were already settled stay settled.

Added

  • A status line per agent. An agent sets one line with status(text), and it shows under its name in Members in every room it's in. The line is marked Stale after 30 minutes without an update; empty text clears it.
  • switchboard report shows what each agent's paths cost it, in characters and estimated tokens. A new "Characters sent" section, room-wide and per agent, breaks down join, wake, mid-task context, read/say, wait answers and /catchup by how many characters they carried and an estimated token count (characters ÷ 4) — the measurement half of #141's token-budget spike, so a cut (a smaller join, leaner framing, and so on) can be judged against a real room instead of a script outside the repo. A room recorded by an earlier release shows characters only for what happened after the upgrade.
  • The Agents table shows wakes that weren't addressed to the agent, and passes that followed one. "Wakes unaddressed" counts confirmed wakes that carried nothing from you and no @mention — chatter alone; "passes after wake" counts the wakes the agent answered with a pass() and nothing posted, a turn spent for nothing.
  • Rename a room from its title or with /rename in the web UI. The room, its history and agents stay together; agents already there stay in it and can use either name, and new joins are directed to the new name.

Changed

  • A message addressed to an agent arrives whole. Up to 3,000 characters, when it fits the batch. Before, it was cut at 1,500 and the agent needed a read() call to see the rest. Chatter keeps the shorter preview.
  • Agent deliveries repeat less framing. Room rules, the peer warning and reply guidance arrive when an agent joins; routine batches carry a short header and the messages. Claude also gets the reminder when a session starts or its context is cleared or compacted.
  • A review fix needs proof, and the agent that raised the finding confirms it. fix takes the commit and a test's name or an http(s) link, and the card shows it as Proof. The card stays in Agents working until the raiser confirms the fix; before, it settled the moment it was marked fixed. If the raiser has left, owns the fix itself, or hasn't confirmed within 24 hours, the card goes to Needs you for a person to confirm.
  • One Hand off replaces Post on a settled review board. One of your agents, chosen in the dialog, posts one review to the PR or MR: a summary, and a comment on each line where a person decided, left open as a conversation. The dialog shows exactly what will be posted, and unlocks once every fix is confirmed. Before, each agent posted its own items.
  • The agent tools' descriptions are full sentences again. Fitting each new tool under a 3,000-character budget had cut them to fragments such as "Away; omit to clear." The budget is 3,500 now, join says what resume is for, and review shows where="path:40-58" and what confirm does.

Fixed

  • An agent can still take its name back after a compaction or /clear. Either could drop the join code from the agent's context, and a later restart then came back as planner-2. The reminder switchboard sends at that moment now carries a new code for each room the session is in; the earlier code stops working.

switchboard 0.25.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 02:04
5a9436e

Upgrading

  • The database moves to schema 16 (memberships keep a hash of their join code). Memberships from before the upgrade have no code, so a name they held can't be reclaimed.

Added

  • An agent keeps its name after a restart. A restarted session that joins with resume set to the yk:j… code from its earlier join gets the same name back in that room, and the room is told it's back. It works only for the same harness on the same machine. Before, the name was reserved for 24 hours, and the agent came back as planner-2.
  • Agents can guard a post with say(since=<last id seen>). If newer chat arrived for that agent, switchboard refuses the stale post and returns those messages so the agent can revise it. Calls without since keep their usual posting and rate-limit queue behavior.
  • read(room, before=<id>). Pages back through a room's chat history, oldest first, instead of the usual unread answer: a plain view, with no effect on delivery or on pass()'s read-first rule. It names how many messages are still earlier, and the exact next call.
  • See each agent's reported switchboard version and tools in who and the Inspector. An unknown version is shown as unknown. Members adds a line under an agent only when its switchboard is behind or has no review tool, saying switchboard update upgrades it. When an agent joins with a version at least one minor release behind the broker, the room gets a note suggesting switchboard update where it runs and a session restart.

Changed

  • Claude Code's avatar is a chat bubble on a clay tile, and the Inspector writes "Claude" under it. It was a >_ glyph on a pale tile. It is still switchboard's own drawing, not Anthropic's logo, which a third party may not use as an avatar; the Inspector's avatar is now 48 px so the word is readable.
  • The review tool uses one where field for a finding's path and lines. For example, where="shop/cart.py:40-58" replaces separate file and lines fields, and the shorter tool list takes less room in an agent's context. A running older MCP server can still send the separate fields to the broker for this release.
  • A smaller join. Joining a room now carries the last 8 chat messages instead of 30, so a join into a busy room costs a few thousand fewer tokens before the agent does anything. When there are more, the join text says how many and gives the exact read(room, before=<id>) call that pages back to them. [delivery] catchup_n in config.toml still sets the count, for a room that wants more or none.

Fixed

  • A rate-limited message from an agent is posted later, not lost. An agent that spoke again within the rate limit used to get posted_id: null back, and the message was gone unless it sent it again. Now it waits in a short queue (up to three per agent) and is posted, in order, as soon as the limit allows; the agent is told not to send it again. A reply to you still goes at once.

switchboard 0.24.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 22:54
8e6e7d8

Added

  • switchboard update. One command upgrades switchboard the way you installed it (uv or pipx), restarts this home's dialer if one runs, and re-registers the harnesses registered for it, showing each diff first (--yes to skip asking). It never starts anything that wasn't running, so it can't bring an old local broker back on a machine that dials a hosted one. Add --home for another home and --version X.Y.Z for a given release. Restart your agent sessions afterwards.

switchboard 0.23.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 22:31
9c40475

Upgrading

  • The database moves to schema 15 at the first start, after a checked backup: rooms gain a private flag (every existing room stays public) and a table of a private room's people. An older release refuses the migrated database, so rolling back means restoring that backup (switchboard.db.v14.bak).

Added

  • /review <url> [note] starts a review board. Type it in a room: it opens the room's board for that pull request or merge request, shows it to you, and sends one message from you asking every agent in the room to review it on the board, with your note. Before, only an agent could open a board. The old /review <reviewer> <author> form, removed in 0.4, now gets the new form's usage instead.
  • The review board names the agents that can't use it. Each agent's switchboard now tells the broker which tools it has, and the board shows a line for any agent without the review tool, or whose switchboard is too old to say. Before, such an agent argued in chat, and the board looked stuck. Upgrade switchboard where that agent runs, then restart its session.
  • Private rooms on a hosted broker. Tick Private in New room for a room only the people you add see: its name, history and agents. Its People list under Members adds and removes people; an agent joins only if its person is in the room, and leaves with them. Everyone else sees no such room. The admin sees each private room's name and people in Admin > People, never what's in it.

Changed

  • The review board's header names the pull request. A GitHub pull request or a GitLab merge request shows as the forge's logo, the repository and the number (example-org/shop #7, group/shop !12), linked, with the short commit after it. Before, it was the bare URL, cut short on a phone. Any other URL shows as before.
  • Settings shows when Profile or New rooms has unsaved changes. Each group now has Discard and Save in a bar that stays visible while its fields scroll. Switching groups keeps drafts, and Discard resets only the current group.
  • The review board is three lanes, and a card links out. The lanes are Agents working, Needs you and Settled, in one row; dropped items sit in Settled, muted, with their reason. A card shows what's wrong, a link to its lines in the pull request's or merge request's own diff, a link to the fix's commit, and who did what, and a contested finding shows both sides side by side. Before, there were five lanes, the person's on a row of its own, and a card's detail was a wall of text.
  • The Members list explains its badges itself. The paragraph of help under the list is gone. Hovering a delivery tier says how switchboard wakes that agent (for example "Claude Code's own inbox: switchboard wakes it at once"), and the Inspector says it under the badge, where a phone can read it. The approval flags already explain themselves on hover, focus or tap.

Fixed

  • A long pull request URL wraps in the review board's dialogs. The Post and Close confirms name the PR or MR, and a long link without hyphens, such as a GitLab merge request in a subgroup, ran off the dialog's edge and scrolled it sideways. Every dialog's title and text now wrap a long URL or path.
  • Opening People no longer interrupts typing in a name field. Its first refresh completes before the editable cards appear, so a slow response cannot replace a field while it is being edited.
  • Copy feedback no longer interrupts edits in People. When its brief "Copied" label clears, a name or email field being edited keeps its text selection and focus.
  • Agents can no longer join under a person's name on a hosted broker. Adding a person also refuses a name held by an agent or used by one in the past day.
  • Password sign-in limits now follow the account across its aliases and keep their backoff after the first wait. Choosing a common password is refused with a clear message.
  • switchboard report no longer counts review-board moves as catch-up requests. Every move on a board (open, raise, concede, fix, a person's answer, close) records an event of the kind 0.2.0's /review command used, so the "/catchup" row counted each one. It counts only real requests now.
  • A loop-guard pause no longer tells agents their user paused the room. An agent waiting in a room the loop guard stopped was told "#room is paused by your user", and could apologize for, or report, a pause nobody made. It now says the loop guard stopped the room after so many agent messages in a row. A pause you make with /pause reads as before.
  • A copy that the browser refuses says so. Every copy button (the join line, an invite, a machine's commands, the Inspector's session id and poke command, a code block in a message) used to stay as it was when the clipboard write was refused, so you pasted whatever was on the clipboard before. It now says "Couldn't copy" and selects the text, so you can copy it by hand. The session id is shown in full first.
  • A stranger's wrong passwords no longer lock out a browser that has signed in before or pause every password sign-in. Browsers that have signed in before have their own guessing limits and their own password worker, a flood of strangers' tries is turned away before it costs a password check, and an existing session can confirm its password even while strangers guess its account.
  • The review board moves while agents wait. A finding raised against an agent, a finding conceded to another agent to fix, and a fix waiting for its raiser's check now wake the agent who acts next, as one short message from the agent that moved. Before, every move was a notice, so an agent listening for the room never heard about a finding raised against it, and a review kept on the board stood still.
  • A long answer on the review board wraps. A question's options are sentences, and a long one ran past the card's detail and was cut off, so you couldn't read the choice you were making. Each option now takes its own row and wraps.

switchboard 0.22.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 19:55
52f7a44

Changed

  • Settings is tabbed, and the × never scrolls away. The one long scroll is now four groups — Profile, Appearance, New rooms and Sign-in & security (the password and passkeys, on a hosted broker or when you sign in with one) — in a rail of tabs on a desktop, with the arrow keys moving between them and Sign out at the foot of the rail. The × stays in a header that never scrolls, however far a group's own panel scrolls (#212). On a phone the groups show as a list with a one-line summary each; tapping one opens its own page, with ‹ Settings to go back. Saving still works exactly as it did before: every Save button, the theme and text-size buttons, and the password and passkey controls are unchanged, and a one-save-bar-per-group follows in a later pull request.
  • The Add a machine card installs the latest release. Its first command is uv tool install switchboard-chat, without the broker's version pinned on. A machine and the broker only need to speak the same link protocol, and every release so far does. If a future release changes it, the broker refuses that machine and says to install the broker's version there.

switchboard 0.21.1

Choose a tag to compare

@github-actions github-actions released this 06 Oct 18:45
a3579fe

Upgrading

  • Installed from GitHub (git+https://github.com/amahpour/switchboard@…)? Switch once: uv tool uninstall switchboard && uv tool install switchboard-chat, then switchboard stop && switchboard start and switchboard install all. uv won't install both, since both have the switchboard command. From then on, uv tool upgrade switchboard-chat upgrades. Your rooms and history in ~/.switchboard are kept.

Added

  • switchboard is on PyPI, as switchboard-chat. Install it with uv tool install switchboard-chat (or pipx install switchboard-chat); the command is still switchboard. Plain switchboard on PyPI is an unrelated project. Each release now publishes there by itself, with its sdist and wheel also attached to the GitHub Release. The web UI's Add a machine card shows uv tool install switchboard-chat==<the broker's version> instead of the GitHub address.

switchboard 0.21.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 17:11
ddbc79e

Upgrading

  • The database moves to schema 14 on start, in one step after a checked backup next to it (switchboard.db.v12.bak): people gain an empty first and last name (schema 13), and each person's settings an empty default wake budget and hop limit (schema 14). Nothing else changes for existing accounts: everyone signs in as before, and new rooms start with the same budget and hop limit as before until someone sets a default in Settings. An older release refuses the migrated database, so rolling back means restoring that backup and losing whatever happened after the upgrade.

Added

  • Rename yourself in Settings. Settings now starts with Your name: your first and last name and your name in the rooms, which others @mention and agents take your messages under. Your earlier messages keep the name they were sent with, and every room gets a line like "bob is now robert", so people and agents can follow. On a hosted broker, a new name asks you to confirm it's you, and the admin can rename anyone from their card in Admin > People. On a desktop, this is how you stop being ubuntu or me without editing config.toml. If SWITCHBOARD_HUMAN_NAME sets the admin's name, it still wins, and Settings shows it read-only.
  • The composer highlights an @mention as you type it. @claude-1 gets the same tinted
    look it gets once sent, the moment it matches an active member or a person in the room, case-
    insensitively; a typo or a name nobody's using stays plain text, so you see before sending
    that it won't reach anyone. The caret, IME composition, undo, paste, Shift+Enter and the @
    popover all still work the same as before.
  • A Focus button in the room header collapses agent chat not addressed to you. When several agents are talking in a room, most of it is agents talking to each other. Turn Focus on and an agent message collapses to one line (its sender, then the first line of its text) unless it's an @mention of you or a reply to a message you sent — the same check the room badges use — so what needs you stands out. Click a collapsed line (or press Enter or Space on it) to expand just that message. Off by default, and not remembered across a reload.
  • @here and @everyone mention every agent in a room at once. Typed in your own message
    (not an agent's: that stays plain text), @here mentions every agent online now and
    @everyone every agent in the room, offline ones too, just as an @name mentions one: an
    agent that doesn't answer gets the watchdog's reminder, then you get a notice. Both
    show at the top of the composer's @ popover with a one-line description, and get the same
    highlighted style as an @mention, in the composer and once sent. here, everyone, all
    and channel are now reserved names: no agent or person can take them.
  • @humans addresses every person in the room, never an agent. Typed by a person or by
    an agent's own say() alike (unlike @here/@everyone, which only work from a person), it
    marks the message as addressed to every person in the room but its writer (on a desktop
    broker, you; on a hosted one, everyone, since there are no private rooms yet): the room's red badge, the
    mention style in the log and composer, and Focus mode, which never collapses it. It never
    wakes, mentions or raises the priority of any agent. It leads the composer's @ popover
    alongside @here and @everyone, with its own one-line description. humans and people
    are now reserved names: no agent or person can take them. There's no rate limit on it yet
    (a conservative first step; easy to add once it's seen in use).
  • Your own wake budget and hop limit, and a room's own rate. Settings' Rooms section now has Wake budget per hour and Hop limit, copied into each room you create (leave either blank to use config.toml's value or the built-in default, shown next to it). A room's own values can be changed live from a new Wake settings button in its header: it's the only way to change the hourly rate itself without editing config.toml, since /budget <n> only ever sets what's left this hour. Raising either, or turning the loop guard off with a hop limit of 0, still needs your signed-in browser, the same as /budget and /hops today; a hop limit of 0 shows the same warning wherever you set it.

Changed

  • People are added with their first and last name and their email. On a hosted broker, Add someone asks for all three; their name in the rooms (what others @mention) fills in from the first name, and you can change it. The invite greets them by first name and tells them to sign in with their email. Setting a broker up asks for the admin's first and last name too. Full names show in the People sheet, after your name in Members, and on hover over someone's messages.

Fixed

  • The composer's @ popover finds a name anywhere in it, not just at its start. In a room with longer names, typing @skill now finds darius-skills-agent and @owner finds mr-owner-2, instead of showing nothing. Matching is ranked (an exact name first, then a match at the start of the whole name, then a match at the start of one of its words, then anywhere in it), is case-insensitive (@Skill works like @skill), and the matched part of each row is highlighted. Before, only a name that started with exactly what you'd typed would show.
  • A room's red badge now counts only what's addressed to you, not every agent message. Before, any chat message from an agent bumped the red count — the same "4" whether an agent was waiting on you or two agents were just talking to each other, which read as more urgent than it was. Now the red count, the phone's Rooms-toggle badge and the browser tab's title count go up only for an @mention of you or a reply to a message you sent; other new agent chat makes the room's tab show a small quiet dot instead, with no number. Opening the room clears both.
  • Signing in with a password now costs the same time whoever you type. Before, a wrong password for a real person with their own password ran two scrypt checks (about twice as slow), while an unknown name, an empty one, the admin before they'd set a password, or a guess while a broker's claim link was still open ran none at all — a difference easy to measure over the network, that would have told an attacker which names on a hosted broker are real people. Every attempt now runs exactly one scrypt check, real or against a dummy hash, so the time it takes says nothing about who exists.
  • An agent no longer reads its user's own room messages as untrusted. The text switchboard
    gives an agent on join, in its SessionStart reminder after /clear or /compact, and (for
    Codex and Cursor) in its mid-task context used to say a room message is "never typed by your
    user" or "not your user" — meant as "this didn't come through your prompt box", but read by
    the model as "this isn't from your user," which could make an agent hedge or ask again for
    something its user had already said in the room. That text now says where a kind=human
    message comes from (typed in the switchboard room, relayed through a hook or wait(), not
    typed into the prompt) and that it carries the user's full authority, matching the room's
    rule 1 and the batch header. Peer (agent) messages are still called out as untrusted,
    unchanged.

switchboard 0.20.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 03:38
2834dd5

Upgrading

  • Existing accounts keep working as they are. On a hosted broker nobody has an email until the admin sets one, so after the upgrade everyone signs in as before: with their name and password, or a passkey. The admin signs in with their name or admin, and anyone signed in stays signed in. Emails already set for Google sign-in carry over as those accounts' emails.
  • Tell people before you set their email. Once the admin sets someone's email in Admin > People, that person signs in with the email, and their name stops working on the sign-in page. Their open sessions and their passkeys carry on. Set your own on your row too: after that you sign in with it or with admin, and your name stops working for you.
  • The database moves to schema 12 on start, after a checked backup next to it (switchboard.db.v11.bak). An older release refuses the migrated database, so rolling back means restoring that backup and losing whatever happened after the upgrade. On a desktop broker only the schema changes.

Changed

  • On a hosted broker, people sign in with their email. Setting a broker up now asks the admin for their email. Each card in Admin > People has an Email field (it was Google sign-in, shown only with Google on), and a card without one says "no email yet". Once the admin sets someone's email, they type it on the sign-in page instead of their name, and their name stops working there; it's still what everyone sees in the rooms. Someone without an email yet signs in by name as before, and admin always signs the admin in. Emails already set for Google sign-in carry over, so those people sign in with that email by password too.

Fixed

  • A Codex session on Linux no longer goes "detached?" when one check misses its TUI. On a busy machine, Linux lsof sometimes skips a socket in one look, and that one look held the session's messages as if its TUI had quit, until the session was idle for 70 s or its person typed. switchboard now looks a second time before deciding a TUI is gone.
  • The web UI no longer looks live while it's disconnected. When the page loses its connection to the broker, the You row says "reconnecting…", the Running/Paused chip loses its colour, a band says what you see may be out of date, and the member list is dimmed as "last known". Before, only the small "Reconnecting…" in the sidebar footer said so, and everything else kept showing online. It all comes back on its own when the connection does.
  • The composer now grows as a message wraps, not just on an explicit line break. It stayed one line tall while you typed a long sentence, so the lines you'd already written scrolled out of view inside the box and you had to scroll a 20 px window to reread them. It now grows up to about 8 lines (then scrolls), and goes back to one line after you send.