|
| 1 | +<!-- |
| 2 | +SPDX-License-Identifier: CC-BY-SA-4.0 |
| 3 | +SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 4 | +--> |
| 5 | + |
| 6 | +Jonathan D.A. Jewell \<[j.d.a.jewell@open.ac](j.d.a.jewell@open.ac).uk\> |
| 7 | + |
| 8 | +> [!TIP] |
| 9 | +> **AI-Assisted Install:** Just tell any AI assistant:\ |
| 10 | +> `Set` `up` `game-server-admin` `from` |
| 11 | +> [`https://github.com/hyperpolymath/game-server-admin`](https://github.com/hyperpolymath/game-server-admin)\ |
| 12 | +> The AI reads the manifest, asks you a few questions, and handles |
| 13 | +> everything. |
| 14 | +
|
| 15 | +# Overview |
| 16 | + |
| 17 | +**Universal game server probe, configuration management, and |
| 18 | +administration** — built on Gossamer (linearly-typed webview shell) with |
| 19 | +VeriSimDB (8-modality database) underpinning. |
| 20 | + |
| 21 | +GSA can attach to *any* game server, fingerprint it via protocol |
| 22 | +probing, extract its configuration into A2ML format, and provide a rich |
| 23 | +GUI for viewing, editing, and tracking config changes with full |
| 24 | +provenance. |
| 25 | + |
| 26 | +**New in this version:** User-configurable server connections with |
| 27 | +support for default servers and favorites list. See |
| 28 | +<a href="#Configuration" class="cross-reference">Configuration</a> for |
| 29 | +details. |
| 30 | + |
| 31 | +## Architecture |
| 32 | + |
| 33 | + ┌─────────────────────────────────────────────────┐ |
| 34 | + │ Gossamer GUI (Ephapax + HTML/JS) │ |
| 35 | + │ 8 panels, each a Clade citizen with inheritance │ |
| 36 | + └────────────────────┬────────────────────────────┘ |
| 37 | + │ IPC (gossamer:// bridge) |
| 38 | + ┌────────────────────┴────────────────────────────┐ |
| 39 | + │ Probe Engine (Ephapax + Zig FFI) │ |
| 40 | + │ Protocol fingerprint → game profile → config │ |
| 41 | + └────────────────────┬────────────────────────────┘ |
| 42 | + │ REST (localhost:8090) |
| 43 | + ┌────────────────────┴────────────────────────────┐ |
| 44 | + │ VeriSimDB Instance (gsa-verisimdb) │ |
| 45 | + │ 8 modalities per server, drift detection │ |
| 46 | + └─────────────────────────────────────────────────┘ |
| 47 | + |
| 48 | +## Panels |
| 49 | + |
| 50 | +| Panel | Kind | Description | |
| 51 | +|----|----|----| |
| 52 | +| Server Browser | inspector | Discover/fingerprint servers, add to management | |
| 53 | +| Config Editor | editor | A2ML-aware form generation with type validation | |
| 54 | +| Server Actions | terminal | Start/stop/restart with confirmation | |
| 55 | +| Live Logs | terminal | Real-time log streaming with ANSI color | |
| 56 | +| Health Dashboard | scanner | VeriSimDB drift detection and health gauges | |
| 57 | +| Config History | database | Temporal version timeline with diff viewer | |
| 58 | +| Cross-Server Search | database | VQL full-text + vector search across configs | |
| 59 | + |
| 60 | +All panels are registered in the PanLL Clade system with full |
| 61 | +inheritance. The cladogram grows automatically as new game profiles are |
| 62 | +added. |
| 63 | + |
| 64 | +## Supported Games (Initial) |
| 65 | + |
| 66 | +Valheim, Barotrauma, Don’t Starve Together, Minecraft Java/Bedrock, |
| 67 | +Factorio, Terraria, ARK, Rust (game), CS2, Garry’s Mod, Project Zomboid, |
| 68 | +Starbound, DayZ, Void Expanse — plus IDApTIK and Burble. |
| 69 | + |
| 70 | +# Quick Start |
| 71 | + |
| 72 | +```bash |
| 73 | +# Start the VeriSimDB instance |
| 74 | +just verisimdb-up |
| 75 | + |
| 76 | +# Build and run the CLI |
| 77 | +just run status # system status, VeriSimDB health, loaded profiles |
| 78 | +just run probe <host> [port] # fingerprint a game server (default port 27015) |
| 79 | +just run profiles # list all 18 supported game profiles |
| 80 | + |
| 81 | +# Or build and launch the GUI |
| 82 | +just build && just gui |
| 83 | +``` |
| 84 | + |
| 85 | +## CLI Reference |
| 86 | + |
| 87 | +The `gsa` binary is built automatically by `zig` `build` and lives at |
| 88 | +`src/interface/ffi/zig-out/bin/gsa`. |
| 89 | + |
| 90 | +| Command | Description | |
| 91 | +|----|----| |
| 92 | +| `gsa` `status` | VeriSimDB health, build info, loaded game profiles | |
| 93 | +| `gsa` `probe` `<host>` `[port]` | Fingerprint a game server (Steam, Minecraft, RCON, HTTP, TCP banner) | |
| 94 | +| `gsa` `profiles` | JSON listing of all supported games with engine/port/config details | |
| 95 | +| `gsa` `version` | Print version string | |
| 96 | +| `gsa` `help` | Usage information | |
| 97 | + |
| 98 | +Environment variables: `GSA_VERISIMDB_URL` (default |
| 99 | +[`http://localhost:8090`](http://localhost:8090)), `GSA_PROFILES_DIR` |
| 100 | +(default `./profiles`). |
| 101 | + |
| 102 | +# Adding a Game Profile |
| 103 | + |
| 104 | +Create a new `.a2ml` file in `profiles/`: |
| 105 | + |
| 106 | + @game-profile(id="my-game", name="My Game", engine="custom"): |
| 107 | + @ports(query=27015, game=27016):@end |
| 108 | + @protocol(type="steam-query", version="a2s"):@end |
| 109 | + @config(format="json", path="/config/server.json"): |
| 110 | + @field(key="name", type="string", label="Server Name"):@end |
| 111 | + @end |
| 112 | + @clade(inherits="gsa-game", kind="game-profile"):@end |
| 113 | + @end |
| 114 | + |
| 115 | +Then run `just` `generate-clades` — the cladogram updates automatically. |
| 116 | + |
| 117 | +# ABI/FFI Standard |
| 118 | + |
| 119 | +- **ABI (Idris2):** `src/interface/abi/` — formal type specs with |
| 120 | + dependent type proofs |
| 121 | + |
| 122 | +- **FFI (Zig):** `src/interface/ffi/` — C-compatible implementation |
| 123 | + |
| 124 | +- **Core (Ephapax):** `src/core/` — linear type enforcement for resource |
| 125 | + safety |
| 126 | + |
| 127 | +# VeriSimDB Integration |
| 128 | + |
| 129 | +Each managed server is a VeriSimDB octad with all 8 modalities: |
| 130 | + |
| 131 | +- **Graph:** server→game-profile, server→cluster edges |
| 132 | + |
| 133 | +- **Vector:** config embedding for similarity search |
| 134 | + |
| 135 | +- **Tensor:** performance metrics over time |
| 136 | + |
| 137 | +- **Semantic:** game type, version, mods, status |
| 138 | + |
| 139 | +- **Document:** full config text (A2ML, full-text indexed) |
| 140 | + |
| 141 | +- **Temporal:** every config version with timestamp |
| 142 | + |
| 143 | +- **Provenance:** who changed what, when, why (hash-chain) |
| 144 | + |
| 145 | +- **Spatial:** datacenter geolocation |
| 146 | + |
| 147 | +Dedicated instance on port 8090 with persistent storage and 15s drift |
| 148 | +detection. |
| 149 | + |
| 150 | +# Configuration |
| 151 | + |
| 152 | +GSA now supports user-specific configuration through a Nickel (`.ncl`) |
| 153 | +configuration file. This allows you to: |
| 154 | + |
| 155 | +- Set a default server IP and port |
| 156 | + |
| 157 | +- Maintain a list of favorite servers |
| 158 | + |
| 159 | +- Customize UI preferences |
| 160 | + |
| 161 | +- Configure connection settings |
| 162 | + |
| 163 | +## Initial Setup |
| 164 | + |
| 165 | +To create a default configuration file: |
| 166 | + |
| 167 | +```bash |
| 168 | +./gsa config init |
| 169 | +``` |
| 170 | + |
| 171 | +This creates `user-config.ncl` from the template. |
| 172 | + |
| 173 | +## Configuration Commands |
| 174 | + |
| 175 | +```bash |
| 176 | +# Show current configuration |
| 177 | +./gsa config show |
| 178 | + |
| 179 | +# Set default server |
| 180 | +./gsa config set-default mc.example.com 25565 |
| 181 | + |
| 182 | +# Add a favorite server |
| 183 | +./gsa config add-favorite "My Minecraft" mc.example.com 25565 |
| 184 | + |
| 185 | +# List favorite servers |
| 186 | +./gsa config list-favorites |
| 187 | +``` |
| 188 | + |
| 189 | +## Configuration File |
| 190 | + |
| 191 | +The configuration file (`user-config.ncl`) is **gitignored** to ensure |
| 192 | +your server credentials remain private. See `USER-CONFIG.md` for |
| 193 | +complete documentation. |
| 194 | + |
| 195 | +# License |
| 196 | + |
| 197 | +SPDX-License-Identifier: CC-BY-SA-4.0 |
| 198 | + |
| 199 | +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) |
| 200 | +\<[j.d.a.jewell@open.ac](j.d.a.jewell@open.ac).uk\> |
0 commit comments