diff --git a/README.md b/README.md index 3ba7381..6a608ce 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ cheaper/local model. A small always-on message server, **`bridged`**, controls [herdr](https://herdr.dev) (an agent multiplexer) over its Unix-socket API and exposes a clean 2-way messaging API as an **MCP server that both the primary and the workers mount** — -one unified Claude setup (REST/SSE stays for non-Claude clients, plus an optional broker). +one unified Claude setup and the **sole communication gateway** (REST/SSE stays for non-Claude +clients; any broker is `bridged`-internal, below the gateway). herdr owns the PTYs, multiplexing, persistence, and **agent-status events**; `bridged` owns policy (subscription boundary, session lifecycle, status-gated delivery) and the client contract. The worker `claude` launches with `ANTHROPIC_BASE_URL=https://ollama.ltms.dev` + a @@ -47,21 +48,21 @@ flowchart LR - **Subscription boundary:** the *primary* never sets `ANTHROPIC_BASE_URL` (stays on Pro/Max). Only the *secondary* process is off-subscription — and `bridged` itself is a plain daemon (no Anthropic quota), so it may poll/subscribe freely. -- **Unified MCP setup:** both the primary and the workers mount `bridged` as an MCP server - (one `claude mcp add` line, same on each side). Claude ↔ Claude runs over MCP tools — - `bridge_send` / `bridge_reply` / `bridge_ask` / `bridge_status` — with no `curl` or bespoke - client. MCP tool I/O never sets `ANTHROPIC_BASE_URL`, so mounting the bridge is - subscription-safe by construction. +- **One gateway (unified MCP setup):** `bridged` is the **sole communication path** for every + Claude session. Primary and workers each mount it as an MCP server (one `claude mcp add` + line, same on both) and talk over MCP tools — `bridge_send` / `bridge_reply` / `bridge_ask` / + `bridge_status`. **No Claude session ever addresses a broker, a peer, or the network + directly**; any queue is `bridged`-internal. MCP tool I/O never sets `ANTHROPIC_BASE_URL`, so + mounting the bridge is subscription-safe by construction. - **How the primary consumes a reply:** a single **blocking MCP call** (`bridge_send`); `bridged` holds it open until the worker calls `bridge_reply` or its turn hits `agent_status=done`, then returns the reply as the tool result. No cross-turn busy-poll, so no quota burn. SSE is an optional side-channel for humans/dashboards watching status. - Long/detached work uses the async broker path instead. - **Worker → primary** rides `bridged`'s **MCP rendezvous** — the reply resolves the primary's - blocking call, so *no keystroke into the primary pane is needed, even single-host*. - Fallbacks: a single-host non-MCP primary can be typed into by herdr (subscription-safe - simulated typing); a split-host primary gets it via the **broker + its own `Stop`-hook**. - See the wiki for the two topologies. + blocking call (or, for detached work, `bridged` **injects the primary's idle pane** when it's + ready), so *no keystroke-into-primary and no broker are involved, even single-host*. The one + exception: a split-host primary that isn't a herdr pane wakes via its own `Stop`-hook, which + polls **`bridged`** (never a broker). See the wiki for the two topologies. - **Different model per process** sidesteps Claude Code's lack of per-subagent provider routing — the worker isn't a subagent, it's its own configured process. - **AgentAPI** ([`coder/agentapi`](https://github.com/coder/agentapi)) is retained only as a diff --git a/wiki b/wiki index c71175e..78bb89f 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit c71175e1c77fce675020230fc7f84f6927a99f13 +Subproject commit 78bb89fcf0f74518310d6b91ace7bc72da6f3c7b