100 lines
5.0 KiB
Markdown
100 lines
5.0 KiB
Markdown
|
|
# Box Web Surface & Orchestration Architecture
|
||
|
|
|
||
|
|
This guide describes the architecture connecting the **4 autonomous browser agents** (`muse`, `pip`, `646`, `opm`) across `bl` (`100.123.153.75`) and the public Web UI surfaces hosted on the Google Cloud VM (`34.139.37.135` / `box.muse-dev.online`).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Network Topology & Trust Domains
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart LR
|
||
|
|
subgraph Browser ["Web Client / Operator"]
|
||
|
|
UI["box.muse-dev.online\n(PIN 3128)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Edge ["Cloudflare & Edge"]
|
||
|
|
CF["Cloudflare Proxy"]
|
||
|
|
Caddy["Caddy (Reverse Proxy & TLS)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph VM ["Google Cloud VM (34.139.37.135)"]
|
||
|
|
Board["/srv/board/server.py\n(:8000 Board Service)"]
|
||
|
|
Static["/srv/box/www/\n(index.html, box.js, box.css)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Compute ["Compute Node bl (100.123.153.75)"]
|
||
|
|
Bridge["Tailnet SSH Bridge\n(super@100.123.153.75)"]
|
||
|
|
Ctl["bin/box-ctl.py & super-cli.py"]
|
||
|
|
Agents["Browser NetNS Nodes\n(muse, pip, 646, opm)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
UI --> CF --> Caddy
|
||
|
|
Caddy -->|Static Files| Static
|
||
|
|
Caddy -->|/api/box/*| Board
|
||
|
|
Board -->|Allowlisted SSH Verbs| Bridge --> Ctl --> Agents
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trust & Identity Principles
|
||
|
|
1. **Host as Source of Truth (`bl`)**: All mutating state, cryptographic keys, job definitions, variables, and browser CDP relays reside on `bl`. The VM does not persist authoritative fleet state.
|
||
|
|
2. **On-Demand Tailnet SSH Bridge**: The VM board service bridges into allowlisted verbs in [`bin/box-ctl.py`](file:///home/super/Projects/NetVM/bin/box-ctl.py) using an on-demand Tailnet SSH connection (`super@100.123.153.75`).
|
||
|
|
3. **Session Authentication & Brute-Force Defense**:
|
||
|
|
- Operator console access is unlocked via `POST /api/ops/login` with operator PIN `3128`, establishing cookie `ops_session`.
|
||
|
|
- Successful PIN logins bypass the rate limiter. Failed attempts are constrained by a 10-attempt sliding window.
|
||
|
|
4. **Agent-Scoped Privacy Tiers**:
|
||
|
|
- `ops_session` grants unredacted administrative visibility across all DMs, logs, loops, and actions.
|
||
|
|
- Unauthenticated or agent-scoped queries receive redacted logs filtered to their respective identities.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. API Surface Catalog
|
||
|
|
|
||
|
|
### Fleet & Messaging Endpoints
|
||
|
|
* **`GET /api/box/fleet`**: Real-time CDP latency, node status, current page titles, and queue depths across all 4 nodes (`muse`, `pip`, `646`, `opm`).
|
||
|
|
* **`GET /api/box/dm/log?limit=N`**: Chronological stream of signed Work Orders, Jobs, and agent responses.
|
||
|
|
|
||
|
|
### Job & Timer Automation
|
||
|
|
* **`GET /api/box/timers`**: Active systemd timer schedules and registered jobs.
|
||
|
|
* **`POST /api/box/jobs/{name}/trigger`**: Asynchronous hot-trigger calling `box-ctl.py job-trigger <name>`. Returns `202 Accepted` immediately without blocking the browser turn.
|
||
|
|
|
||
|
|
### Intrinsic Loop & Strategy Mutators (Stage 2)
|
||
|
|
* **`GET /api/box/loop/health`**: Real-time ratio of answered+closed loops vs landed loops with health verdicts.
|
||
|
|
* **`GET /api/box/loop/status`**: Detailed list of open loops, deadlines, and nudge counts.
|
||
|
|
* **`GET /api/box/loop/strat`**: Hierarchy of strategy policies.
|
||
|
|
* **`POST /api/box/loop/strat`**: Mutate strategy policy (`type`, `subtype`, `priority`, `timeout_s`, `nudges`, `escalate`).
|
||
|
|
* **`POST /api/box/loop/strat/reset`**: Reset a custom strategy override to built-in defaults.
|
||
|
|
* **`GET /api/box/loop/vars`**: Dynamic runtime control variables with full validation schema and units.
|
||
|
|
* **`POST /api/box/loop/vars`**: Mutate a runtime control variable (`name`, `value`).
|
||
|
|
* **`POST /api/box/loop/vars/reset`**: Reset a variable to its default value.
|
||
|
|
* **`GET /api/box/loop/vars/history?name=...`**: Audit trail of variable mutations and rollbacks.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Web Console Architecture (`/srv/box/www/`)
|
||
|
|
|
||
|
|
* **[`index.html`](file:///home/super/Projects/NetVM/web/box/www/index.html)**: Clean, single-page application structure supporting 4 dedicated views:
|
||
|
|
1. **Fleet Pulse & Node Cards**
|
||
|
|
2. **Live DM & Work Order Stream** (with search and tag filtering)
|
||
|
|
3. **Timers & Scheduled Jobs** (with `▶ Run` hot triggers)
|
||
|
|
4. **Loops, Strategy Matrix & Runtime Variables** (with interactive edit/reset modals)
|
||
|
|
* **[`box.js`](file:///home/super/Projects/NetVM/web/box/www/box.js)**: Dependency-free ES6 application managing live polling (5s interval), modal interactions, optimistic updates, and curl drawer telemetry.
|
||
|
|
* **[`box.css`](file:///home/super/Projects/NetVM/web/box/www/box.css)**: Responsive terminal dark theme.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Operational Runbook
|
||
|
|
|
||
|
|
### Hot-Triggering a Fleet Health Audit
|
||
|
|
1. Navigate to **Timers & Jobs** on `https://box.muse-dev.online/`.
|
||
|
|
2. Click **▶ Run** on `box-http-health`.
|
||
|
|
3. The button updates to `Triggering...` then `✓ Sent`.
|
||
|
|
4. The background job dispatches via `646`, runs HTTP assertions, and records a `[RESULT ...]` in `job-log.jsonl`.
|
||
|
|
|
||
|
|
### Dynamically Tuning Runtime Variables
|
||
|
|
To adjust nudge limits without restarting services:
|
||
|
|
```bash
|
||
|
|
# Via Web Console: Navigate to Loop & Strategy tab -> Click "✎ Edit" on max_nudge_count
|
||
|
|
# Or via CLI on bl:
|
||
|
|
super vars set max_nudge_count 3
|
||
|
|
super vars get max_nudge_count
|
||
|
|
```
|