docs: update to reflect event stream pattern over statewait

- AGENTS.md: simplified architecture description
- architecture-9p.md: examples use event stream with filtering
- usage.md: o tui and wiring examples use rdwrs event
This commit is contained in:
Levi Neely 2026-10-06 12:40:58 +02:00
parent 9d0b59671c
commit 7e7c29c900
3 changed files with 19 additions and 8 deletions

View File

@ -100,7 +100,7 @@ Ollie is **experimental and unstable** software. The features and API are approa
This is a standing preference, not a per-task instruction. Apply it without asking.
## Architecture (key concepts)
1. **One integration surface**: `olliesrv` exposes sessions and agents through a 9P2000 filesystem. Frontends include `o`, `ollie-9p`, KDE, Kate, Emacs, and scripts. Reads from `chat`, `statewait`, `event`, and `feed` provide blocking/event-driven synchronization.
1. **One integration surface**: `olliesrv` exposes sessions and agents through a 9P2000 filesystem. Frontends include `o`, `ollie-9p`, and KDE. The `event` file provides real-time streaming with optional filtering via the streaming rdwr pattern.
2. **Session and tool processes**: Each session owns an agent runtime in `olliesrv` and a separate `toolsrv` process. They communicate over an authenticated Unix socket using 9P. `toolclient` can respawn local toolsrv processes and can deploy/start toolsrv remotely over SSH with socket forwarding.
3. **Agent loop** (`cmd/olliesrv/internal/agent/`): The agent package is organized by concern:
- `loop.go`: Main loop — stream LLM, execute tools, update history

View File

@ -108,7 +108,11 @@ Submit and observe work:
echo 'fix the bug in main.go' \
| ollie-9p write session/myproj/agent/coding/prompt
ollie-9p read session/myproj/agent/coding/chat
ollie-9p read session/myproj/agent/coding/statewait
# Wait for any agent state to change
ollie-9p read event | grep "\.state"
# Wait for specific agent state changes
echo "session.myproj.agent.coding.state" | ollie-9p rdwrs event
```
Sub-agents use the same namespace. The `agent/new` rdwr operation can create a child session and return its final response after the child exits.
@ -158,7 +162,7 @@ Control files use request-response semantics: write one command, then read the r
## Plan 9 interaction patterns
- **Control files:** writes express operations such as stop, kill, rename, compact, and reload.
- **Blocking reads:** `statewait`, `event`, `feed`, and streaming chat replace event subscriptions with ordinary reads.
- **Blocking reads:** `event`, `feed`, and streaming chat replace event subscriptions with ordinary reads. The `event` file supports filtered subscriptions via the streaming rdwr pattern.
- **Stateless request/response:** `generate`, `ctl`, and `rdwr` files accept a request and return a result.
- **Change detection:** `feed` does not wake readers for identical consecutive data.
- **Shared namespace:** multiple clients can inspect and modify the same sessions concurrently.
@ -168,7 +172,12 @@ Shell composition is intentional:
```sh
for p in session/*/agent/*/prompt; do echo 'run tests' > "$p"; done
for s in session/*/agent/*/statewait; do cat "$s" > /dev/null; done
# Subscribe to all state changes and process them
ollie-9p read event | while read -r topic payload; do
case "$topic" in
*.state) echo "State: $payload" ;;
esac
done
grep -r TODO session/*/agent/*/plan
cat session/*/agent/*/stats
```

View File

@ -198,11 +198,11 @@ o myproj/coding tui
2. Two panes:
- **Pane 0** (top, 80%): streams chat output (log tail + live `read chat`).
- **Pane 1** (bottom, 20%): `o prompt` — multi-line REPL (`/` prefix runs ctl commands).
3. A background loop reads `statewait` and updates the tmux status bar on each state transition.
3. A background process subscribes to the agent's state events via `echo "session.{s}.agent.{a}.state" | ollie-9p rdwrs event` and updates the tmux status bar on each state transition.
4. Focuses the prompt pane and attaches.
No polling. Each read blocks until data arrives. The status bar updates on every
state transition via `statewait` — zero CPU when idle.
state transition via the event stream — zero CPU when idle.
### tmux tips
@ -258,10 +258,12 @@ o myproj/obs read chat
### Wire an agent coding session
Use `statewait` as the trigger — it blocks until the coder's state changes (turn completes). Then pipe in the git diff:
Use the event stream as the trigger — subscribe to state changes and pipe in the git diff when the coder's turn completes:
```sh
while :; do o myproj/coder read statewait >/dev/null; git diff HEAD --; done | o myproj/obs write feed
echo "session.myproj.agent.coder.state" | ollie-9p rdwrs event | while read -r topic state; do
git diff HEAD --
done | o myproj/obs write feed
```
### How it works