🇹🇭 ภาษาไทย
BWOC Ecosystem — Projects Overview¶
The BWOC family is a core framework plus a set of companion applications and device targets, all orbiting the bwoc CLI as their single source of truth. The framework owns identity, lifecycle, memory, and inter-agent protocol; every other project consumes those facts through bwoc <cmd> --json or the bwoc_core::chat_proto event stream — no project reaches into workspace files directly. This page maps every member of the family: what it is, what it is built with, how it connects to the core, and where to find it.
Overview¶
| Project | Role | Stack | Link |
|---|---|---|---|
| BWOC-Framework | Core framework + bwoc CLI |
Rust (9 crates), macOS / Linux / Windows | bemindlabs/BWOC-Framework |
| bwoc-handbook | Bilingual, role-indexed documentation | Markdown (EN + TH) | this documentation set |
| bwoc-gateway | Cross-place agent relay + standalone agent | Rust (axum WS relay + client) | bemindlabs/bwoc-gateway |
| bwoc-chat | Native desktop chat for agents | Rust + egui | bemindlabs/bwoc-chat |
| bwoc-devices-app (BWOC Monitor) | Read-only macOS fleet dashboard | Rust + Tauri 2 + tokio + static HTML/JS | internal / not yet public |
| bwoc-llm-pm (LLM Provider Monitor) | macOS menu-bar: LLM provider auth + quota | Swift, SwiftUI, SwiftPM, macOS 13+ | bemindlabs/LLMProviderMonitor |
| bwoc-mcc | macOS menu-bar fleet control center | Swift 5.9, SwiftUI, macOS 13+ | bemindlabs/bwoc-mcc |
| bwoc-devices | Device monorepo — Rust core + multi-board firmware | Rust (4 crates), Arduino/PlatformIO C++ | bemindlabs/bwoc-devices |
| Host Adapters (×5) | BWOC → external agent hosts (Claude Code · Codex · Antigravity · OpenClaw · Hermes) | Markdown/JSON · TS · Python | Host Adapters |
Core¶
BWOC-Framework¶
What it is. The foundation everything else depends on. BWOC-Framework is a backend-neutral specification and native Rust implementation for incarnating, running, and orchestrating AI coding agents. It ships as a Rust workspace of nine crates — bwoc-cli, bwoc-harness, bwoc-core, bwoc-agent, bwoc-mqtt, bwoc-deep-memory, and others — plus the bwoc CLI binary and the modules/agent-template cloneable scaffold.
Stack. Rust 1.85+ (2024 edition), multi-target (macOS / Linux / Windows), MIT. Current version: v2.29.0.
What it provides to the ecosystem. Every other project in the family is a consumer, not a peer:
bwoc list --json,bwoc sessions --json,bwoc fleet health— the JSON APIs that desktop apps and device firmware poll.bwoc-harness --chat— the subprocess thatbwoc-chatspawns; it owns model calls, tools, guardrails, and permissions.bwoc_core::chat_proto— the typed event stream (token,tool_call,tool_result,permission_request,turn_end) thatbwoc-chatrenders.- Agent registry, manifest schema, team protocol, inbox, and scrum state that
bwoc-mccreads.
Link. github.com/bemindlabs/BWOC-Framework
bwoc-handbook¶
What it is. The documentation set you are reading. A bilingual (EN/TH), role-indexed handbook that orients users, developers, agent authors, AI search agents, and crawlers. It summarizes and cross-references the framework without duplicating the source of truth — on any conflict the framework repo wins.
Stack. Plain Markdown, *.en.md / *.th.md parity pairs per page.
How it connects. The handbook references the framework repo for canonical facts and links to the public GitHub for all code. It does not embed workspace-local paths.
Link. this documentation set — see ../README.md for the full index.
bwoc-gateway¶
What it is. An optional rendezvous + relay server that lets BWOC agents in different places — separate machines, networks, or organizations — message each other without direct reachability. It closes the NAT/firewall gap left by the other transports: A2A needs an inbound HTTP port, MQTT needs a shared broker, and routes.toml local/peer paths assume the recipient is already reachable. The gateway is the third bwoc send transport (transport = "gateway"), and it ships the receive half that turns a single agent into a portable, deployable unit.
Two halves.
- The relay (
crates/gateway-server) — a dumb, untrusted WebSocket relay. It authenticates each connection with a signed challenge (the agent's ed25519 keypair is the login), keeps a presence map (agent_id → live connection), and routes envelopes by their cleartextrecipientheader only. It never inspects or forges bodies; durable store-and-forward holds messages for offline recipients, and gateways federate peer-to-peer (single-hop) across regions or orgs. - The standalone agent (
crates/gateway-client+ frameworkbwoc-agent) —bwoc-gateway-send/bwoc-gateway-recvare the transport binaries the framework shells out to.bwoc-agent --servesupervises abwoc-gateway-recvbridge that dials the relay and appends each inbound envelope to the agent's inbox, where the existing trust gate verifies it against a pinned-peer keyring (.bwoc/peers.toml) with replay defense, and an untrusted auto-process turn replies. Adeploy/standalone-agent.Dockerfilepackages one agent plus all five runtime binaries into a container that joins a relay ondocker run.
Stack. Rust — gateway-server (axum WebSocket relay: signed-challenge auth, presence, store-and-forward, federation, /healthz) + gateway-client (WebSocket client, ed25519→x25519 crypto_box sealed-box e2e body encryption, the send/recv binaries). The relay deploys as one container; a standalone agent as another.
Security grain. The relay is untrusted by design — it is presence, not identity. Envelopes stay end-to-end ed25519-signed so the relay cannot forge a sender, bodies may be sealed so it sees only ciphertext, and all Kalyāṇamitta-7 authorization stays in the receiving harness. A gateway-sourced turn runs as an untrusted principal (read-only by default, tool-approval fails closed) inside the Phase 5 saṃvara sandbox — it is the untrusted-ingress edge, and inherits that discipline.
How it connects to the framework. RouteTarget::Gateway in routes.toml makes bwoc send <peer> route over the relay; bwoc-core / bwoc-cli never link a WebSocket/TLS client (dep-quarantine) — the network code lives only in the sibling bwoc-gateway-{send,recv} binaries, exactly as the MQTT transport stays in bwoc-mqtt.
Status. Relay v1.0.0 — deployed and live. The standalone agent (recv bridge + pinned-peer trust + replay defense + untrusted auto-process + container image) shipped in BWOC-Framework 2.29.x. Known limitation: an agent that both receives and replies under one id contends on the relay presence map — splitting the gateway-login id from the message-signing identity is the planned fix.
Link. github.com/bemindlabs/bwoc-gateway
Desktop and Menu-Bar Apps¶
bwoc-chat¶
What it is. A native desktop chat window for BWOC agents. One agent or a whole team in one window — streaming replies, a live tool-activity pane per agent, and inline Allow / Deny permission prompts when a tool is in ask mode.
Stack. Rust (2024 edition), egui / eframe — pure-Rust immediate-mode GUI, no webview. Depends on bwoc-core (by path) for the chat protocol and agent resolution; never depends on bwoc-cli or bwoc-harness at build time. Supports ollama and openai-compatible harness backends.
How it connects to the framework. bwoc-chat spawns bwoc-harness --chat as a child process for each named agent. It reads bwoc_core::chat_proto events from the child's stdout (tokens, tool calls, permission requests) and writes ChatInput lines to its stdin. The harness owns the session; the window only renders and routes. Agent names are resolved from the workspace registry — the same .bwoc/agents.toml the CLI reads.
Team mode. Pass several agent names on the command line; each becomes its own harness subprocess, all multiplexed into one shared transcript. Messages broadcast to every agent; @name addresses one.
Why a separate repo. Keeping the heavy GUI dependency tree (winit, glow) out of the lean framework workspace. bwoc-chat pulls in only bwoc-core, never bwoc-cli or bwoc-harness.
Status. Active. Vendor-CLI backends (claude / codex / kimi / agy) are not rendered here — use bwoc spawn for those.
Link. github.com/bemindlabs/bwoc-chat
bwoc-devices-app (BWOC Monitor)¶
What it is. A read-only macOS desktop dashboard for a BWOC workspace. It shells out to the bwoc CLI on a configurable timer and renders three live panels: Fleet Health (the seven governance signals), Agents (registry + status), and Sessions (running daemons / tmux panes).
Stack. Rust + Tauri 2 + tokio + static HTML/JS. No npm, no Node, no Vite. The Rust side exposes Tauri IPC commands (list_agents, list_sessions, fleet_health, fleet_snapshot) that the webview polls. The fleet_snapshot command composes all three into the canonical BWOC fleet JSON payload — the same shape that device firmware ingests over WebSocket.
How it connects to the framework. The CLI is the single source of truth; the app never reads workspace files directly. It spawns bwoc --workspace <path> <cmd> --json and parses the output. fleet health output (no --json flag in v1) is parsed from its block structure by the Rust side.
Status. Internal / not yet public. No public URL.
bwoc-llm-pm (LLM Provider Monitor)¶
What it is. A lightweight macOS menu-bar app that shows, at a glance, the auth status and token / credit usage of the LLM provider CLIs installed on the machine, with quick login / switch actions for each.
Supported providers. Antigravity, Claude, Codex, Kimi, Ollama.
Stack. Swift, SwiftUI, SwiftPM, macOS 13+. Three targets: LLMProviderMonitorCore (pure logic, unit-tested), LLMProviderMonitor (SwiftUI menu-bar app), CoreChecks (plain-executable test runner — no XCTest needed). Activation policy .accessory — no Dock icon.
How it connects to the framework. It probes provider CLIs independently of BWOC; it does not call bwoc directly. Its relationship to the BWOC ecosystem is complementary: bwoc-mcc handles fleet operations (agents, sessions, inboxes) while bwoc-llm-pm handles provider credentials and quota. The two are designed to live side-by-side in the menu bar.
Credit tracking. Codex: reads ~/.codex/sessions/ rollout files. Claude: reads ~/.claude/usage-cache.json written by a statusLine hook during active Claude Code sessions. Ollama: surfaces the currently-loaded model from ollama ps; no quota. Antigravity: quota not headlessly accessible, shown as em dash.
Status. Available. Not yet packaged as a signed .app bundle — runs as a bare SwiftPM executable for local use.
Link. github.com/bemindlabs/LLMProviderMonitor
bwoc-mcc¶
What it is. A SwiftUI macOS menu-bar control center for the BWOC agent fleet. It surfaces live status — agents, sessions, inboxes — and provides quick actions to spawn, chat, stop, and supervise agents without leaving the menu bar.
Stack. Swift 5.9, SwiftUI MenuBarExtra, SwiftPM, macOS 13+ (Ventura+). Three targets: BwocMccCore (library), BwocMcc (SwiftUI app), CoreChecks (test runner). No Electron, no background daemons. Tests run via swift run CoreChecks, not XCTest.
How it connects to the framework. All CLI shell-outs go through bwoc <cmd> --json — the app is insulated from BWOC's Rust internals and depends only on the stable CLI surface. It reads the same bwoc list --json and bwoc sessions --json that bwoc-devices-app reads; polls every five seconds; refresh button forces a poll. Chat actions open a bwoc-chat egui window for ollama / openai-compatible agents and fall back to bwoc chat in Terminal for vendor-CLI agents.
Scope. Fleet operations only — agents, sessions, inboxes, and (planned) scrum state. LLM provider auth and quota are out of scope; that is bwoc-llm-pm's job.
Status. Alpha. Scaffold builds, launches, and renders the live fleet. Quick actions, sessions view, inbox preview, and scrum integration are in progress under BWOC-EPIC-5.
Link. github.com/bemindlabs/bwoc-mcc
Devices and Firmware¶
bwoc-devices¶
What it is. A standalone monorepo that puts the BWOC fleet dashboard onto physical hardware. One portable Rust core abstracts hardware behind HAL traits; multiple board firmware targets implement display and transport. A device joins the fleet and renders the live dashboard in real time.
Crates.
| Crate | Role |
|---|---|
bwoc-device-proto |
Host-to-device JSON wire contract — source of truth for all targets |
bwoc-device-hal |
HAL traits: Net, Store, Input, Display — no std required |
bwoc-device-core |
Portable runtime: source arbitration (SourceArbiter), fleet state, render |
bwoc-device-linux |
Linux / Raspberry Pi HAL impl + bwoc-device binary; feature-gated transports |
Board targets.
| Board | Stack | Status |
|---|---|---|
| WT32-SC01 Plus (ESP32-S3, 3.5" ST7796) | Arduino / PlatformIO C++ | Production (absorbed from bwoc-penlee-sc01-plus) |
| Raspberry Pi 5 / Linux | Rust core, --features pi (MQTT + WS + fbdev + evdev) |
Active; deploy via deploy/rpi5/ |
| ESP32-S3 ball (1.28" round LCD, XiaoZhi voice) | ESP-IDF C++, LovyanGFX | Scaffolded, not yet built |
Stack. Rust workspace (no_std + alloc for proto / hal / core; std for bwoc-device-linux), Arduino / PlatformIO C++. Transports: MQTT (rumqttc), WebSocket (tungstenite), stdin (USB), framebuffer, evdev touch. Feature flags: mqtt, ws, sim, fbdev, evdev, full, pi.
Protocol boundary. The ESP32 C++ firmware does not link the Rust crates. It implements rendering natively (LovyanGFX) and conforms to bwoc-device-proto only through the generated firmware/<board>/gen/bwoc_proto.h header, emitted by the gen-cpp-proto tool crate. The protocol is the shared contract; the HAL code is not.
How it connects to the framework. The host pushes fleet snapshots — the same canonical JSON produced by bwoc-devices-app's fleet_snapshot command — over MQTT or WebSocket to the device. The device runtime bwoc-device-core applies a SourceArbiter (USB takes priority over WS, WS over MQTT) and re-renders the dashboard each tick. The device does not call the bwoc CLI directly; it receives the already-composed payload from a pusher.
Status. Active. Raspberry Pi and ESP32-SC01-Plus targets operational.
Link. github.com/bemindlabs/bwoc-devices
bwoc-penlee-sc01-plus (historical)¶
What it is. The earlier, single-device project that originated the SC01 Plus fleet display concept: ESP32-S3 firmware (BLE for config, WebSocket for data) plus a Tauri host app that pushed the BWOC fleet JSON to the device. The firmware and the protocol concept were generalized and absorbed into bwoc-devices (firmware/esp32-sc01plus/). The original directory remains as a regression reference while the migrated firmware stabilizes. No separate public URL — it lives inside the bwoc-devices history.
Host Adapters (BWOC ↔ external agent hosts)¶
Where the desktop apps and devices consume the fleet, the host adapters bridge it both ways. Each packages the BWOC fleet as a plugin for an external agent runtime so a host such as Claude Code or Hermes can drive your workspace from inside its own session, and the framework registers the non-native hosts as spawnable backends in return. Every adapter is a thin, generic wrapper over the bwoc CLI — coordination, agents, skills, and deep-memory — that ships no agents of its own and discovers your fleet at runtime. One repo per host:
| Host | Repo | Plugin form |
|---|---|---|
| Claude Code | bwoc-plugin-claude | .claude-plugin/ — commands, sub-agents, skills, hooks |
| OpenAI Codex | bwoc-plugin-codex | .codex-plugin/ — skills, hooks, marketplace |
| Antigravity | bwoc-plugin-agy | plugin.json — skills, rules, hooks |
| OpenClaw | bwoc-plugin-openclaw | openclaw.plugin.json — Node tools + memory slot |
| Hermes | bwoc-plugin-hermes | plugin.yaml — Python tools, CLI command, memory provider |
Two directions. Outbound (the table above) puts BWOC inside the host. Inbound lets bwoc spawn target the host as a backend: claude, codex, and antigravity are already first-class backends and need no plugin; openclaw and hermes are registered through llm-backend plugin stubs in the framework (modules/plugins/llm-backend/{openclaw,hermes}/).
How they connect. Like every other family member, an adapter calls bwoc <cmd> and never reads .bwoc/ files directly. The surfaces it exposes map one-to-one onto CLI verbs: bwoc list / status / send / run / chat / task / team / memory. Beyond coordination, each adapter re-exports your installed BWOC skills (a generic generator over bwoc skill list) and bridges deep-memory (bwoc memory) — OpenClaw as a memory slot, Hermes as a MemoryProvider. The mechanism is shell-out — no standing server; the host only needs the bwoc CLI on PATH.
Generic by rule. The adapters carry no workspace-specific content — no fleet rosters, team names, or local paths. Claude Code's optional sub-agent files, for example, are generated locally from your .bwoc/agents.toml and are never committed. Each repo stays a reusable, public connector.
Status. The coordination surface, skill re-export, and the deep-memory bridges (including the OpenClaw memory slot) are implemented across all five repos, and the inbound llm-backend stubs have landed in the framework. What remains is host-side verification — loading each plugin in its live host and confirming a few host-API bindings (OpenClaw tool/memory registration, Hermes register_skill / MemoryProvider).
How They Fit Together¶
The bwoc CLI and the bwoc-device-proto wire schema are the shared contract that makes these projects composable without tight coupling.
bwoc CLI ──────────────────────────────────────────────────────────────┐
│ bwoc list --json consumed by: bwoc-mcc, bwoc-devices-app│
│ bwoc sessions --json consumed by: bwoc-mcc, bwoc-devices-app│
│ bwoc fleet health consumed by: bwoc-mcc, bwoc-devices-app│
│ │
│ bwoc-harness --chat ──────► bwoc-chat (egui renderer) │
│ ▲ │
│ └── launched by bwoc-mcc (quick action) │
│ │
fleet snapshot (JSON) ──────► bwoc-devices-app ──► (push) bwoc-devices │
│
bwoc-llm-pm ── independent of bwoc CLI; complements bwoc-mcc ──────────┘
Every desktop or menu-bar app calls bwoc by name and parses --json output. No app reads .bwoc/ files directly. No app depends on bwoc-cli or bwoc-harness at build time (except bwoc-chat, which depends only on bwoc-core for the protocol types). Device firmware consumes only the fleet JSON payload, not the CLI. This means the CLI's --json surface and bwoc-device-proto are the stability boundary for the whole family: change them carefully, version them explicitly.
Separately, bwoc-gateway adds a second axis. Where the CLI --json surface fans fleet state out to dashboards and devices, the gateway relays messages between agents that cannot reach each other directly: bwoc send over transport = "gateway" on the sending side, and a supervised bwoc-gateway-recv bridge into the inbox on the receiving side. It rides the same signed-envelope trust contract as local delivery — the relay only sees a recipient header and stays untrusted — so adding a remote peer changes the transport, never the trust model.
Back to the handbook index: ../README.md — Glossary: ../glossary.en.md