snapshot: preserve central wiki state 2026-08-15 (7 modified + 1 new file)

This commit is contained in:
Tony0410
2026-08-15 22:11:30 +08:00
commit 92e8028bb8
71 changed files with 9897 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
---
title: Browser Backend
type: system
status: active
created: 2026-07-22
updated: 2026-08-02
verified_on: 2026-08-02
confidence: high
tags: [browser, camofox, automation]
sources: [live-probe, config, session-history]
---
# Browser Backend
## Purpose
Browser automation for Hermes — web search, form filling, screenshot, CDP control, authenticated scraping.
## Current Configuration (as of 2026-08-02)
- **Primary backend:** Camoufox (Firefox-based, anti-fingerprint) on CT450
- **Provider config:** `browser.cloud_provider: camofox`, `camera_provider: camofox`
- **REST API:** `localhost:9093` (profile `anthony`, sessionKey `anthony`)
- **CDP WebSocket:** `localhost:9377` (via Camoufox's Playwright bridge)
- **VNC viewer:** `https://ct460.kangaroo-eel.ts.net/vnc-camofox` (port 6080)
- **Steel Browser (CT201):** Still running but Hermes not connected — plugin disabled
## Camoufox (CT450)
- **Host:** CT450 (same host as Hermes — no network hop)
- **Deployment:** Systemd service `camofox-browser.service`
- **Engine:** Camoufox (custom Firefox build with anti-detection fingerprinting)
- **Display:** Headed via Xvfb `:99` (1600×1200×24) + fluxbox window manager
- **Auth:** Persistent profile `anthony` — authenticated into Uber Eats, LinkedIn, etc.
- **Connection:** REST API at `localhost:9093` for session management, CDP WebSocket at `localhost:9377` for browser tools
- **Last verified:** Jul 30 — `browserConnected: true`, `sessions: 1`, `tabs: 1`, active 200s on scroll/navigate
### Access
| Endpoint | URL | Used by |
|---|---|---|
| REST API | `http://localhost:9093` | Hermes browser tools (navigate, click, snapshot) |
| CDP WebSocket | `ws://localhost:9377` | Direct CDP control |
| VNC | `https://ct460.kangaroo-eel.ts.net/vnc-camofox` | Visual session viewer |
| Camoufox UI | `http://localhost:9378` | Internal management |
### Config
- `cloud_provider: camofox` in `~/.hermes/config.yaml`
- `CAMOFOX_URL=http://localhost:9093` in `~/.hermes/.env`
- `CAMOFOX_API_KEY` in `~/.hermes/.env`
- Profile: `anthony` (502913bf) — NOT `persist-anthony`
## Steel Browser (CT201) — Disabled
- **Status:** Still running on CT201, Hermes not connected since 2026-07-30
- **Plugin:** `browser-steel` at `/home/hermes/.hermes/plugins/browser-steel/` — disabled
- **CDP:** `http://100.96.244.39:9223`
- **REST API:** `http://100.96.244.39:3000`
- **UI:** `https://runtipi.kangaroo-eel.ts.net/steel`
- **See:** [[comparisons/steel-vs-camoufox]] for the full experiment story
## History
- **2026-07-22:** Camoufox primary, cua-driver bridge
- **2026-07-29:** Steel Browser deployed on CT201, became primary
- **2026-07-30:** Steel reverted — CDP issues + DeepSeek 0731 tool name validation problems. Camoufox restored as primary.
- **2026-08-02:** Camoufox confirmed working with authenticated sessions (Uber Eats report via Camofox REST API)
## Related
- [[comparisons/steel-vs-camoufox]]
- [[concepts/browser-automation]]
- [[decisions/rollback-steel-to-camofox]]
- [[runbooks/restart-browser]]
+40
View File
@@ -0,0 +1,40 @@
---
title: Cloudflare Tunnel
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: high
tags: [system, network, cloudflare]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Cloudflare Tunnel
## Purpose
Exposes internal homelab services, including Hermes, to the public internet without opening inbound firewall ports.
## Location
- **Runs on:** ct207 "webserver" (Tailscale `100.82.40.23`), **not** on this host.
- **Binary:** `/bin/cloudflared`
- **Service:** `cloudflared.service` (systemd, active/running on ct207)
- **Tunnel name / ID:** `ct207-tunnel` / `339a6757-5574-4723-a16c-da4769535caa`
- **Config:** `/etc/cloudflared/config.yml` on ct207; credentials file `339a6757-5574-4723-a16c-da4769535caa.json` in the same directory (not read/copied here — credential material, not a fact to mirror).
## Current configuration
- `originRequest`: `noTLSVerify: true`, `disableChunkedEncoding: true`, `http2Origin: false` (global defaults; some hostnames override per-entry)
- Ingress is a flat list of `hostname → service` mappings ending in `service: http_status:404` catch-all — see [[infrastructure/domains-and-tunnels]] for the full list and the entries specific to Hermes.
- Two Hermes-relevant entries point at this host's Tailscale IP (`100.118.5.51`): `hermes.martinwa.org` (port 19119) and `hermes-desktop.martinwa.org` (port 5174).
## Connected systems
- [[systems/hermes-agent]] — the service actually reached through this tunnel
- [[infrastructure/domains-and-tunnels]] — full hostname table
- [[infrastructure/network-map]]
## Known issues
- This host cannot restart or inspect the tunnel directly (no `cloudflared` installed here); a tunnel-side problem requires access to ct207.
- `mcp-portal.martinwa.org`, referenced in Hermes's own config as an MCP endpoint, was not found in the ct207 ingress list captured 2026-07-22 — **unresolved**, may be on a different tunnel/host.
## Relevant runbooks
- [[runbooks/diagnose-docker]] (closest existing runbook; no dedicated tunnel-restart runbook exists yet — worth writing one that documents `systemctl restart cloudflared` on ct207, since Hermes has no direct access to perform it)
+38
View File
@@ -0,0 +1,38 @@
---
title: Current Hermes Profile
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: high
tags: [system, hermes, profile]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Current Hermes Profile
## Active Profile
- **Name:** `default`
- **Location:** `~/.hermes/profiles/default/`
- **No other profiles confirmed**
## Key Settings
- **Model default:** `freellmapi-auto`
- **Default provider:** `custom:litellm``http://litellm:4000/v1`
- **Switch persistence:** `persist_switch_by_default: false`
- **Timezone:** `Australia/Perth`
- **Approvals mode:** off
- **Memory:** Mnemosyne, session-scoped, auto-sleep enabled
- **Pet slug:** none
- **Skin:** slate
## Paths
- Config: `~/.hermes/config.yaml`
- Working directory: `/home/hermes/workspace`
- Install: `~/.hermes/hermes-agent/`
- Bin: `~/.local/bin/hermes`
## Related
- [[systems/hermes-agent]]
- [[model-providers]]
+44
View File
@@ -0,0 +1,44 @@
---
title: Guanaco
type: system
status: active
created: 2026-08-14
updated: 2026-08-14
verified_on: 2026-08-14
confidence: high
tags: [llm, proxy, router, guanaco, ollama]
sources: [live-probe, session-history]
---
# Guanaco
## Purpose
LLM proxy/router providing model routing and tool-call formatting for the Ollama-based inference stack on CT205.
## Current Configuration
- **Host:** CT205 (`ollama` LXC container) on Proxmox
- **Version:** v0.8.14 (updated from v0.8.11 on 2026-08-14)
- **Repo path (on CT205):** `/root/.guanaco/repo`
- **API endpoint:** `ollama:11434` (DNS) / `localhost:11434`
- **Key component:** `cmdcode_client.py` — Guanaco's tool-call formatting layer (DSML)
## Version History
### v0.8.14 (current, updated 2026-08-14)
- **DSML tag leakage fixes** (cumulative across v0.8.12v0.8.14):
- v0.8.12 — incomplete DSML blocks leaking raw tags as content
- v0.8.13 — comprehensive DSML tag leakage: double-pipe, bare fragments, solo `invoke`
- v0.8.14 — `<dsml_ignore>` blocks, bare parameter values, stray `>` cleanup
- **Dashboard performance fix** (`analytics.py`): fixed wrong column names in optimized history query, cached content size, stopped `SELECT *` on history table
- No new features, no breaking config changes — low-risk incremental bug-fix release
- Local `app.py` modification (working-tree change) survived the tag checkout intact
### v0.8.11 (previous)
- Had known DSML tag leakage issues where malformed tool-call output could leak raw `<dsml_...>` syntax into model context stream
## What DSML Is
DSML = "Daily Smart Messaging Log" — Guanaco's tool-call formatting layer for the cmdcode client. When a model emits a tool call, Guanaco formats it through DSML. Malformed output from the model could previously leak raw tags (`<dsml_invoke>`, bare `>` characters) into the conversation context, which confused downstream models.
## Related
- [[infrastructure/proxmox]] — CT205 in LXC container table
- [[systems/ollama]] — Ollama inference stack (if exists)
+40
View File
@@ -0,0 +1,40 @@
---
title: Headless Server
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: high
tags: [system, browser]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Headless Server
## Purpose
Headless X11 environment backing Hermes's browser automation and any GUI tooling.
## Location
- **Host:** this container (ct460, `hermes`), no separate VM/LXC — headless stack runs directly alongside the agent.
- **Display:** `Xvfb :99`, resolution `1600x1200x24`, started with `-ac -nolisten tcp`
## Current configuration (verified via `ps aux`, 2026-07-22)
| Process | Detail |
|---|---|
| `Xvfb` | `:99 -screen 0 1600x1200x24 -ac -nolisten tcp` |
| `fluxbox` | window manager on `:99` |
| `x11vnc` | `-display :99 -forever -shared -rfbport 5901 -rfbportv6 5901 -noxdamage -quiet -nopw`**no VNC password set** |
| `websockify` ×2 | `127.0.0.1:6080 → 127.0.0.1:5900` and `127.0.0.1:6081 → 127.0.0.1:5901`, serving noVNC (`/usr/share/novnc`) |
Two VNC/websockify pairs exist (5900/6080 and 5901/6081) — the second (`:99`→5901→6081) is the one confirmed above; the first (5900→6080) predates it and wasn't independently re-verified this pass — **unresolved** whether it's a second live display or a leftover process.
## Connected systems
- [[systems/hermes-agent]] (browser backend uses this display — see [[systems/browser-backend]] / [[comparisons/camoufox-vs-chrome]])
- [[infrastructure/hosts]]
## Known issues
- `x11vnc -nopw`: VNC is unauthenticated. It's bound to all interfaces (`0.0.0.0:5901` and `[::]:5901`), not just loopback — reachable from the LAN and, if any tunnel/firewall rule forwards it, potentially beyond. Worth restricting to loopback or adding `-passwd`/`-rfbauth` if this hasn't been a deliberate choice.
## Relevant runbooks
- [[runbooks/restart-browser]]
+141
View File
@@ -0,0 +1,141 @@
---
title: Hermes Agent
type: system
status: active
created: 2026-07-22
updated: 2026-07-25
verified_on: 2026-07-25
confidence: high
tags: [system, hermes, agent, llm]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Hermes Agent
## Purpose
Primary personal agent for Anthony. Runs automation, research, communication, knowledge management, browser control, and scheduled tasks.
## Current Status
- **Version:** v0.19.0 (2026.7.20), upstream `9ecacd6b`
- **Install method:** git
- **Python:** 3.11.15
- **OpenAI SDK:** 2.24.0
- **Upstream status:** Up to date
- **Install directory:** `/home/hermes/.hermes/hermes-agent`
- **Community resources:** [Hermes Registry](https://babylondreams.de/hermes-registry/) — third-party plugins, skills, and extensions
- **Binary:** `/home/hermes/.local/bin/hermes`
- **Config:** `~/.hermes/config.yaml` (version 33)
- **Profile:** `default` (`~/.hermes/profiles/default/`)
## Location
- **Host:** Local Linux host (no containerized Hermes runtime confirmed)
- **Filesystem root:** `~/.hermes/`
- **Working directory:** `/home/hermes/workspace`
## Providers & Routing
- **Default provider:** `custom:litellm``http://litellm:4000/v1`
- **Fallback provider:** `custom:omniroute``http://omniroute:20128/v1`
- **Default model:** `freellmapi-auto`
- **Provider model count:** ~3430 (omniroute), ~1512 (litellm)
- **free-stack combo (OmniRoute):** Nemotron 3 Ultra 550B configured with `max_tokens: 8192`, `reasoning_effort: medium`, `chat_template_kwargs.force_nonempty_content: true` (see [[omniroute]])
- See [[model-providers]] for full breakdown.
## Memory
- **Backend:** Mnemosyne (local native)
- **Memory enabled:** true
- **Char limit:** 5000
- **User profile enabled:** true
- **User char limit:** 3000
- **Flush every:** 6 turns
- **Auto sleep:** true
- **Default scope:** session
- **Vector type:** int8
- **Shared surface:** `data/shared/mnemosyne.db`
- See [[memory-backend]] for details.
## Browser
- **Cloud provider:** Camoufox
- **Managed persistence:** true
- **Inactivity timeout:** 120 s
- **Allow private URLs:** true
- **cua-driver:** v0.9.0 at `/home/hermes/.cua-driver/packages/releases/0.9.0-x86_64-unknown-linux-gnu/cua-driver`
- **DISPLAY:** `:102` (Xvfb/X11VNC/fluxbox confirmed working per session notes)
- See [[browser-backend]] for details.
## Terminal
- **Backend:** local
- **Working directory:** `/home/hermes/workspace`
- **Timeout:** 180 s
- **Home mode:** auto
- **Container CPU:** 1
- **Persistent shell:** true
- See [[terminal-backend]] for details.
## Skills
- **Total installed:** 66
- Key skills: hermes, hermes-gateway-troubleshooting, hermes-mcp-troubleshooting, hermes-api-vault, omniroute, job-search-automation, weekly-review, fresh-rss-intelligence-filter, etc.
- See [[skills-index]] for categorized list.
## Multi-Profile Multiplexer
The default gateway runs as a **profile multiplexer** (`gateway.multiplex_profiles: true`), serving both the `default` and `ops` profiles through a single gateway process with one Telegram connection.
### Profiles
| Profile | Chat | Purpose |
|---------|------|---------|
| default | `-1004321904721` (Rhino chat) | Main agent |
| ops | `-1003914987043` (Elephant ops), `-1003932503629` (OPS Tember rescue) | Operations/infra agent |
### How It Works
- **One gateway, one Telegram bot token** — shared across profiles
- **`profile_routes`** maps chat_id → profile at the gateway level
- **`allowed_chats` on both profiles** must include ALL chats that either profile should hear, because the default profile's adapter processes all inbound messages before `profile_routes` stamps `source.profile`
- The ops profile does NOT need `platforms.telegram.enabled` — the default adapter handles it
### Critical Rule: allowed_chats Is Pre-Route
The `allowed_chats` gate runs on the **default profile's adapter** before `profile_routes` matching. If a chat_id is only in the ops profile's `allowed_chats` but not the default's, messages from that chat are silently dropped before routing ever fires.
**Fix applied 2026-07-28:** Added both ops group IDs to the default profile's `allowed_chats` and `group_allowed_chats` (comma-separated). See [[multiplexer-setup]].
## Messaging Integrations
- **Telegram:** enabled, `allowed_chats: -1004321904721,-1003914987043,-1003932503629`, rich messages
- **Discord:** enabled, streaming true
- **Slack:** enabled
- **Email:** connected
- **Mattermost:** connected
- **ntfy:** connected
- **Google Chat:** available (`hermes-google_chat`)
- **QQ:** available (`hermes-qqbot`)
- **Yuanbao:** available
- See [[messaging-integrations]] for details.
## Scheduled Tasks
- **Cron jobs:** 25 active jobs
- Delivery targets: Telegram (primary), Discord, origin, local
- Notable: Birthday checker, job radar, newsletter digests, GitHub trending, mnemosyne health/watchdog/backup, AgentMail watcher
- See [[scheduled-tasks]] for full table.
## Dependencies
- LiteLLM proxy at `litellm:4000`
- OmniRoute at `omniroute:20128`
- cua-driver binary at path above
- Xvfb + X11VNC + fluxbox for headed browser
- Telegram bot token, Discord token, etc. (stored outside wiki)
## Known Issues
- Router migration incomplete
- Browser persistence not yet fully verified
- Obsidian Git plugin auto-sync caused conflicts during vault reorganization
## Related
- [[model-providers]]
- [[memory-backend]]
- [[browser-backend]]
- [[terminal-backend]]
- [[skills-index]]
- [[messaging-integrations]]
- [[scheduled-tasks]]
- [[current-state]]
+51
View File
@@ -0,0 +1,51 @@
---
title: hermes-ui (Browser Hermes Desktop)
type: system
status: live
created: 2026-07-30
updated: 2026-07-30
verified_on: 2026-07-30
confidence: high
tags: [hermes, webui, desktop, browser]
---
# hermes-ui
The official Hermes Desktop renderer, extracted from the `hermes-agent` monorepo (`apps/desktop`) and repackaged as a plain Vite web app — runs in a browser instead of Electron.
- **Repo:** https://github.com/przbadu/hermes-ui
- **Upstream:** NousResearch/hermes-agent monorepo, commit `56a8e81d33a524f0ba0d68b6d54c8786ed283fb8` (2026-07-08)
- **Extraction date:** 2026-07-11
- **License:** MIT (Copyright (c) 2025 Nous Research)
## Deployments
| Host | Location | Port | Status | Started |
|------|----------|------|--------|---------|
| CT460 (this box) | `/home/hermes/hermes-ui/` | 5174 | Vite dev server | Active |
| CT450 (hermesagent) | `/home/hermes/hermes-ui/` | 5174 | Vite dev server | Active (since 2026-07-30) |
## How It Works
- Runs as a Vite dev server, proxying REST/auth/WebSocket to a running Hermes gateway (`http://127.0.0.1:9119` by default).
- Same-origin proxy via Vite so cookies and the WebSocket work without CORS issues.
- Electron-only methods are stubbed behind a capability flag in `src/web-bridge/`.
## Quick Start
```bash
# Install deps (uses bun)
cd ~/hermes-ui/app && bun install
# Start dev server
cd ~/hermes-ui && bin/dev
# Or skip bin/dev and run vite directly:
bunx vite --port 5174 --host 0.0.0.0
```
## Files
- `PLAN.md` — extraction plan
- `UPSTREAM.md` — upstream commit diff guide
- `scripts/serve-on-gateway.sh` — serve built UI same-origin via `hermes serve`
+36
View File
@@ -0,0 +1,36 @@
---
title: Home Assistant
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: low
tags: [system, automation]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Home Assistant
## Purpose
Home automation and device control; one of Hermes's messaging/integration platforms.
## Location
- **Verified (homelab infra docs, not this host):** VM 100 on `pve`, hostname `haos14.0` (Home Assistant OS), internal IP `172.30.232.1`.
- **Verified (Hermes config):** `homeassistant` and `hermes-homeassistant` appear in Hermes's platform/display integration lists (`~/.hermes/config.yaml`), alongside `qqbot`, `signal`, `slack`, `teams`, `telegram`.
- **Unknown:** the actual connection details (HA base URL, long-lived access token, which entities/automations Hermes can reach) are not present in the sanitized config snapshot — likely held in a plugin-specific credentials file not captured there, or not yet wired up beyond being enabled as a platform.
## Current configuration
Not verified beyond the platform being listed as available/connected in `current-state.md`'s "WebUI connected platforms" line. No automations, entity lists, or voice-assistant config confirmed from this host.
## Connected systems
- [[systems/hermes-agent]]
- [[infrastructure/proxmox]] — Runs as VM 100 on PVE
- [[systems/messaging-integrations]] — Integration platform
- [[systems/homepage-dashboard]] — Shown in dashboard More tab
## Known issues
- Genuine gap, not a "known issue" per se: this page cannot confirm HA is *actively* used by Hermes vs. merely enabled — worth verifying directly (e.g. a live call to a known HA entity) next time someone is in this area.
## Relevant runbooks
None yet — would be a good candidate once the connection is verified (e.g. `runbooks/restart-home-assistant-bridge`).
+102
View File
@@ -0,0 +1,102 @@
---
title: Homepage Dashboard
type: systems
status: active
created: 2026-07-26
updated: 2026-07-26
confidence: high
tags: [dashboard, homepage, homelab, proxmox, monitoring]
---
# Homepage Dashboard
## Purpose
Central dashboard for all homelab services, with Proxmox integration, per-VM stats, and a management UI.
## URLs
- **Tailscale:** `https://runtipi.kangaroo-eel.ts.net:8443/`
- **Local:** `http://runtipi.kangaroo-eel.ts.net:8082/`
- **Manager UI:** `http://runtipi.kangaroo-eel.ts.net:8084/`
## Architecture
```
CT201 (runtipi)
├── Homepage container (port 8082) — main dashboard
├── Manager container (port 8084) — web UI for adding/removing apps
└── Tailscale serve (port 8443) — HTTPS proxy to Homepage
```
## Tabs
| Tab | Content |
|---|---|
| Overview | Infrastructure (2 cols) + Everyday (4 cols) + Resources |
| Media | Jellyfin, arr stack, RSS |
| AI | OmniRoute, LiteLLM, Lobe Chat, SearXNG |
| Agents | Hermes, OpenClaw, Nanobot, Camofox |
| Tools | IT tools, Cyber Chef, etc. + Storage |
| More | Home Assistant, N8n, Jupyter |
| All Apps | 114 apps in 5-column grid (alphabetical) |
## Proxmox Integration
- **Node widget:** Shows live VM/LXC counts, CPU, memory for PVE node
- **Per-VM stats:** Click "View Proxmox stats" on mapped services
- **API token:** `homepage@pve!homepage` (privsep=0)
- **proxmox.yaml:** Config at `/opt/homepage/config/proxmox.yaml`
### VM/LXC Mapping
| Service | VMID | Type |
|---|---|---|
| PVE | (node) | — |
| Portainer docker | 200 | lxc |
| Portainer debianVM | 101 | qemu |
| Portainer openweb | 245 | lxc |
> Portainer on CT245 (`openweb.kangaroo-eel.ts.net:9443`) now uses a Tailscale/Let's Encrypt cert (installed 2026-08-09). Files: `/root/portainer-certs/portainer.{crt,key}` mounted into the container, `--sslcert/--sslkey`. Renewal: `/root/renew-portainer-cert.sh` via crontab (04:00 on the 1st monthly) — `tailscale cert --min-validity=20d` then `docker restart portainer`. Cert validity ~90 days.
| Runtipi | 201 | lxc |
| Gitea | 221 | lxc |
| FreshRSS | 260 | lxc |
| NextCloud | 270 | lxc |
| LiteLLM | 500 | lxc |
| OmniRoute | 600 | lxc |
| Ntfy | 241 | lxc |
| Home Assistant | 100 | qemu |
| N8n | 215 | lxc |
| Mattermost | 255 | lxc |
| SFTPGo | 299 | lxc |
| Cliproxy API | 103 | lxc |
| OpenClaw | 403 | qemu |
| Zeroclaw | 333 | lxc |
| Hermes | 460 | lxc |
| Hindsight | 450 | lxc |
## Configuration Files
All at `/opt/homepage/config/` on CT201:
- `services.yaml` — All apps, groups, and Proxmox mappings
- `settings.yaml` — Theme, layout, tabs
- `custom.css` — Warm amber accent overrides
- `widgets.yaml` — System health, clock
- `proxmox.yaml` — PVE API token
- `docker.yaml` — Docker socket integration
## Manager UI
Web form at port 8084 for adding/removing apps without SSH.
- **Add:** Name, Category (dropdown), URL, optional Icon
- **Delete:** Search apps, click Delete
- **Auto-restart:** Homepage restarts after each change
## Quick Launch Search
Type anywhere on the dashboard to search services by name/description. Google search disabled — only searches your apps.
## Theme
- Dark base with warm amber (#d4a04a) accents
- Bigger tiles (68px min-height, 40px icons)
- Custom CSS in `custom.css`
## Tailscale Serve
Port 443 occupied by Traefik on CT201 — Tailscale uses port 8443 instead.
## Maintenance
- **Restart Homepage:** `docker restart homepage`
- **Restart Manager:** `docker restart homepage-manager`
- **Edit apps manually:** Edit `/opt/homepage/config/services.yaml` then restart
- **Docker auto-discovery:** Add `homepage.group`, `homepage.name`, `homepage.href` labels to containers
+52
View File
@@ -0,0 +1,52 @@
---
title: Memory Backend
type: system
status: active
created: 2026-07-22
updated: 2026-08-01
verified_on: 2026-08-01
confidence: high
tags: [memory, mnemosyne, agent]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Memory Backend
## Purpose
Persist and recall agent memory across sessions.
## Current Configuration
- **Primary backend:** Mnemosyne (local native)
- **Memory enabled:** true
- **User profile enabled:** true
- **Memory char limit:** 5000
- **User char limit:** 3000
- **Flush every:** 6 turns
- **Auto sleep:** true
- **Default scope:** session
- **Vector type:** int8
- **Profile isolation:** true (configured; requires gateway restart for the current messaging runtime)
- **Shared surface:** `data/shared/mnemosyne.db`
- **Shared surface read:** true
- **Sync roles:** user
- **Skip contexts:** cron, flush, subagent, background, skill_loop
- **Reflect max calls per session:** 3
## Storage Location
- Mnemosyne home: `~/.hermes/mnemosyne/`
- DB: `~/.hermes/mnemosyne/data/`
- Backups: `~/.hermes/mnemosyne/backups/`
- Logs: `~/.hermes/mnemosyne/logs/`
- Models: `~/.hermes/mnemosyne/models/`
- Config: `~/.hermes/mnemosyne/config.yaml`
## Known Issues
- Health monitoring currently treats capture as stale only after 24 hours; an activity-aware comparison is preferable to catch dry-intake failures sooner without false alarms during idle periods.
- The 2026-08-01 automatic-capture failure and repair are documented in [[incidents/2026-08-01-mnemosyne-capture-failure]].
**Correction (2026-07-22, per Anthony):** this page previously referenced Hindsight as a possibly-used backend on this box. That was a mix-up with a different Hermes instance — see [[comparisons/memory-backends]].
## Related
- [[memory-backend]]
- [[systems/mnemosyne]]
- [[experiments/index]]
+52
View File
@@ -0,0 +1,52 @@
---
title: Messaging Integrations
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: high
tags: [messaging, telegram, discord, email, integrations]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Messaging Integrations
## Telegram
- **Status:** enabled, active
- **allowed_chats:** `-1004321904721` (primary)
- **Rich messages:** true
- **Platform toolsets:** cli, telegram (full suite)
- **Delivery targets seen in cron:** telegram, `telegram:1793951355`, `telegram:-1004321904721:1030`, `telegram:-1004321907D2:346`, `telegram:-1004321904721:273`
- **Notes:** Primary delivery target for scheduled jobs
## Discord
- **Status:** enabled, streaming true
- **Platform:** `hermes-discord`
- **Platform toolsets:** cli, discord
## Email
- **Status:** connected
- **Libraries:** himalaya CLI available
- **Platform toolsets:** cli
## Slack
- **Status:** available (toolsets: cli, slack-platform)
- **Config noted:** slack entries in config but Slack enabled status unclear from config grep
## Other Platforms Available
- **Mattermost:** toolsets present (`hermes-mattermost`)
- **Google Chat:** toolsets present (`hermes-google_chat`)
- **QQ:** toolsets present (`hermes-qqbot`)
- **Signal:** toolsets present (`hermes-signal`)
- **WhatsApp:** toolsets present (`hermes-whatsapp`)
- **ntfy:** noted in memory config outputs but runtime status unverified
- **Yuanbao:** toolsets present (`hermes-yuanbao`)
- **Home Assistant:** homeassistant-platform enabled
## Known Issues
- Telegram thread_id `34795` for `telegram:1793951355` not found — one cron job delivered without thread_id
## Related
- [[messaging-integrations]]
- [[scheduled-tasks]]
+84
View File
@@ -0,0 +1,84 @@
---
title: Mnemosyne
type: system
status: active
created: 2026-07-22
updated: 2026-08-02
verified_on: 2026-08-02
confidence: high
tags: [memory, mnemosyne, backend]
sources: [live-probe, mnemosyne-db, config, ops-profile-config]
---
# Mnemosyne
## Purpose
Primary agent memory store for Hermes.
## Current Configuration
- **Provider:** `mnemosyne`
- **Enabled:** true
- **Auto sleep:** true
- **Default scope:** `session`
- **Memory char limit:** 5000
- **User char limit:** 3000
- **Vector type:** int8
- **Profile isolation:** true
- **Shared surface read:** true
- **Shared surface path:** `data/shared/mnemosyne.db`
- **Skip contexts:** cron, flush, subagent, background, skill_loop
- **Reflect max calls per session:** 3
- **Sync roles:** user
- **Flush every:** 6 turns
- **Embedding model:** `BAAI/bge-small-en-v1.5` (384 dims)
- **Embeddings via API:** false (local fastembed)
## Database Stats (2026-08-02)
| Table | Rows | Notes |
|---|---|---|
| `working_memory` | 1,476 | Active memories |
| `episodic_memory` | 458 | Consolidated summaries |
| `memory_embeddings` | 158 | Only working memories — **0 episodic** |
| `memory` (legacy) | 2,181 | Old table, not migrated |
| `vec_working` | 159 | Vector index rows |
| Shared surface | 0 | Empty — cross-agent sharing not functional |
## Known Issues
### Vector embedding coverage gap
- **Only 159/1,476 working memories (10.8%)** have vector embeddings
- **0/458 episodic memories** have embeddings
- Semantic search (`mnemosyne_recall`) falls back to FTS5 keyword matching for ~90% of working and 100% of episodic memories
- This means recall quality is degraded — vector similarity can only search a tiny fraction of the memory store
- **Root cause:** The embedding pipeline (fastembed) never processed the bulk of memories. The `vec_working` table was rebuilt once (Jul 18) but only captured 159 rows.
- **Fix needed:** Backfill embeddings for all working and episodic memories. This requires running the embedding pipeline across the full dataset.
### Profile isolation chosen over shared surface
|- The ops profile was enabled with mnemosyne on 2026-08-02
|- **Decision:** `profile_isolation: true` was set on ops, giving each profile its own independent memory bank — zero cross-contamination
|- `data/shared/mnemosyne.db` exists with 0 rows; cross-profile sharing is intentionally unused
|- This means Tusk (ops) and Rhino (default) do not share memories, which is the desired behaviour
|- Config in `~/.hermes/profiles/ops/config.yaml`: `memory.mnemosyne.profile_isolation: true`, `allow_tool_override: false`, `shared_surface_read: false`
|- Verified end-to-end on 2026-08-02: memory writes land correctly in both profiles independently
### Legacy table not migrated
- 2,181 rows in the old `memory` table are not in the new `working_memory`/`episodic_memory` system
- These are only accessible via the legacy `memory` tool, not via `mnemosyne_recall`
## Known Management Jobs
- Mnemosyne Auto-Consolidate every 30m — script: `consolidate_mnemosyne.sh`, mode: no-agent
- Mnemosyne DB Backup weekly Sunday 03:00 — script: `mnemosyne-backup.sh`, mode: no-agent
- Mnemosyne Health Monitor every 12h — skill: `mnemosyne-operations`, reports only on exception
- Mnemosyne Watchdog every 15m — script: `mnemosyne-watchdog.py`, mode: no-agent
## History and Evidence
- **2026-08-01 incident:** Automatic conversational capture was broken by stringified structured YAML, especially `sync_roles: "['user']"`. Fixed by rewriting with native YAML types. See [[incidents/2026-08-01-mnemosyne-capture-failure]].
- **2026-08-01 cleanup:** Legacy always-injected memory reduced from 8,013 bytes to 4,998 bytes (memory) and 2,958 bytes (user).
- **2026-07-29 incident:** `memory.mnemosyne.tools: None` caused schema loading warnings. Fixed by removing the line. See [[incidents/2026-07-29-mnemosyne-relay]].
- **2026-07-29 relay scope corruption:** `RuntimeError: scope handle is not at the top of the stack` — 3 occurrences, self-resolved.
## Related
- [[concepts/agent-memory]]
- [[comparisons/memory-backends]]
- [[incidents/2026-08-01-mnemosyne-capture-failure]]
- [[incidents/2026-07-29-mnemosyne-relay]]
+77
View File
@@ -0,0 +1,77 @@
---
title: Model Providers
type: system
status: active
created: 2026-07-22
updated: 2026-08-14
verified_on: 2026-08-14
confidence: high
tags: [model, provider, inference, routing]
sources: [live-probe, config, web-search]
---
# Model Providers
## Purpose
Inference providers available to Hermes, their routing paths, and notable model updates.
## Current Provider Stack
| Provider | URL | Role |
|---|---|---|
| `custom:litellm` | `http://litellm:4000/v1` | Main inference (slower path, 626s/call) |
| `custom:omni` | `http://omni:20128/v1` | Auxiliary roles (vision, skills, approval, mcp, web_extract, compression) — factory-reset 2026-08-14 |
| `opencode-zen` | (internal) | Free-tier model access for cron jobs |
| Guanaco | `ollama:11434` | LLM proxy/router on CT205 (Ollama stack) |
## Default Model
- `resilient-free` — resolves through OmniRoute (changed from `auto/best-free` on 2026-08-14 after factory reset)
- Previous default `auto/best-free` was misconfigured — had no combo definition and routed to paid `gpt-5.6-sol`
- `freellmapi-auto` (LiteLLM path) still available but slower
## Notable Model Updates
### GPT-5.6 Luna — Model Research (2026-08-14)
- **Community consensus:** Luna is cleaner/more polished; DeepSeek V4 Flash is more persistent/cheaper
- **Luna strengths:** visual/UI work, final code review, bounded high-stakes tasks, cleaner structured output
- **DeepSeek strengths:** automation, persistent executor work, high-volume subtasks, long-context economics
- **Key caveat:** Provider route matters more than model name — `openai-codex/gpt-5.6-luna`, `openrouter/openai/gpt-5.6-luna`, `deepseek/deepseek-v4-flash`, and `openrouter/deepseek/deepseek-v4-flash` are four different tests
- **Pricing:** Direct OpenAI $0.20/M input, $1.20/M output; OpenRouter $0.10/M input, $0.60/M output
- **Context:** 1.05M tokens, 128K output, function calling, structured outputs, image input, configurable reasoning effort
- **Recommendation:** Luna plans and reviews; DeepSeek executes — but test on a clean direct route before judging
### Guanaco v0.8.14 (2026-08-14)
- Updated from v0.8.11 on CT205 — three incremental bug-fix releases focused on DSML/tool-call output hygiene
- DSML tag leakage fixes: malformed tool-call output no longer leaks raw syntax junk into model context
- Dashboard performance fix: cached content size, fixed wrong column names in history query
- No new features, no breaking changes — low-risk update
- See [[systems/guanaco]]
### DeepSeek V4 Flash 0731 (2026-07-31)
- **Same model ID:** `deepseek-v4-flash` — no ID change, just a post-training bump
- **Same architecture:** 284B total params, 13B active per token, 1M context window
- **Same pricing:** $0.14/M input, $0.28/M output
- **Benchmark jump:** Terminal Bench 2.1: 82.7 (up from 61.8 preview — 34% relative gain)
- **Now surpasses V4-Pro preview** (72.1) on agent/coding benchmarks
- **Stricter tool name validation:** Rejects tool names not matching `^[a-zA-Z0-9_-]+$` — may cause issues with OmniRoute-transformed tool names
- **Impact:** Your existing cron jobs using `deepseek-v4-flash` get the upgrade automatically. The empty-stream fallback issue (`opencode-go/deepseek-v4-flash` returning empty 200s) is a provider plumbing problem, not a model quality problem.
### OmniRoute Free-DeepSeek Silent-Stop Mitigation (2026-08-04)
- Free-DeepSeek upstreams returning empty-after-tool responses since Aug 1 → silent turn stops on `deepseek-flash-free` and `smart-route`/`good-free` across both instances
- Reworked both combos: strategy `priority``fill-first`, dropped proven culprits (`238d5978/deepseek-v4-flash` + `-0731`, `nvidia` deepseek), healthy free models promoted, deepseek demoted to last resort
- See [[incidents/2026-08-04-omniroute-free-deepseek-silent-stops]]
## Context Enforcement
- Three layers: model native → combo `data.config.context_length` → Hermes client cap
- Effective context is the minimum of the three
## Combo Behavior
- `priority` retries same provider up to `maxRetries`, then errors; it does NOT fall through
- `fill-first` walks the list on failure
- `auto`/`lkgp` recalculates per request using health scoring
- Same-provider entries in a combo share rate-limit buckets
- Session affinity caches provider in `session_model_history`
## Related
- [[concepts/model-routing]]
- [[systems/omniroute]]
- [[systems/opencode-go]]
+52
View File
@@ -0,0 +1,52 @@
---
title: Nanobot
type: system
status: degraded
created: 2026-07-22
updated: 2026-08-07
verified_on: 2026-08-07
confidence: high
tags: [system, nanobot, network]
sources: [live-probe, omniroute-investigation]
---
# Nanobot
## Purpose
Role in Anthony's setup.
## Location
- **Verified 2026-07-22:** LXC 333, hostname `clawtest`, Tailscale IP `100.122.189.81`.
## Current state
- **Status: DOWN (as of 2026-08-07).** Connection refused on port 8900 — the OmniRoute provider connection to nanobot (`58debd59`, prefix `nanobot`) was causing event-loop stalls because every model sync + credential health check retried it. Connection disabled in OmniRoute. Nanobot on CT333 is not responding.
- **Prior state:** `nanobot` process listening on port `8766` (verified via `ss -tlnp` on ct333, 2026-07-22).
- `whatsapp-bridge.service` (systemd, active) — "WhatsApp Bridge for Nanobot" — also runs on ct333. Status unknown as of 2026-08-07.
- Publicly reachable via the same Cloudflare Tunnel as Hermes: `nanobot.martinwa.org``100.122.189.81:8766`, `nano-ssh.martinwa.org` → SSH on the same host. See [[infrastructure/domains-and-tunnels]].
## Current state as of 2026-07-22 (superseded — see below)
~~- No nanobot process running on this host~~
~~- `nanobot` systemd user service: inactive~~
~~- Not present in `pgrep` process list~~
**Correction (this audit, same day):** the above was true only for *this* host (ct460) — Nanobot was never expected to run here. It **is** actively running, on LXC 333 ("clawtest"), confirmed via direct process/port check. Left the original lines struck through rather than deleted, per SCHEMA rule 9 (mark, don't silently delete).
## History
- **User-provided:** Nanobox on the PVE host at `192.168.178.39`
- **Correction:** `192.168.178.39` is `pve`'s own LAN IP (matches the Cloudflare Tunnel's `pve.martinwa.org` entry, which proxies to Proxmox's web UI on that address) — this was a conflation, not a second Nanobot instance. The real Nanobot host is ct333 (see Location above).
- **Verified:** Lan/Wi-Fi node at `192.168.178.46` running ARM/arm64 firmware; `ubnt` login at `192.168.1.1` does not apply to this node
- **Verified:** DWARF01 identified as a UniFi device; ONT01 status unresolved; DNS provided by `192.168.178.39`, not the router
- **User-provided:** Avoid `heroku.com/archive` except for CAPI; use official CAPI course downloads instead
- **Superseded:** "Nanobot may have been used previously as Hermes gateway or tunnel front on another host" / "Unknown: whether nanobot should be redeployed" — no longer applicable now that it's confirmed running; the open question is now *why* it's running alongside Hermes and whether that's intentional (see [[comparisons/hermes-vs-nanobot]]).
## Connected systems
- [[systems/hermes-agent]]
- [[systems/headless-server]]
## Known issues
- Overlap/purpose vs. Hermes not documented anywhere — see [[comparisons/hermes-vs-nanobot]] for the open question this raises.
## Change history
- 2026-07-22: audit corrected "not running" claim after direct verification on ct333.
- 2026-08-07: status changed to DEGRADED — nanobot confirmed DOWN (connection refused on 8900). OmniRoute provider connection disabled. CT333 service status unknown.
## Relevant runbooks
- [[runbooks/restart-hermes]]
## Related
- [[comparisons/hermes-vs-nanobot]]
+42
View File
@@ -0,0 +1,42 @@
---
title: Obsidian Vault
type: systems
status: active
created: 2026-07-26
updated: 2026-07-26
confidence: high
tags: [obsidian, notes, vault, homelab]
---
# Obsidian Vault
## Purpose
Personal knowledge base — notes, research, projects, and agent documentation.
## Details
- **Location:** `/home/hermes/wiki/` (on CT460)
- **Git repo:** Gitea (`Anthony/obsidian-vault`)
- **Structure:** NUMBERED folders (00-99)
- **Sync:** Git-based (manual or cron-triggered)
## Folder Structure
| Folder | Purpose |
|---|---|
| `00 - Home` | Dashboard and entry points |
| `10 - Inbox` | New/unprocessed notes |
| `20 - Agent Notes` | Notes from AI agents |
| `30 - Projects` | Active project documentation |
| `50 - Research` | Research and investigations |
| `60 - Resources` | Reference materials |
| `70 - Reference` | Quick lookup |
| `90 - Archive` | Completed/old material |
| `99 - Templates` | Note templates |
## Conventions
- Numbered folders preferred (Anthony corrected twice)
- Check Mnemosyne before vault work
- Don't impose structure changes without understanding usage
## Related
- [[infrastructure/hosts]] — CT460 host details
- [[systems/memory-backend]] — Agent memory integration
+92
View File
@@ -0,0 +1,92 @@
---
title: OmniRoute
type: system
status: active
created: 2026-07-22
updated: 2026-08-14
verified_on: 2026-08-14
confidence: high
tags: [routing, provider, model, inference]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# OmniRoute
## Purpose
Secondary provider/router for Hermes auxiliary roles and some agent routing.
## Current Configuration
- **Hermes provider name:** `custom:omni`
- **Base URL:** `http://omni:20128/v1`
- **Host reachability:** `omni.kangaroo-eel.ts.net` resolves to `100.93.204.4`; CT601 running, direct HTTP reachable
- **Runs on:** Proxmox CT601 (`omni`) — migrated from CT600 (`omniroute`, now stopped) on 2026-08-13
- **DB path:** `/opt/omniroute/storage.sqlite` (was `/var/lib/omniroute/storage.sqlite`)
- **Backup:** pre-migration config saved at `~/.hermes/config.yaml.bak.omniroute-removal`
- **Miss:** Hermes default provider path does not use OmniRoute for main chat; used for auxiliary roles instead
- **Auxiliary roles in Hermes config:** `skills_hub`, `approval`, `mcp`
- **Key prefix visible in config:** `sk-5c67fbdc0...` — full value not stored in wiki
## Catalog and Routing Facts
- Catalog reachable: yes, 47 combos returned at `/api/combos`
- Combo schema observed: `name`, `strategy`, `models`, `id`; some combos have `config`, `isHidden`, `uuid`
- Combo-level context can override individual models
- `auto`/`lkgp` strategies may silently change chosen models
- Model mappings can substitute models silently
- Session affinity caches last successful provider in `session_model_history`
## Catalog Evidence (2026-07-22)
- Advertised context for `gemini/gemini-3.6-flash`: `1048576`
- Related models in catalog: `kc/google/gemini-3.6-flash`, `kilocode/google/gemini-3.6-flash`, `nous/google/gemini-3.6-flash`, `opencode-zen/gemini-3.6-flash`, `vertex/gemini-3.6-flash`
- No live combo in the returned 47 combos referenced `gemini-3.6-flash`
## Known Issues
- opencode-zen proxy pitfall documented in omniroute-ops skill
- Web search proxy failures documented in omniroute-ops skill
- Combo discovery can differ from resolution;
## AutoRoute variants (2026-08-12)
- `auto/best-free` (Auto Cheap) and `auto/coding-free` are **virtual** AutoRoute variants — they do NOT appear in the persisted combo list (`/api/combos` returns 54 combos, none named these).
- The LKGP engine resolves them dynamically: it scores the operator's **live connected provider accounts** (e.g. `antigravity`, `opencode-zen`, `nvidia`, `openrouter`) rather than a hardcoded candidate list.
- Scoring signals: health, quota/token-reset windows, latency, consecutive errors, and cost-inverse across all connected accounts; failover to next-best on throttle/error without dropping the request.
- Example observed: an `auto/best-free` request routed to Antigravity (Google AI Plus) because that account was active, healthy, zero-cost, and highest priority — proving live dynamic scoring, not a static map.
## Recent Changes (2026-08-14)
- **OmniRoute factory reset on CT601.** Database wiped clean: 0 combos, 0 providers, 0 API keys, 115 built-in auto model entries (`auto/best-fast`, `auto/best-coding`, etc.). Old state backed up at `/opt/omniroute/factory-reset-backup-20260814-225524`.
- **Providers re-added from Notion API vault:** Anthropic, Google Gemini, Groq, Mistral, OpenRouter — all five passed live provider tests. OpenAI keys in the vault were tested but none worked; removed the invalid OpenAI entry.
- **Hermes config default model changed:** `auto/best-free``resilient-free` (via `~/.hermes/config.yaml`). `auto/best-free` was misconfigured — had no combo definition and routed to `gpt-5.6-sol` (paid) instead of free models. Switched to `resilient-free` which is a working free combo.
- **Multiple free combos broken by upstream model ID changes:**
- OpenRouter: `poolside/laguna-s-2-1:free` (dash) → `poolside/laguna-s-2.1:free` (dot) — model ID format changed
- Groq: `meta-llama/llama-4-scout-17b-16e-instruct`**retired**, only llama-3.3/3.1 remain
- Affected combos: `resilient-free`, `free-IA`, `free-stack`, `good-free`, `deepseek-flash-free`, `mimo-free`
- All route through OpenRouter → fail with 400/404 when trying these model IDs
- **Working free combos as of 2026-08-14:** `free-lkgp` (DeepSeek V4 Flash), `mega-free` (StepFun 3.7 Flash), `smart-route` / `smart-route-ia` (nested combos)
- **LiteLLM routing issue identified:** Hermes was previously pointing at `http://litellm:4000/v1` with `free-auto` model, causing 626s per call. OmniRoute's `auto/best-free` tested at 265ms. Config now points at OmniRoute.
- **GPT-5.6 Luna research:** Community consensus — Luna is cleaner/more polished; DeepSeek V4 Flash is more persistent/cheaper. Luna better for visual/UI work and final review; DeepSeek better for automation and high-volume executor work. Provider route matters more than model name.
## Recent Changes (2026-08-13)
- **OmniRoute migrated CT600 → CT601.** Provider renamed `custom:omniroute``custom:omni`; base URL `http://omniroute:20128/v1``http://omni:20128/v1`. Host `omni.kangaroo-eel.ts.net` (100.93.204.4, active) replaces `omniroute.kangaroo-eel.ts.net` (100.88.81.19, offline). CT600 stopped, CT601 running. Database path `/var/lib/omniroute/storage.sqlite``/opt/omniroute/storage.sqlite`. API key unchanged. All 14 config + 22 cron-job `custom:omniroute` references updated to `custom:omni`. Pre-migration backup at `~/.hermes/config.yaml.bak.omniroute-removal`. Verified live 2026-08-13 (`pct list`: 600 stopped, 601 running; `grep`: 0 remaining `custom:omniroute` refs).
## Recent Changes (2026-07-25)
- **free-stack combo updated:** Nemotron 3 Ultra 550B model at index 4 now configured with NVIDIA-specific parameters:
- `max_tokens`: 8192 (was default 65536, exceeding NVIDIA NIM limit of 16384)
- `reasoning_effort`: medium (was high, reducing long internal monologues)
- `chat_template_kwargs.force_nonempty_content`: true (prevents empty responses when tool calling + reasoning)
- **Combo ID:** `23d25f8f-5eb0-4b6f-b966-e260ca3905b3`
- **Hermes config.yaml updated:** `agent.reasoning_effort: medium`, `agent.max_tokens: 8192`, `agent.chat_template_kwargs.force_nonempty_content: true`
- **Rationale:** NVIDIA NIM API documents max output of 16384 tokens; medium reasoning uses more efficient chat-template mode; force_nonempty_content resolves empty responses with tool calls combo in picker may still route
## Recent Changes (2026-08-07)
- **Three-layer root cause for slowness identified and fixed:**
1. **npm package .env override:** OmniRoute loads three .env files (`/var/lib/omniroute/.env`, `/root/.omniroute/.env`, `/usr/lib/node_modules/omniroute/.env`). The npm package's `.env` ships with `ENABLE_SOCKS5_PROXY=true` and `npm update` re-installs it with that default, silently overriding the `/var/lib` config. Fix: flip all three to `false`, then restart. After ANY upgrade, check all three.
2. **Dead provider connection:** Connection `58debd59` (prefix `nanobot`) points at `clawtest:8900/v1` — nanobot on clawtest is DOWN. Every model sync + credential health check retried it, burning event-loop time. Disabled it.
3. **PVE host load leaking into CT600:** CT600 has `nesting=1`, so `uptime`/`top` inside the container mirror PVE's host load exactly (verified: identical 10.30/9.23/10.37 on both). Same trap as CT241. Judge CT600 CPU from `pct exec 600 -- ps -o %cpu` or host-side `ps`, never from in-container load average.
- **First-request-after-cache-expiry stall:** `/v1/models` hangs 10-15s+ on the FIRST hit after the model catalog cache expires (rebuild enumerates all connections, including slow dead ones), then answers in ~0.02s from cache. Don't judge health on one curl — run a burst of 5 and check if later tries are sub-second.
- **`is_active=0` does NOT stop CredentialHealth probes:** Disabling a dead connection stops it from ModelSync but the health checker still probes it and logs `[ProxyFetch] ECONNREFUSED` noise. That noise is benign once the endpoint is unreachable.
- **Lessons banked in `omniroute-ops` skill:** `references/omniroute-upgrade-procedure.md` updated with all three pitfalls.
## Recent Changes (2026-08-04)
- **OmniRoute free-DeepSeek silent-stop mitigation:** Free-DeepSeek upstreams returning empty-after-tool responses since Aug 1 → silent turn stops on `deepseek-flash-free` and `smart-route`/`good-free` across both instances. Reworked both combos: strategy `priority``fill-first`, dropped proven culprits (`238d5978/deepseek-v4-flash` + `-0731`, `nvidia` deepseek), healthy free models promoted, deepseek demoted to last resort. See [[incidents/2026-08-04-omniroute-free-deepseek-silent-stops]].
## Related
- [[model-providers]]
- [[model-routing]]
+147
View File
@@ -0,0 +1,147 @@
---
title: OpenCode Go
type: system
status: active
created: 2026-07-29
updated: 2026-07-29
verified_on: 2026-07-29
confidence: high
tags: [opencode, provider, models, subscription, limits]
sources: [https://opencode.ai/docs/go/]
---
# OpenCode Go
Low cost subscription for open coding models — $5 first month, then **$10/month**. Designed for international users, models hosted in US, EU, and Singapore.
## How It Works
1. Sign in to [OpenCode Zen](https://opencode.ai/zen), subscribe to Go, copy your API key
2. Run `/connect` in the TUI, select `OpenCode Go`, paste your API key
3. Run `/models` to see available models
> Only one member per workspace can subscribe.
## Usage Limits
| Window | Dollar Limit |
|--------|-------------|
| 5 hours | $12 |
| Weekly | $30 |
| Monthly | $60 |
Limits are in **dollar value**, so your actual request count depends on the model. Cheaper models (DeepSeek V4 Flash, MiMo-V2.5) get far more requests than expensive ones (Kimi K3, Grok 4.5).
### Estimated Requests Per Window
Based on typical Go usage patterns:
| Model | Per 5h | Per Week | Per Month |
|-------|--------|----------|-----------|
| Grok 4.5 | 120 | 300 | 600 |
| GLM-5.2 | 880 | 2,150 | 4,300 |
| GLM-5.1 | 880 | 2,150 | 4,300 |
| Kimi K3 | 110 | 250 | 490 |
| Kimi K2.7 Code | 1,350 | 3,380 | 6,750 |
| Kimi K2.6 | 1,150 | 2,880 | 5,750 |
| MiMo-V2.5 | 30,100 | 75,200 | 150,400 |
| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 |
| MiniMax M3 | 3,200 | 8,000 | 16,000 |
| MiniMax M2.7 | 3,400 | 8,500 | 17,000 |
| Qwen3.7 Max | 950 | 2,390 | 4,770 |
| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 |
| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 |
| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 |
| DeepSeek V4 Flash | 31,650 | 79,050 | 158,150 |
| Hy3 | 4,300 | 10,750 | 21,500 |
### Token Estimates Per Request
| Model | Input Tokens | Cached Tokens | Output Tokens |
|-------|-------------|---------------|---------------|
| Grok 4.5 | 1,100 | 71,500 | 220 |
| GLM-5.2/5.1 | 700 | 52,000 | 150 |
| Kimi K3 | 1,050 | 76,500 | 300 |
| Kimi K2.7/K2.6 | 870 | 55,000 | 200 |
| DeepSeek V4 Pro | 750 | 82,000 | 290 |
| DeepSeek V4 Flash | 790 | 68,000 | 280 |
| MiniMax M3 | 510 | 56,000 | 190 |
| MiniMax M2.7 | 300 | 55,000 | 125 |
| MiMo-V2.5 | 830 | 71,500 | 295 |
| MiMo-V2.5-Pro | 790 | 86,000 | 305 |
| Qwen3.7 Max | 420 | 66,000 | 200 |
| Qwen3.7 Plus | 500 | 57,000 | 190 |
| Qwen3.6 Plus | 500 | 57,000 | 190 |
| Hy3 | 830 | 71,500 | 295 |
### Per-Model Pricing & Monthly Usage Included
| Model | Input $/1M | Output $/1M | Cached Read $/1M | Monthly Usage |
|-------|-----------|------------|-----------------|---------------|
| Grok 4.5 | $2.00 | $6.00 | $0.30 | $15 |
| GLM-5.2 | $1.40 | $4.40 | $0.26 | $60 |
| GLM-5.1 | $1.40 | $4.40 | $0.26 | $60 |
| Kimi K3 | $3.00 | $15.00 | $0.30 | $15 |
| Kimi K2.7 Code | $0.95 | $4.00 | $0.19 | $60 |
| Kimi K2.6 | $0.95 | $4.00 | $0.16 | $60 |
| MiMo V2.5 | $0.14 | $0.28 | $0.0028 | $60 |
| MiMo V2.5 Pro | $0.435 | $0.87 | $0.0036 | $15 |
| MiniMax M3 | $0.30 | $1.20 | $0.06 | $60 |
| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $60 |
| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $60 |
| Qwen3.7 Plus (≤256K) | $0.40 | $1.60 | $0.04 | $60 |
| Qwen3.7 Plus (>256K) | $1.20 | $4.80 | $0.12 | $60 |
| Qwen3.6 Plus (≤256K) | $0.50 | $3.00 | $0.05 | $60 |
| Qwen3.6 Plus (>256K) | $2.00 | $6.00 | $0.20 | $60 |
| DeepSeek V4 Pro | $0.435 | $0.87 | $0.0036 | $15 |
| DeepSeek V4 Flash | $0.14 | $0.28 | $0.0028 | $60 |
| Hy3 | $0.14 | $0.58 | $0.035 | $60 |
Track usage in the [console](https://opencode.ai/zen).
> If you reach the usage limit, you can continue using the free models.
## Usage Beyond Limits
If you also have credits on your Zen balance, enable the **Use balance** option in the console. Go will fall back to your Zen balance after reaching usage limits instead of blocking requests.
## Why Some Models Have Lower Usage
With Go, you pay $10/month and they aim to give you **6x that in usage** ($60). For most models, this works through bulk discounts and reserved GPU capacity. For some models (Grok 4.5, Kimi K3, MiMo V2.5 Pro, DeepSeek V4 Pro), they haven't negotiated discounts yet — so the usage multiplier is lower (you get a little more than paying directly, just not the full 6x).
## Available Models
| Model | Model ID | Endpoint | SDK Package |
|-------|----------|----------|-------------|
| Grok 4.5 | `grok-4.5` | `https://opencode.ai/zen/go/v1/chat/completions` | @ai-sdk/openai-compatible |
| GLM-5.2 | `glm-5.2` | same | same |
| GLM-5.1 | `glm-5.1` | same | same |
| Kimi K3 | `kimi-k3` | same | same |
| Kimi K2.7 Code | `kimi-k2.7-code` | same | same |
| Kimi K2.6 | `kimi-k2.6` | same | same |
| DeepSeek V4 Pro | `deepseek-v4-pro` | same | same |
| DeepSeek V4 Flash | `deepseek-v4-flash` | same | same |
| MiMo-V2.5 | `mimo-v2.5` | same | same |
| MiMo-V2.5-Pro | `mimo-v2.5-pro` | same | same |
| MiniMax M3 | `minimax-m3` | `https://opencode.ai/zen/go/v1/messages` | @ai-sdk/anthropic |
| MiniMax M2.7 | `minimax-m2.7` | same | same |
| MiniMax M2.5 | `minimax-m2.5` | same | same |
| Qwen3.7 Max | `qwen3.7-max` | same | same |
| Qwen3.7 Plus | `qwen3.7-plus` | same | same |
| Qwen3.6 Plus | `qwen3.6-plus` | same | same |
| Hy3 | `hy3` | `https://opencode.ai/zen/go/v1/chat/completions` | @ai-sdk/openai-compatible |
**Config format:** `opencode-go/<model-id>` (e.g. `opencode-go/kimi-k3`)
**Model list API:** `https://opencode.ai/zen/go/v1/models`
## Privacy
Zero-retention policy from providers — your data is not used for model training.
## Goals
- Make AI coding accessible via low cost subscription
- Provide reliable access to the best open coding models
- Curate tested and benchmarked models for coding agent use
- No lock-in (use any other provider too)
+42
View File
@@ -0,0 +1,42 @@
---
title: OpenRouter
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: medium
tags: [system, openrouter, provider]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# OpenRouter
## Purpose
Fallback model provider.
## Location
Remote service; API token store.
## Current configuration
Primary key, fallback models, rate limits.
## Current state as of 2026-07-22
OpenRouter is not configured as a standalone provider in `~/.hermes/config.yaml` `custom_providers`.
OmniRoutes catalog includes provider names and model IDs consistent with OpenRouter-style slugs, but live routing via OpenRouter directly is not present in current Hermes config.
## History
- **User-provided:** Previously used; now largely replaced by LiteLLM and OmniRoute paths
- **Verified:** Decision page `keep-openrouter-as-fallback` exists, indicating retain intent
- **Inferred:** Multiple backups before model/routing changes imply OpenRouter role changed during prior config iterations
- **Unknown:** Exact date OpenRouter was replaced or partially deprecated; exact models that were available
## Connected systems
- [[systems/hermes-agent]]
- [[systems/omniroute]]
## Known issues
- Replaced: legacy Hermes autos not persistent, prompting Hermes Agent, which blocks attribution.
## Change history
- Pre-2026-07-20: OpenRouter provisioning active in some form
- 2026-07-20: Prior model-fix backup suggests routing changes around this time
## Relevant runbooks
- [[restore-openrouter]]
+65
View File
@@ -0,0 +1,65 @@
---
title: Scheduled Tasks
type: system
status: active
created: 2026-07-22
updated: 2026-08-10
verified_on: 2026-08-10
confidence: high
tags: [cron, scheduled, automation]
sources: [live-cron-list]
---
# Scheduled Tasks
## Count
- **Active jobs:** 28 (verified from live `hermes cron list`, 2026-08-07)
- **Previously 25** — GitHub Trending Radar Daily removed 2026-08-02; several jobs added since.
## Job Table
| Name | Schedule | Delivery | Skills | Script | Notes |
|---|---|---|---|---|---|
| Facebook Birthday Monthly Scrape | `0 9 1 * *` | telegram | — | — | ⚠ thread_id not found |
| Facebook Birthday Weekly Registry Sync | `0 3 * * 1` | telegram | — | `birthday_check.py` | ⚠ thread_id not found |
| Daily Birthday Checker | `30 7 * * *` | telegram | — | `birthday_check.py` | no-agent |
| Daily Marketing Job Radar | `0 7 * * 1-5` | telegram:-1004321904721:1030 | job-search-automation | — | Primary `gpt-5.6-terra`; see [[runbooks/job-radar]] |
| Perth New Restaurant & Cafe Openings (Weekly) | `0 18 * * 4` | telegram | — | — | |
| AI Newsletter Curation for Patrick (Weekly) | `0 10 * * 4` | telegram:-1004321904721:346 | — | — | |
| Enhanced Weekend Adventure Planner | `0 8 * * 5` | telegram | — | — | |
| Tech & AI Newsletter Digest (Analytical) | `0 7 * * *` | telegram:-1004321904721:346 | — | — | |
| Political News Digest (Mon/Thu) | `0 8 * * 1,4` | telegram:-1004321904721:346 | — | — | |
| Uber Eats Monthly Spend Report | `0 2 1 * *` | telegram | camofox-browser-automation, browser-backend-verification | — | |
| Gmail Action Digest | `30 8 * * *` | telegram:-1004321904721:notifications | — | `gmail_action_digest_v3.py` | |
| FreshRSS Midday News Briefing | `0 12 * * *` | telegram:-1004321904721:346 | — | `freshrss_intelligence_v2.py` | |
| Workday start reminder | `0 9 * * 1-5` | telegram | — | — | |
| Important-mail monitor | `every 30m` | telegram:1793951355 | — | — | Silent when no important mail |
| Mnemosyne Auto-Consolidate | `every 30m` | local | — | `consolidate_mnemosyne.sh` | no-agent |
| Mnemosyne DB Backup | `0 3 * * 0` | telegram:1793951355 | — | `mnemosyne-backup.sh` | no-agent |
| Mnemosyne Health Monitor | `0 */12 * * *` | telegram:-1004321904721:102 | mnemosyne-operations | — | Reports only on exception |
| Mnemosyne Watchdog | `*/15 * * * *` | telegram:-1004321904721:102 | — | `mnemosyne-watchdog.py` | no-agent, silent ≤10 conflicts |
| Mnemosyne Embedding Coverage Monitor | `0 */6 * * *` | telegram:-1004321904721:102 | — | `check_embedding_coverage.py` | Alerts if coverage < 95% |
| CT 221 Miner Watchdog | `every 15m` | telegram:1793951355 | pve-lxc-intrusion-detection | `ct221-miner-watchdog.sh` | Added 2026-08-07 after crypto miner incident |
| Mosquito Tracker | `0 7,15,22 * * *` | telegram:-1004321904721:273 | — | `mosquito_tracker.py` | Excludes 23:0007:00 |
| Weekly Review | `0 18 * * 0` | origin | weekly-review | — | |
| Evening Stand-Down Briefing | `45 18 * * 1-5` | telegram:-1004321904721 | — | `evening_standdown.py` | no-agent |
| Job Tracker Dashboard Refresh | `0 */2 * * *` | telegram:-1004321904721:1030 | — | `dashboard_watchdog.py` | no-agent |
| Wiki Audit — Nightly | `59 23 * * *` | local | task-approach | — | Reviews past 24h for wiki changes |
| GitHub Trending Radar — Weekly Roundup | `0 9 * * 1` | telegram:1793951355 | — | — | |
| 🦝 Hermes Config Backup to Gitea (Daily) | `0 11 * * *` | origin | — | `hermes-config-backup.sh` | no-agent |
| Review Agent Estate Phase One | once at 2026-08-08 18:33 | origin | — | — | ✅ Completed 2026-08-08. See [[current-state]]. |
## Removed Jobs
| Name | Removed | Reason |
|---|---|---|
| GitHub Trending Radar — Daily Digest | 2026-08-02 | Stopped by user. Weekly roundup still active. |
## Known Issues
- **Session storage failures (2026-08-10):** Four cron jobs failed — two with TimeoutError (idle 601602s while stuck initializing), two with RuntimeError ("session storage could not be written"). Disk at 83% (11GB free), `state.db` at 593MB. Likely WAL checkpoint or disk pressure issue. Affected jobs: Daily Marketing Job Radar, Tech & AI Newsletter Digest, Political News Digest, GitHub Trending Radar — Weekly Roundup. See [[current-state]] for details.
- **Wiki Audit cron model drift (2026-08-07):** Global inference config changed (`smart-route``deepseek-paid-smart`) and the job is unpinned, causing `RuntimeError: Skipped to prevent unintended spend`. Needs pinning: `cronjob action=update job_id=cbfe434a3b5e provider=<provider> model=<model>`.
- **Facebook Birthday thread_id warnings:** Configured thread_id 34795 for telegram:1793951355 was not found on several birthday-related jobs — delivered without thread.
- **Model repinning (2026-08-08):** 13 cron jobs repinned from dead/stale provider combos to `smart-route` or `gpt-5.6-terra`. Dead combos included `freeapi/minimax-m2.7`, `freeapi/auto`, `vertex/gemini-2.5-flash`, `deepseek-v4-flash-free`. Jobs now running on valid model pins.
## Related
- [[systems/mnemosyne]]
- [[runbooks/job-radar]]
+90
View File
@@ -0,0 +1,90 @@
---
title: Installed Skills
type: system
status: active
created: 2026-07-22
updated: 2026-07-25
verified_on: 2026-07-25
confidence: high
tags: [skills, hermes]
sources: []
---
# Installed Skills
## Inventory
Total installed: 66 skills in `~/.hermes/skills/`.
## Categorized Active Skills
### Core Hermes
- `hermes` — Core agent skill
### Providers & Routing
- `omniroute` — OmniRoute routing
- `omniroute-ops` — OmniRoute diagnostics and combo management
### Memory
- `chromadb` — ChromaDB vector store
- `chromadb-preflight` — ChromaDB RAG preflight
- `chromadb-skills-rag` — Skills RAG via ChromaDB
### Browser / RPA
- `computer-use` — Desktop GUI automation
### DevOps / Homelab
- `devops` — Umbrella for service operations
- `devops-homelab-architecture-live-probe` — Live homelab diagram via probes
- `devops-proxmox-operations` — Proxmox VE REST/SSH operations
- `devops-service-management` — Miscellaneous service ops
- `devops-tailscale-web-routing` — Tailscale web routing
- `cloudflare-tunnel-ops` — Cloudflare Tunnels
- `tailscale-serve-ops` — Tailscale Serve
- `tailscale-ops` — Tailscale configuration
### Messaging
- `email` — Email from terminal
- `email-himalaya` — Himalaya CLI IMAP/SMTP
### Job / Career
- `job-hunting` — Career transition coaching
- `job-hunting-assistance` — End-to-end job hunting support
- `job-search-automation` — Autonomous job board scraper
- `job-tracker-enrichment` — Notion job tracker enrichment
### Content / Research
- `tech-ai-newsletter-digest` — Newsletter processing
- `media` — YouTube transcripts, GIF search, music generation
### Productivity
- `productivity` — Document creation, presentations, spreadsheets
- `markdown-to-anywhere` — Cross-posting service
- `weekly-review` — Sunday weekly review cron
### MCP / Skills Management
- `mcp` — MCP server tooling
- `mcp-agent-integration` — Local stdio MCP server wiring
### Unverified / Not Categorized
- 40+ skills not inspected in detail during this inventory
- Full list at `~/.hermes/skills/`
## How category discovery works
Skill categories are derived from the directory layout, not from Tool Search.
The first directory below `~/.hermes/skills/` becomes the category:
- `~/.hermes/skills/devops/my-skill/SKILL.md` → category `devops`
- `~/.hermes/skills/my-skill/SKILL.md` → no category
The skill's display name and discovery description come from the YAML
frontmatter in `SKILL.md`. Directory additions are detected automatically.
In-place edits may take up to 30 seconds to appear because the discovery cache
has a 30-second lifetime.
See [[systems/tool-search]] for the separate external-tool discovery system.
## Related
- [[systems/hermes-agent]]
- [[messaging-integrations]]
- [[systems/tool-search]]
+36
View File
@@ -0,0 +1,36 @@
---
title: Terminal Backend
type: system
status: active
created: 2026-07-22
updated: 2026-07-22
verified_on: 2026-07-22
confidence: high
tags: [terminal, shell, backend, persistence]
sources: [raw/configs/hermes-config-sanitized.txt]
---
# Terminal Backend
## Purpose
Execute shell commands, scripts, and interactive sessions for Hermes.
## Current Configuration
- **Backend:** local
- **Working directory:** `/home/hermes/workspace`
- **Timeout:** 180 s
- **Home mode:** auto
- **Container CPU:** 1
- **Persistent shell:** true
## Persistence
- Shell state (venv, env vars, aliases) persists across terminal calls
- Working directory fixed to `/home/hermes/workspace`
- No containerized terminal confirmed
## Known Issues
- None observed
## Related
- [[persistent-shells]]
- [[headless-server]]
+90
View File
@@ -0,0 +1,90 @@
---
title: Hermes Tool Search
type: system
status: active
created: 2026-07-25
updated: 2026-07-25
review_after: 2026-10-23
verified_on: 2026-07-25
version_applies_to: Hermes Agent on CT460
confidence: high
tags: [hermes, automation, system]
sources: [live CT460 configuration and isolated CUA validation]
---
# Hermes Tool Search
## Why it is enabled
Hermes previously sent every external tool schema to the model on every turn.
That used a large part of the context window before the conversation began and
made compaction happen much sooner.
Native Hermes Tool Search is now always on. Core tools remain immediately
available. External tools are discovered only when they are relevant, then
described and called through the Tool Search bridge.
## Active configuration
File: `/home/hermes/.hermes/config.yaml`
```yaml
tools:
tool_search:
enabled: "on"
threshold_pct: 10
search_default_limit: 5
max_search_limit: 20
```
`enabled: "on"` is the important setting: it makes Tool Search active on every
request instead of waiting for the tool schemas to cross an automatic token
threshold.
## Verified result
- 80 external tools were deferred in the production gateway.
- Approximately 24,151 schema tokens were removed from the always-present
prompt.
- 36 core or directly visible tools remained available.
- Estimated fixed baseline fell from about 52,955 to 29,182 tokens, a reduction
of roughly 45%.
- In an isolated Computer Use test, 53 tools were discovered and the
`health_report` search, description, and call all succeeded.
- Native Tool Search tests passed: 39 tests.
Tool Search can add a small discovery call when an external tool is first
needed. It should not reduce answer quality: the model retains direct access to
core tools and can search for specialized tools by name or purpose.
## New tools and new skills
New external tools are automatically included in Tool Search after their tool
provider is loaded. They do not need to be manually assigned to a category.
Skills use a separate discovery system:
- `~/.hermes/skills/devops/my-skill/SKILL.md` is categorized as `devops`.
- A skill directly under `~/.hermes/skills/` has no category.
- The skill `name` and `description` come from YAML frontmatter in `SKILL.md`.
- Directory additions are noticed automatically. An in-place edit may take up
to 30 seconds to appear because of the skill cache.
Tool Search therefore does not decide skill categories. The first directory
below `~/.hermes/skills/` does.
## Rollback
The pre-change configuration is preserved at:
`/home/hermes/.hermes/backups/config.yaml.20260725-before-tool-search`
Restore that file only if Tool Search causes a confirmed regression, validate
the YAML, and restart `hermes-gateway.service`.
## Related
- [[systems/hermes-agent]]
- [[systems/skills-index]]
- [[concepts/tool-calling]]
- [[runbooks/gateway-resource-resilience]]