Skip to content

plug v0.11.0

Latest

Choose a tag to compare

@github-actions github-actions released this 07 Oct 12:02
· 52 commits to main since this release
1ebd978

Added

  • A client can be given only the servers you pick. Switch off "Adopt Newly
    Added Servers" under Settings on a client's page and a server you add later stays off for that client
    until you turn it on; what the client gets today does not change. The
    same from the command line with plug clients only <client> --server <name> or --tool <name>, and --off to end it.
  • Clients lists a client that connects, makes its calls, and leaves again,
    such as a script on a timer. It shows where it runs, with "Last used" and
    the time, and can be named, given an icon, and kept from servers and tools
    like any other client. It stays listed while its last call is in Activity.
  • Plug's menu bar icon is there whenever Plug is serving. It comes back on
    its own when something else closes the app (a quit-all, a crash, a force
    quit) and appears after login. Settings has a "Keep in Menu Bar" switch
    for it, on by default.
  • Settings has a Permissions section: whether macOS lets Plug run in the
    background, open at login, and send notifications, with the way to System
    Settings beside anything that was turned off there.
  • A server whose tools Plug splits into groups says so on its page: a
    Clients See row lists the groups, such as Gmail, GoogleDrive, GoogleSheets.
  • A Google Workspace server gets its Gmail, GoogleDrive and other groups
    under any name you give it, not only workspace: Plug goes by what the
    server says it is.
  • Two servers that would give a tool the same name no longer leave only one
    of them. Each gets its own name added to the prefix, so two Google servers
    show as GmailWorkspace__… and GmailGoogleWork__….
  • A client kept from a tool is no longer sent that tool's results through
    an event watch. Listing, subscribing and delivery all check the tool, and
    an event already queued is dropped when the tool is blocked.
  • A tool switched off, or kept from a client, stays that way when a second
    account changes its name (Gmail__… to GmailWorkspace__…) and when that
    account is removed again.
  • Two servers whose names differ only in punctuation (google-work,
    google_work) each get their own tool names; one is numbered. If two
    servers still claim one name, the second is left out and the log says so,
    instead of one silently replacing the other.
  • Codex CLI can be signed in again from its page in Plug: a Sign In button
    runs its sign-in and opens the approval in your browser. Other clients
    still sign in from inside themselves, and their page says how.
  • A client can be given a place: the computer it runs on, such as "Work
    laptop". Its page has a Runs On menu for it, and clients with a place are
    listed under it. The rest stay under On This Mac and Over the Network.
    Activity and plug clients show the place beside the client's name, and
    plug clients place <client> <place> sets it from the command line.
  • Each server's page has a Settings row that says where the server's own
    settings are and takes you there: the app it runs from, a file its
    arguments name, the page it gave for itself, or Plug's own form. Plug
    only uses what it already holds and never searches the disk.
  • Clients has an Add Client button. Pick any client (one on this Mac, one on
    the web such as ChatGPT, one Plug cannot find, or one it has never heard
    of) and how it connects, on this Mac or over the network. Plug sets up a
    client it finds with one button; for any other it shows the command or
    address to paste, alone or as a whole settings entry. A client Plug has never
    heard of can be given a name and an icon there, which it shows under from
    its first connection.
  • A client whose sign-in to Plug ended says "Needs sign-in" in Clients, with
    how to sign it in again, and Plug sends a notification when it happens.
    plug auth clients list says so too.

Changed

  • Clients distinguish missing local configuration from hosted access. Network
    authorization details show the local HTTP clients represented by that row,
    including Codex CLI, without implying an active connection.
  • A client you name after one Plug knows takes that client's icon: a second
    Cursor sign-in renamed "GrokBot" shows Grok Bot's icon, not Cursor's.
  • Activity shows each call under the name you gave the client that made
    it. Two sign-ins that both report "Cursor" are told apart from then on;
    calls recorded before this stay as they were.
  • Quitting Plug asks first. "Quit" closes the app and leaves Plug serving,
    with the icon away until Plug is opened again; "Turn Plug Off and Quit"
    stops it. Before, quitting left Plug serving without saying so.

