diff --git a/README.md b/README.md index 04f6d8a..515d0fe 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ This is **multi-host, multi-container** — not single-host. Each agent runs in ▼ ▼ ▼ ┌──────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ pi agent │ │ opencode │ │ claude-code │ -│ (pica) │ │ (local or cont.) │ │ (local or cont.) │ -│ Codex CLI │ │ OpenCode CLI │ │ Claude Code CLI │ -│ --print │ │ run / TUI │ │ exec / TUI │ +│ (pica) │ │ (orca.fritz.box) │ │ (noether.fritz │ +│ Codex CLI │ │ OpenCode CLI │ │ .box) │ +│ --print │ │ run / TUI │ │ Claude Code CLI │ │ NPU inference │ │ provider-agnostic│ │ Anthropic Claude │ └──────┬───────┘ └────────┬─────────┘ └────────┬─────────┘ │ │ │ @@ -29,19 +29,20 @@ This is **multi-host, multi-container** — not single-host. Each agent runs in │ memory server │ │ (memory.fritz │ │ .box:8080/sse) │ + │ (boltzmann) │ └─────────────────┘ ``` -Each agent is independent — separate process, separate container, separate config. Hermes invokes them via the appropriate transport (MCP shell, lmcp, SSH, direct CLI). +Each agent is independent — separate host, separate Incus container, separate config. Hermes invokes them via SSH or lmcp: ## Agents | Agent | CLI | Invocation | Transport | Location | |-------|-----|------------|-----------|----------| -| **Hermes** | `hermes` | n/a (orchestrator) | — | hertz (bare metal) | -| **pi** | `pi --print` | `pi_exec` MCP tool, SSH+nohup | MCP / SSH | pica (RPi5, container) | -| **opencode** | `opencode run` | direct terminal or bg pty | local terminal | any container | -| **claude-code** | `claude` | direct terminal or bg pty | local terminal | any container | +| **Hermes** | `hermes` | n/a (orchestrator) | — | hertz | +| **pi** | `pi --print` | `pi_exec` MCP tool, SSH+nohup | MCP / SSH | pica (Incus) | +| **opencode** | `opencode run` | SSH / lmcp / direct terminal | SSH / MCP | orca.fritz.box (Incus) | +| **claude-code** | `claude` | SSH / lmcp / direct terminal | SSH / MCP | noether.fritz.box (Incus) | ## Invocation Patterns @@ -62,13 +63,23 @@ ssh mfritsche@pica "pi --print --provider hossenfelder --model qwen3.5-9b-npu 'p ### One-Shot (opencode) ``` -opencode run 'Implement retry logic for API calls' --model openrouter/anthropic/claude-sonnet-4 +# Via SSH on orca +ssh mfritsche@orca "opencode run 'Implement retry logic for API calls' --model openrouter/anthropic/claude-sonnet-4" + +# Or via lmcp on orca +curl -s http://orca.fritz.box:8080/mcp -H "Authorization: Bearer " \ + -d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"shell","arguments":{"command":"opencode run '...'","timeout":120}}}' ``` ### One-Shot (claude-code) ``` -claude execute -p 'Refactor the auth module and add tests' --model claude-sonnet-4 +# Via SSH on noether +ssh mfritsche@noether "claude execute -p 'Refactor the auth module and add tests'" + +# Or via lmcp on noether +curl -s http://noether.fritz.box:8080/mcp -H "Authorization: Bearer " \ + -d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"shell","arguments":{"command":"claude execute -p '...'","timeout":120}}}' ``` ### Background / Long-Running Tasks @@ -77,12 +88,15 @@ claude execute -p 'Refactor the auth module and add tests' --model claude-sonnet # pi: SSH + nohup with lock file, timeout per file # See references/batch-pi-processing.md for full pattern -# opencode/claude-code: terminal background + pty -terminal(command="opencode", background=true, pty=true) -# then: process(action="submit", data="prompt") +# opencode on orca: SSH background +ssh -f mfritsche@orca "opencode run 'Long task' > /tmp/opencode.log 2>&1" -terminal(command="claude", background=true, pty=true) -# then: process(action="submit", data="prompt") +# claude-code on noether: SSH background +ssh -f mfritsche@noether "claude execute -p 'Long task' > /tmp/claude.log 2>&1" + +# Or via lmcp with shell_bg on either host +curl -s http://orca.fritz.box:8080/mcp -H "Authorization: Bearer " \ + -d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"shell_bg","arguments":{"command":"opencode run '...'","log":"/tmp/opencode-task.log"}}}' ``` ## Shared Memory Patterns @@ -118,18 +132,18 @@ Simple, universal. Used in the batch-pi-processing pattern. YES — this is designed for separate hosts/containers. Each agent is independently deployed: -| Host | Container? | Agent | Notes | -|------|-----------|-------|-------| -| hertz | bare metal | Hermes | Orchestrator, MCP client | -| pica | Incus | pi agent | RPi5, RK3588 NPU, qwen3.5-9b-npu | -| boltzmann | Incus | Stash / memory | Postgres, pgvector | -| (any) | Incus or Docker | opencode | Provider-agnostic | -| (any) | Incus or Docker | claude-code | Anthropic Claude | +|| Host | IP / FQDN | Container? | Agent | Notes | +||------|-----------|-----------|-------|-------| +|| hertz | hertz.fritz.box | bare metal | Hermes | Orchestrator, MCP client | +|| pica | pica.fritz.box | Incus | pi agent | RPi5, RK3588 NPU, qwen3.5-9b-npu | +|| orca | orca.fritz.box | Incus | opencode | OpenCode CLI | +|| noether | noether.fritz.box | Incus | claude-code | Claude Code CLI | +|| boltzmann | boltzmann.fritz.box | Incus | Stash / memory | Postgres, pgvector | **No shared filesystem required.** Communication is via: -- MCP (HTTP/SSE) — stash, pi_exec, file tools -- SSH — fallback for pi on pica -- Hermes terminal — opencode and claude-code on any reachable host +- **SSH** — primary transport to orca, noether, and pica +- **lmcp** — HTTP MCP bridge running on each container (where set up) +- **MCP (SSE)** — stash memory server on boltzmann ## Recommendations