{"slug": "oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime", "title": "OSS Radar #04: The Agent Multiplexer Is Becoming a Runtime", "summary": "Herdr 0.8.2, an open-source terminal multiplexer for coding agents, now functions as an early agent runtime by owning real PTYs and enabling shared server-side sessions for humans and agents. Its protocol version 20 frames requests over local sockets, caps payloads at 2 MB, and supports semantic frames or terminal ANSI, while its wait path tracks pane state rather than individual turns. Mitchell Hashimoto announced Superlogical on July 29, a rival theory that will build on similar public components like libghostty, but is not yet a code-level competitor.", "body_md": "[Herdr 0.8.2](https://github.com/herdrdev/herdr/releases/tag/v0.8.2)\nis an open-source terminal multiplexer built around coding agents. It owns real PTYs, keeps sessions alive,\ntracks agent state, and lets people and agents act on the same server-owned panes through client and automation\nprotocols. That shared session is enough to call Herdr an early agent runtime. Its current limit is also in\nthat path: much of the\nlifecycle still comes from interpreting a terminal screen, and its waits track state rather than one turn.\n\nMitchell Hashimoto announced [Superlogical](https://mitchellh.com/writing/superlogical)\non July 29. The company will start with a terminal multiplexer, then make its parts composable and safe for\nproduction. Herdr already ships a narrower version of that bet. Herdr uses `libghostty`\n\n; Superlogical\nsays it will build on the same public components. Superlogical is a rival theory, not yet a code-level competitor.\n\n## The pane became an addressable agent\n\nMature multiplexers already keep sessions alive and expose automation surfaces. Herdr packages a more specific\ncontract: every agent gets a stable name, state, terminal identity, and command surface. A person can watch the\nTUI while another agent runs `herdr agent prompt reviewer \"Check the diff\" --wait`\n\n. Both use the same\nserver-owned session.\n\nThe server protocol is not a thin wrapper over keystrokes.\n[Protocol version 20](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/protocol/wire.rs#L15-L44)\nframes requests over local sockets, caps normal payloads at 2 MB, and negotiates either semantic frames or\nterminal ANSI for rendering. The server owns the workspaces, tabs, panes, and PTYs. Clients come and go.\n\nAn agent multiplexer becomes a runtime when control and lifecycle share the same durable session.\n\nThat claim can be proven wrong. If state is too weak for automation, or recovery restores a layout without restoring the work, Herdr remains a good multiplexer with agent labels.\n\n## A prompt is one server operation\n\n-\nResolve\n**Agent target** Pin pane and terminal identityvalidate -\nSubmit\n**PTY input** Write text, then encoded Enterobserve -\nTrack\n**Lifecycle event** Gate activity from a non-working startsettle -\nReturn\n**Agent state** Idle, done, or blocked\n\nThe request handler first rejects an empty prompt. It resolves the named agent to a pane and checks that the\npane still contains the expected foreground process. If the agent is already blocked, Herdr returns\n`agent_blocked`\n\nbefore it writes anything. Otherwise it encodes the prompt for the pane's live\nterminal mode, sends the text, waits 300 milliseconds, then sends Enter.\n\nThe wait path records the event sequence and terminal identity before submission, so a replacement process cannot\nsatisfy the old wait. From a non-working start, Herdr caps its activity gate at five seconds or the caller's\nshorter timeout. Only a longer caller timeout can produce `agent_prompt_stalled`\n\n. It then waits for\n`idle`\n\n, `done`\n\n, or `blocked`\n\nby default.\n\n[The wait code](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/api/wait.rs#L20-L305)\ntracks the pane occupant and state sequence, not a unique prompt or agent turn. If the agent is already\nworking, completion of that earlier turn may satisfy the new wait. Callers still need output checks or an\nagent-native result ID when the distinction matters.\n\n## State has two authorities\n\nHerdr can learn agent state from a native integration or from the terminal itself. Integrations call\n[ pane.report_agent](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/app/api/panes.rs#L1231-L1288)\nwith a source, sequence, state, and optional native session reference. Session-only integrations report an ID\nwithout changing waits or status. When no hook owns the state, Herdr inspects the foreground process and visible\nterminal shape.\n\n| Authority | What Herdr gets | Limit |\n|---|---|---|\n| Native report | Semantic state and optional session identity | Every agent exposes a different lifecycle |\n| Screen detection | Broad support from process and terminal output | Prompts, titles, and spinners change |\n\nVersion 0.8.2 shows the cost. Its fixes teach Qwen Code's localized confirmation states and strip new Claude Code title-spinner frames. Herdr can support a terminal agent without owning its API, but it must follow that agent's UI changes.\n\nThe detector damps that noise. A transition from working to plain idle waits for repeated confirmation, and stable blocked signals refresh on a timer. The project docs still say an unfamiliar prompt can appear idle instead of blocked until Herdr learns its screen shape. That mistake changes the sidebar and waits. It does not make Herdr answer the prompt by itself.\n\n## Persistence has four meanings\n\n“The session survives” is too vague for an agent runtime. A client can detach while the server and PTY keep running. A restarted server can restore workspace and pane state. Supported integrations can resume native agent conversations from stored IDs. Experimental handoff tries to transfer live panes to a new server during an update. Those are separate guarantees.\n\nHerdr keeps the separation in code.\n[ persist.rs](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/persist.rs#L1-L19)\nstores session state, optional screen history, and plugins in different files. The native-resume layer accepts\nsession references only from recognized Herdr integration sources, limits their size, and builds an agent-specific\nresume command. A saved screen and a resumed Codex conversation are not the same artifact.\n\n| Recovery path | What can survive | What still needs proof |\n|---|---|---|\n| Detach / reattach | Live server, PTY, process, terminal state | Multi-client behavior under long output |\n| Server restart | Layout, optional history, supported agent session ID | Conversation and child-process outcome |\n| Experimental handoff | Live pane process on supported Unix paths | Failure rollback and cross-platform behavior |\n\nI inspected these paths but did not run the recovery test for this issue. The adoption verdict stays inside that evidence boundary: detach is a core product path, while restart and handoff need a controlled trial before any of them carry unattended work that matters.\n\n## Superlogical is the rival theory\n\nSuperlogical calls the missing layer a durable session around the work itself. Its\n[three-step plan](https://www.superlogical.com/) starts with a terminal\nmultiplexer, makes its parts composable, then makes the system safe for production. The first product promises\nweb, macOS, and iOS clients, live sharing, and native scrollback and selection.\n\nAs of August 20, no public Superlogical multiplexer repository or beta was linked from its announcement or site. Its architecture is\nnot available for a code comparison. The public claim I can test is narrower: it will use the same MIT-licensed\n`libghostty`\n\ncomponents that\n[Herdr already vendors](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/vendor/libghostty-vt.vendor.json#L1-L5).\n\n[ libghostty-vt's public terminal API](https://github.com/ghostty-org/ghostty/blob/48ccec182a932c2ec04c344d45a5fc553861cb13/include/ghostty/vt/terminal.h)\naccepts terminal output, maintains screen state, and exposes it to an embedder. It does not create or manage the\nPTY. The public C API is also marked incomplete and subject to breaking changes, which explains why Herdr pins a\nsource commit. Superlogical must still build process supervision, durable sessions, transport, auth, sharing,\nstorage, and client policy.\n\nlibghostty lowers the cost of terminal correctness. It does not ship the multiplexer.\n\nHerdr and Superlogical may fit together. Herdr is opinionated about coding agents and works inside an existing terminal over SSH. Superlogical says agents are one kind of work inside a wider session, with native and web clients from the start. They still compete for the durable terminal session. Partnership remains a theory until either project publishes an integration.\n\n## Use the narrowest owner that solves the job\n\nStart two overlapping turns in one agent pane. Submit the second through `agent prompt --wait`\n\nwhile\nthe first is working. The wait passes only if the caller can bind the returned state and output to the second\nrequest. Herdr does not provide that turn identity today; an agent-native receipt or output assertion must close it.\n\nRun the same Codex and Claude tasks through detach, server restart, and experimental handoff. Record the child process, terminal screen, native conversation, and accepted task result separately. A green layout alone does not pass.\n\nTry Herdr now when several CLI agents run on a local or remote machine and both a person and another agent need to inspect them. Keep the multiplexer you already trust when general terminal persistence matters more than native agent state. Watch Superlogical when live sharing, native clients, or production policy is the job, but wait for a beta before treating it as an alternative. Herdr has crossed the line from multiplexer to early runtime, but reliable turn identity and recovery will decide whether it stays there.\n\n[Herdr v0.8.2 release](https://github.com/herdrdev/herdr/releases/tag/v0.8.2)\n\n[Herdr wire protocol](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/protocol/wire.rs#L15-L44)\n\n[Agent prompt handler](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/app/api/agents.rs#L13-L130)\n\n[Agent wait path](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/api/wait.rs#L20-L305)\n\n[Agent report handlers](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/app/api/panes.rs#L1231-L1288)\n\n[Pane runtime construction](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/pane.rs#L1696-L1855)\n\n[Herdr libghostty-vt manifest](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/vendor/libghostty-vt.vendor.json#L1-L5)\n\n[Session persistence](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/persist.rs#L1-L19)\n\n[Restore and handoff entry points](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/persist/restore.rs#L64-L118)\n\n[Native agent resume](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/agent_resume.rs#L5-L120)\n\n[Herdr agent-state docs](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/docs/next/website/src/content/docs/agents.mdx#L49-L63)\n\n[Agent detection transitions](https://github.com/herdrdev/herdr/blob/624dfd4796559042ec13ccf4d4b54374902ab81d/src/pane/agent_detection.rs#L5-L210)\n\n[Mitchell Hashimoto announcement](https://mitchellh.com/writing/superlogical)\n\n[Superlogical product plan](https://www.superlogical.com/)\n\n[libghostty direction](https://mitchellh.com/writing/libghostty-is-coming)\n\n[Ghostty terminal C API](https://github.com/ghostty-org/ghostty/blob/48ccec182a932c2ec04c344d45a5fc553861cb13/include/ghostty/vt/terminal.h)\n\n[Ghostty libghostty-vt header](https://github.com/ghostty-org/ghostty/blob/48ccec182a932c2ec04c344d45a5fc553861cb13/include/ghostty/vt.h)\n\n[Ghostty discussion #11348](https://github.com/ghostty-org/ghostty/discussions/11348)", "url": "https://wpnews.pro/news/oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime", "canonical_source": "https://gkoreli.com/oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime", "published_at": "2026-08-21 00:00:00+00:00", "updated_at": "2026-09-03 06:53:25.193613+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-infrastructure"], "entities": ["Herdr", "Mitchell Hashimoto", "Superlogical", "libghostty"], "alternates": {"html": "https://wpnews.pro/news/oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime", "markdown": "https://wpnews.pro/news/oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime.md", "text": "https://wpnews.pro/news/oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime.txt", "jsonld": "https://wpnews.pro/news/oss-radar-04-the-agent-multiplexer-is-becoming-a-runtime.jsonld"}}