Fixed

  • Two scripts started the same way from different folders, such as
    python3 main.py, are two clients. They were one, sharing a name and
    what they were kept from.
  • A script that connects on this Mac is called by its own name, or by its
    folder when the file is a main.py. It showed as python3 or node,
    the same as every other script.
  • A task's large result is kept with the tool the task ran, so a client is
    kept from it only when it is kept from that tool. A client with a block on
    anything used to be refused every such result.
  • A network client's open session ends when its sign-in runs out, not only
    when the sign-in is revoked.
  • The menu bar panel and Activity show a client's icon wherever the
    Clients list does: a network client that says nothing about itself is
    pictured by its sign-in's name in the panel too, and ChatGPT is found by
    the app OpenAI ships now, whatever the owner named it.
  • A tool switched off for one client is stored by its server and that
    server's own name for the tool, so renaming the tool or its server's
    prefix cannot switch it back on. Blocks written the old way, by listed
    name, are brought over the first time Plug sees the tool, and a rule
    with * in it now also holds for a tool that was renamed out from under
    it. A large result kept on disk follows the same block whatever the tool
    was called when it was kept.
  • A client kept from a server no longer hears about that server's sign-in,
    and a local client kept from a server gets no log lines, as a remote one
    already did.
  • A remote session ends when the sign-in it was opened under is revoked,
    not only when the client is removed, and nothing more is sent to it.
  • A secret command's helper left holding only the error output is stopped.
  • An environment entry named like another entry's stored key (env.token
    beside token) gets its own stored key.
  • A watch check that was waiting its turn no longer runs after the watch is
    removed or while Plug is shutting down.
  • Servers whose names read alike are numbered around names already in use,
    so a numbered name can no longer land on another server and hide its tool.
  • A remote client's open session ends when its sign-in does, however that
    happened, including a removal whose save failed. A client newly kept from
    a server stops getting log lines on a stream it already had open.
  • A watched tool that is slow to answer no longer delays the next check of
    the other watches, and is not called again while still answering.
  • A secret command that runs past its time is stopped together with
    anything it started, and one that prints without end is cut off.
  • Updated rustls to 0.23.45 or later for RUSTSEC-2026-0285.
  • A server's bearer token and an environment entry named token no longer
    share one stored key, and a refused change puts each key back exactly as
    it was. A whole server change, keys included, now happens one at a time,
    so two changes at once cannot undo each other's keys.
  • A watch calls a tool on a timer only when the server itself marks the tool
    read-only. A tool the server says nothing about needs allow_writes, as a
    writing tool does; before, a harmless-looking name was enough.
  • A large result Plug set aside stays out of reach of a client kept from its
    server or tool even after the tool is renamed or the server is removed.
  • Saving the config writes servers in name order, so the file no longer
    reshuffles on every save.
  • Setting up a client whose config file is YAML that cannot be read leaves
    the file alone and says so, where before Plug wrote a fresh file over it.
  • One watched tool that is slow to answer no longer holds up the other
    watches that are due with it.
  • A secret store command that leaves a program running behind it no longer
    hangs the read; it stops at the store's time limit.
  • A client kept from a tool can no longer read a large result of that tool
    that Plug set aside as a file.
  • An API server's key is not sent on when the API redirects to another port
    or from HTTPS to plain HTTP on the same host. Plug also stops reading an
    API response, or an API description, once it passes the size limit, where
    before it read the whole thing first.
  • Removing a client's access ends the sessions it has open, where before an
    open stream stayed up until it timed out. A session answers only to the
    client that opened it.
  • A client kept from a server no longer receives the log lines servers send.
  • A server change that is refused, such as adding a server under a name
    already taken, no longer replaces the key the existing server works with.
  • Removing a server keeps a stored key that another account of it still
    uses; the key goes when the last one does.
  • Two servers whose names differ only in punctuation, or a server with a
    very long name, no longer share one stored key. Keys already stored keep
    their names.
  • Watching a tool for change follows what the server says about it: a tool
    the server marks as writing is not called on a timer because its name
    reads as harmless.
  • A client that runs as several processes keeps its sign-in. Each holds
    the copy of the stored token it started with, so one renews and another
    presents the used copy later; before, that one was taken for a thief and
    the whole sign-in was revoked, which kept signing Codex CLI out. A used
    copy from the same client is now accepted for a week. After that, or from
    another client, it still revokes everything.
  • A stored sign-in renews after its client restarts. A client that had not
    read Plug's addresses again posted the renewal to /token with no
    resource, got nothing, and asked to be approved from scratch. Scripts
    built on the MCP Python SDK failed this way an hour after signing in.
  • Activity shows a network client's icon and name. A call from a client
    that says little about itself is pictured by the name on its sign-in, the
    way the Clients list already did.
  • Ditto history and email-manager clients use Python icons while retaining
    their distinct workflow names.
  • HTTP-linked clients no longer have a redundant local configuration row
    beside their network authorization. Existing local sessions remain visible;
    clients not using Plug have their own section.
  • Clients follows links made outside the app, such as plug link in a
    terminal, within a few seconds. It read them once, when the tab opened.
  • Running the app's tests no longer leaves a second Plug.app where Spotlight
    finds it.
  • Native OAuth clients such as Claude Code can sign in using temporary
    loopback callback ports. Callback host, path, and query remain checked.
  • With the sidebar hidden, the window's title and count no longer run past
    the edge of the first column.
  • Linking OpenCode or Kilo Code writes the entry where those clients read
    it. It went under a key OpenCode does not accept, so OpenCode would not
    start and Plug showed it as not linked.
  • Linking Claude Code over HTTP writes an entry Claude Code accepts.
  • The top of each column in the window no longer changes when the pointer
    moves over it. macOS was fading a line in under the bar on hover.