agent-yes lab

The lab

agent-yes began as a wrapper that pressed y so an AI coding CLI would stop waiting on a human. Almost everything since has been a consequence of that one change. This is where the consequences get written down — design notes, threat models, and the honest status of a system that is still growing.

The idea, in one line

An AI coding CLI is a program in a terminal. agent-yes makes it a process you can address — list it, read it, message it, resize it, restart it, hand it to a colleague, and give it a URL.

That sounds like tooling. It is closer to a change of category.

Why that is not a small difference

Every agent CLI ships with the same assumption baked in: _a human is sitting right here._ It asks before it edits. It draws a full-screen TUI for eyes that are watching. It dies when the terminal closes. Those are reasonable defaults, and they are also a ceiling — they cap an agent at exactly one person's attention, and attention is the scarcest thing in the building.

agent-yes removes the assumption in the least invasive way available: it does not fork the CLIs, it does not need their APIs, and it does not wait for a vendor to ship a daemon mode. It runs the real binary in a pseudo-terminal and answers the questions a human would have answered. The terminal _is_ the integration surface.

What follows is the interesting part. Once one agent no longer needs a human in the loop, each capability forces the next:

No step there is a product decision. Each one is the bill for the previous step. The lab exists because paying those bills honestly is more interesting than the original trick.

Five planes

The system reads cleanly top-down, and the interactive architecture map draws the same boxes as a graph:

PlaneWhat lives there
① Agent coreThe PTY wrapper. Spawns any agent CLI, matches ready / enter / fatal patterns, restarts on crash, resumes sessions, propagates terminal size. Rust is the primary binary; TypeScript is the reference implementation.
② Local fabricpids.jsonl (every agent, both runtimes), a FIFO per pid for stdin, a raw PTY log per agent for stdout. Files, not a daemon.
③ ExposureOne transport-agnostic handler, apiFetch(req) → Response. HTTP and the WebRTC bridge are both just callers; port tunnels and libp2p peers fold in next.
④ Trust & discoverySignaling that is a rendezvous only, an HKDF key split so the relay never holds a key, and signed capability tokens that carry their own scope.
⑤ Reach surfacesThe browser console, the CLI on another box, embeddable widgets, a system tray, peers.

The seam that holds it together is plane ③. Because Bun.serve and the WebRTC bridge already call the _same in-process_ apiFetch, a new transport is a new caller and never a new control plane. That is what turns "three stacks" back into one system.

What is actually true today

Not a roadmap — the parts you can run right now:

Where this goes

Short version: an operating layer for a fleet of agents that outlives any one session, any one machine, and any one person's attention. The long version is a post below — it argues for an address space, a bus that humans are also on, and delegation with accountability, and it is honest about the four places the current system is still cluttered.

The ecosystem

agent-yes is the fleet. Around it sit tools that give the fleet somewhere to _reach_ — each a standalone CLI in its own right, each usable without the others:

agent-yesrun, watch, message and delegate to a fleet of AI coding agents
slack-termthe human-comms surface — read and write Slack from a terminal, with a confirm gate built for operators who are sometimes machines

The connective tissue is a shared stance rather than a shared library: file-based state over daemons, one command surface across two runtimes, gates on the irreversible and warnings on the merely unwise, and a hard rule that no real operational data lands in a public repo. Both projects arrived at the same interrupt-safety reasoning against completely different substrates — one over pids.jsonl and a FIFO, the other over Slack reactions.


Notes

IdeaAug 11, 2026

The terminal is the API — what agent-yes actually is

Every agent CLI assumes a human is watching. agent-yes removes that assumption by driving the real binary through a pseudo-terminal — and almost every feature since has been the bill for that one change.

EcosystemAug 11, 2026

A confirm code that goes stale — how slack-term makes agents safe to give a voice

slack-term is the agent-yes fleet's human-comms surface. Its confirm gate hashes the destination, the actor and the conversation's current last message — so it expires the moment anything that mattered moves. Plus what it gets right, and where it is thinner than its README claims.

ArchitectureAug 11, 2026

No daemon owns your agents — the local fabric in detail

agent-yes has no supervisor process. Agents coordinate through three files, which is why killing the web console, the daemon, or the wrapper never takes a running agent down with it.

AmbitionAug 11, 2026

An address space for agents — where agent-yes is going

The goal is not a better terminal UI. It is an operating layer for a fleet of agents that outlives any one session, machine, or person's attention — an address space, a bus humans are also on, and delegation with accountability.

FeatureJul 22, 2026

ay callback — let readers message your agent from any web page

A signed, send-only, single-agent capability plus a one-script embed widget: report pages that can talk back, with a required expiry and a revoke kill-switch — never your serve token.

SecurityJun 15, 2026

End-to-end encryption for agent-yes share links

How share links stay private even if the signaling relay is compromised: an HKDF key split, AES-256-GCM with per-connection keys, and a fail-closed handshake.