Remove cmd/anvilweb, cmd/anvilwebgw, cmd/anvillm, and elisp/

Drop legacy frontend proof-of-concepts (TUI, web UI, HTTP gateway,
Emacs major mode) to focus on the core. Assist remains as the primary
frontend; any 9P-speaking program can serve as a frontend.

Update README, mkfile, .gitignore, and architecture/client-interactions
diagrams accordingly.
This commit is contained in:
Levi Neely 2026-03-18 23:20:54 +01:00
parent 304bf25bf1
commit c5e95eb1ea
13 changed files with 25 additions and 6571 deletions

3
.gitignore vendored
View File

@ -2,13 +2,10 @@ Q
Prompt
Q-Reset
Q-Login
/anvillm
/anvilweb
/anvilmcp
.claude
.kiro
*.elc
/Assist
/anvilsrv
/anvilwebgw
*.test

View File

@ -6,8 +6,8 @@ LLM orchestrator using 9P — scriptable, multi-backend, crash-resilient
![Architecture](docs/diagrams/architecture.svg?v=2)
**Core:** anvilsrv (9P daemon), anvilmcp (MCP server), anvilwebgw (API proxy)
**Clients:** Assist (Acme), anvillm.el (Emacs), anvillm (TUI), anvilweb (web)
**Core:** anvilsrv (9P daemon), anvilmcp (MCP server)
**Frontends:** Any 9P-speaking program — currently Assist (Acme)
**Benefits:** Shared sessions, crash recovery, scriptable via 9P, cross-backend agent communication
## Why 9P?
@ -56,30 +56,19 @@ NAMESPACE=/tmp/ns.$USER.:1 anvilsrv start
NAMESPACE=/tmp/ns.$USER.:1 Assist
```
### Clients
### Frontends
**TUI:** `anvillm` — Keys: `s` start | `p` prompt | `t` stop | `R` restart | `K` kill | `a` alias | `r` refresh | `d` daemon | `?` help | `q` quit
Any program that speaks 9P can be a frontend. The 9P filesystem exposes session management, state, messaging, and configuration as plain files — so building a new frontend is just reading and writing files. Past prototypes have included a TUI, a web UI with HTTP gateway, and an Emacs major mode, all built against the same API. The current frontend is:
**Emacs:** `(require 'anvillm)` then `M-x anvillm` — Keys: `s` start | `p` prompt | `P` prompt (minibuffer) | `t` stop | `R` restart | `K` kill | `a` alias | `r`/`g` refresh | `d` daemon | `?` help | `q` quit
- **Assist** — an Acme client (middle-click `Assist` to launch)
**Web:** `anvilweb` (port :8080) — ⚠️ NO auth, localhost only — Remote: `ssh -L 8080:localhost:8080 user@remote`
For web frontends that can't speak 9P directly, `anvilwebgw` bridges HTTP to 9P.
**Acme:** Type `Assist` and middle-click
The `mcptools` scripts (served via 9P at `tools/`) also provide convenient building blocks for frontends:
**Tag commands:** `Get Attach Stop Restart Kill Alias Context Daemon Inbox Archive`
**Interaction:** Right-click ID for prompt window, 2-1 chord for fire-and-forget
| Command | Action |
|---------|--------|
| `Get` | Refresh session list |
| `Kiro <dir>` / `Claude <dir>` / `Ollama <dir>` | Start session |
| `Attach <id>` | Open tmux |
| `Stop <id>` / `Restart <id>` / `Kill <id>` | Control session |
| `Alias <id> <name>` | Name session |
| `Context <id>` | Edit context |
| `Daemon` | Manage daemon |
| `Inbox [id]` / `Archive [id]` | View messages |
```sh
bash <(9p read tools/<scriptname>)
```
## Configuration
@ -307,7 +296,7 @@ Bot templates provide pre-configured agents for common tasks. Templates are shel
./bot-templates/Conductor kiro /path/to/project
```
Templates set up context, roles, and initial configuration. Interact via any client (Assist, TUI, Emacs, Web) or directly via 9P mailbox.
Templates set up context, roles, and initial configuration. Interact via Assist or directly via 9P mailbox.
**Creating Templates:** Shell scripts that write to `anvillm/ctl` and configure `context`, `role`, `tasks`. See existing templates for examples.
@ -321,7 +310,7 @@ Conductor receives the top-level bead ID, analyzes dependencies, and spawns agen
### Usage
Examples use raw 9P calls. These actions can also be performed from any front-end (Assist, TUI, Emacs, Web).
Examples use raw 9P calls. These actions can also be performed from Assist.
**1. Taskmaster: Create tasks from project plan**
@ -348,7 +337,7 @@ echo '{"to":"'$CONDUCTOR_ID'","type":"WORK_REQUEST","subject":"Execute","body":"
Conductor analyzes dependencies, spawns specialized bots, and delegates work in parallel.
**Monitoring:** Use any front-end (Assist, TUI, Emacs, Web). For custom integrations, see `EVENTS.md`.
**Monitoring:** Use Assist or any 9P client. For custom integrations, see `EVENTS.md`.
## MCP Integration
@ -382,6 +371,4 @@ See [Code Execution User Guide](docs/code-execution-user-guide.md) for details.
| 9P not working | `9p ls agent` |
| Stale PID | `anvilsrv stop` auto-cleans |
| Daemon won't stop | `anvilsrv fgstart` for logs |
| anvilweb issues | Check anvilsrv running, namespace matches |
See Configuration section for environment variables.

File diff suppressed because it is too large Load Diff

View File

@ -1,60 +0,0 @@
// anvilweb - AnviLLM static web frontend server
//
// Serves the AnviLLM web frontend (static files) and proxies /api/* requests
// to anvilwebgw (the HTTP gateway service). Run anvilwebgw separately to
// handle the 9P-connected API endpoints.
package main
import (
"anvillm/internal/logging"
"embed"
"flag"
"fmt"
"io/fs"
"net/http"
"net/http/httputil"
"net/url"
"os"
"go.uber.org/zap"
)
//go:embed static/*
var static embed.FS
var (
addr = flag.String("addr", ":8080", "HTTP server address")
gwAddr = flag.String("gw", "http://localhost:8081", "anvilwebgw gateway URL for /api/* requests")
)
func main() {
if err := logging.Init(); err != nil {
fmt.Fprintf(os.Stderr, "Failed to initialize logging: %v\n", err)
os.Exit(1)
}
defer logging.Logger().Sync()
flag.Parse()
gwURL, err := url.Parse(*gwAddr)
if err != nil {
logging.Logger().Fatal("invalid gateway URL", zap.String("url", *gwAddr), zap.Error(err))
}
staticFS, err := fs.Sub(static, "static")
if err != nil {
logging.Logger().Fatal("failed to load static files", zap.Error(err))
}
// Reverse proxy for /api/* to anvilwebgw
proxy := httputil.NewSingleHostReverseProxy(gwURL)
mux := http.NewServeMux()
mux.Handle("/api/", proxy)
mux.Handle("/", http.FileServer(http.FS(staticFS)))
logging.Logger().Info("starting anvilweb", zap.String("addr", *addr), zap.String("gateway", *gwAddr))
if err := http.ListenAndServe(*addr, mux); err != nil {
logging.Logger().Fatal("server error", zap.Error(err))
}
}

View File

@ -1,2 +0,0 @@
anvilweb:V:
cd cmd/anvilweb && go build -o $home/bin/anvilweb

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,15 @@
graph TB
subgraph Clients
subgraph Clients["Frontends (any 9P client)"]
Assist["Assist<br/>(Acme)"]
TUI["TUI"]
Emacs["Emacs"]
Web["Web"]
Custom["Custom<br/>(your own)"]
end
WebApp["Web App"]
subgraph Core["Core Services"]
anvilsrv["anvilsrv<br/>(9P daemon)"]
anvilmcp["anvilmcp<br/>(MCP server)"]
anvilwebgw["anvilwebgw<br/>(API proxy)"]
anvilwebgw["anvilwebgw<br/>(HTTP↔9P bridge)"]
end
subgraph Backends
@ -20,9 +20,8 @@ graph TB
end
Assist -->|9P| anvilsrv
TUI -->|9P| anvilsrv
Emacs -->|9P| anvilsrv
Web -->|HTTP| anvilwebgw
Custom -->|9P| anvilsrv
WebApp -->|HTTP| anvilwebgw
anvilwebgw -->|9P| anvilsrv
anvilsrv --> Claude

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,9 +1,8 @@
graph TB
Assist["Assist"]
TUI["TUI"]
Frontend["Frontend<br/>(any 9P client)"]
Script["Script"]
FS["anvillm/<br/>(9P filesystem)"]
Assist -->|9p read<br/>anvillm/list| FS
TUI -->|9p write<br/>anvillm/ctl| FS
Frontend -->|9p read<br/>anvillm/list| FS
Frontend -->|9p write<br/>anvillm/ctl| FS
Script -->|9p read<br/>anvillm/events| FS

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

File diff suppressed because it is too large Load Diff

4
mkfile
View File

@ -5,9 +5,6 @@ all:V: install
build:V:
go build -o $INSTALL_PATH/anvilsrv ./cmd/anvilsrv
go build -o $INSTALL_PATH/Assist ./cmd/Assist
go build -o $INSTALL_PATH/anvillm ./cmd/anvillm
go build -o $INSTALL_PATH/anvilweb ./cmd/anvilweb
go build -o $INSTALL_PATH/anvilwebgw ./cmd/anvilwebgw
go build -o $INSTALL_PATH/anvilmcp ./cmd/anvilmcp
cp scripts/Alog $INSTALL_PATH/Alog
chmod 0755 $INSTALL_PATH/Alog
@ -71,5 +68,4 @@ cron-remove:V:
clean:V:
rm -f $INSTALL_PATH/anvilsrv
rm -f $INSTALL_PATH/anvilwebgw
rm -f $INSTALL_PATH/Assist