Set platform_toolsets[api_server] = [] in ~/.hermes/config.yaml. Measured back on /v1/toolsets: 28 rows before and after, enabled 14 -> 0, registered tools 40 -> 0. The row count surviving matters — SVOS's _hermes_roster derives its required-config line from the full report, so narrowing the surface does not blind the diagnostic. terminal, code_execution, file, browser and computer_use are now unregistered rather than merely unreachable. Separately, record an unresolved finding raised by svos-dev: model.default names anthropic/claude-opus-4.6 and model.base_url names openrouter, but provider: auto with only a zai credential resolves Miranda to GLM-5.3 on the paid z.ai Coding Plan. Nothing under ~/.hermes references the LiteLLM gateway. The operator believes Miranda runs on gen-large, which does exist on LiteLLM. Not repointed — the premise is his to confirm.
96 lines
6.1 KiB
Markdown
96 lines
6.1 KiB
Markdown
# nh3-dev
|
|
|
|
NH3-site **developer box** — `10.100.10.50` (WireGuard-reachable from the NH3
|
|
subnet). General-purpose dev VM that hosts agent-fleet sidecars and live Claude
|
|
Code sessions; **not** a Docker-stack host in the `stacks/` sense.
|
|
|
|
**Reach:** `ssh 10.100.10.50` (as `lkraven`), or the dedicated agent identity
|
|
`ssh -i ~/.ssh/infra-ops_ed25519 infra-ops@10.100.10.50` (NOPASSWD sudo).
|
|
`infra-ops` bootstrapped here 2026-06-04 (see [`reference_infra_ops_sudo_identity`]
|
|
in auto-memory). Note: Claude Code sessions often run **natively on this box**, so
|
|
local Bash already executes here — no SSH-to-self needed for non-privileged work.
|
|
|
|
## What runs here
|
|
|
|
- **NH3 egress proxy — RETIRED 2026-09-06** (replaced by headscale exit nodes; `danted` disabled, config `.retired`). Was: durable internal-only SOCKS5 `socks5h://10.100.10.50:1080`
|
|
(dante, ACL'd to the WG net). Residential egress for colo services gated on their
|
|
datacenter IP (e.g. YouTube bot-gate). Runbook + setup committed; consumers point
|
|
`*_PROXY` at it.
|
|
- **ttyd fleet driver-seat** — web/iPad seat into the zellij `Claude` session (ttyd
|
|
behind Caddy; OSC52 clipboard shim). User systemd services under `~/.config`.
|
|
- **mead-hall** — Bifrost tool-provider sidecar (`:5173`), CI-deployed from
|
|
`vh/mead-hall`.
|
|
- **Hermes Agent gateway** — OpenAI-compatible agent API on `127.0.0.1:8765`
|
|
(`hermes-gateway.service`, user systemd, installed 2026-09-14 via `hermes
|
|
gateway install`). Runs the per-user install at `~/.hermes/hermes-agent`
|
|
(v0.21.1, `b88e677`); config in `~/.hermes/{.env,config.yaml}`. Stood up for
|
|
**SVOS/Miranda**, which replaced Worldtree with Hermes on 2026-09-11 and
|
|
cannot boot without it. Bearer auth is mandatory even on loopback — key
|
|
vaulted as `nh3-dev/hermes/api-server-key`. ⚠ The gateway registers Hermes's
|
|
**full** toolset by default — 28 toolsets, 14 enabled, `terminal` /
|
|
`code_execution` / `file` / `browser` among them. SVOS's security model is that
|
|
write-capable tools are never *registered*, not that they are refused at
|
|
dispatch, so `platform_toolsets: {api_server: []}` is set in `config.yaml`
|
|
(2026-09-14) and measured back as 28 rows / **0 enabled / 0 tools** on
|
|
`/v1/toolsets`. The endpoint still reports all 28 rows with their flags, which
|
|
is what SVOS's `_hermes_roster` derives its required-config line from —
|
|
narrowing does not blind it. Becomes `[svos_miranda]` once SVOS's plugin lands
|
|
in `$HERMES_HOME/plugins/`.
|
|
- ⚠ **Hermes model resolution is NOT the free local gateway.** `model.default`
|
|
says `anthropic/claude-opus-4.6` and `model.base_url` says openrouter, but
|
|
`provider: auto` plus a lone `zai` credential in `auth.json` resolves Miranda
|
|
to **GLM-5.3 over the paid z.ai Coding Plan**
|
|
(`https://api.z.ai/api/coding/paas/v4`). Nothing under `~/.hermes` references
|
|
the LiteLLM gateway at all. Raised 2026-09-14 by svos-dev, who reports the
|
|
operator believes Miranda runs on `gen-large` (free local). `gen-large` does
|
|
exist on LiteLLM. **Unresolved — do not repoint without the operator**, the
|
|
premise is his to confirm.
|
|
- **bloom_music dev** — `~/development/bloom_music`; its `web/` test harness uses
|
|
Playwright headless Chromium for OSMD browser-geometry assertions.
|
|
- **The Booth** — ephemeral media drop board (`:8090`, `booth.service`), from
|
|
eshpfi `services/booth/`. Lets CC sessions surface A/B renders + smoke results
|
|
(and browser uploads for pickup) to the operator; 24h TTL, Homepage-linked.
|
|
Since 2026-09-09 it also carries **asks** — a session poses a multiple-choice
|
|
question in a booth, the operator answers a radio form + notes in the browser,
|
|
and the pick lands as an answer sidecar the session reads (`booth ask` /
|
|
`booth answer --wait`). ⚠ The **`booth` CLI is on PATH via
|
|
`~/.local/bin/booth` → `services/booth/scripts/booth`**, symlinked 2026-09-09;
|
|
before that it was on no PATH at all, so every session following the global
|
|
link-board convention was hitting `command not found` unless it used the full
|
|
path. `~/.zshenv` puts `~/.local/bin` in PATH for non-interactive `ssh nh3-dev
|
|
'<cmd>'` too.
|
|
- **jackdaw-compose** — JackDAW AI Composer `/compose` backend (`:8787`,
|
|
`jackdaw-compose.service`), a thin stateless `bun server/index.ts` from
|
|
`~/development/jackdaw` → LiteLLM `gen`. Origin-gated (INV-BK04/BK05), reached
|
|
same-origin via the `:4500` bench's `/compose` proxy. Hosted for jackdaw-dev
|
|
(their code; the model endpoint + key live in server env only — unit is `0600`,
|
|
not committed).
|
|
|
|
## Box-wide Playwright / Chromium (2026-06-04)
|
|
|
|
Available to **every user/project** on this box — no per-home `playwright install`:
|
|
- System shared-libs: apt-installed via `playwright install-deps chromium` (Debian-12
|
|
set + xvfb), global.
|
|
- Browser binaries: **shared `/opt/ms-playwright`** (chromium-1223 + headless-shell +
|
|
ffmpeg), root-owned, world-readable. Installed via `infra-ops`.
|
|
- Discovery: `PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright` set globally in
|
|
`/etc/environment` (PAM/all sessions) + `/etc/profile.d/playwright-browsers.sh`
|
|
(login shells). A project just `npm i playwright` (skip-browser-download is fine) and
|
|
resolves the shared binary; verified launching headless from `/opt` as a normal user.
|
|
- To add more browsers / bump: `ssh infra-ops@10.100.10.50 'sudo env
|
|
PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright npx -y playwright install <browser>'`.
|
|
|
|
## Notes
|
|
|
|
- **PFI-owned Linux** — in scope for `infra-ops` management (apt, systemctl, service
|
|
lifecycle). Added to the fleet bootstrap's Tier 1.
|
|
- OS: Debian 12 (bookworm). See `system-details.txt` for the latest snapshot
|
|
(`scripts/refresh-server-info.sh nh3-dev`).
|
|
- Not in the colo Docker-stack topology — no `/opt/docker/compose` deploy target;
|
|
workloads are systemd services + dev checkouts.
|
|
- **Retired (2026-06-08):** `volva.service` + `heid.service` user systemd units
|
|
removed. Heid/Volva were re-architected from Python systemd daemons (`volva run`
|
|
/ `heid run` pollers) into Claude Code session orchestrators (heid commit
|
|
`12aa5a9`); the `~/development/volva` dir + venvs are gone. `volva.service` had
|
|
been crash-looping `203/EXEC`. Cleanup done by infra-ops at heid's request.
|