Commit Graph
9 Commits
Author SHA1 Message Date
Ludovic MarieandClaude Opus 5.5 fd091af76a horizon-server console: attach to the running server
The recent log, then every new line as it happens (the control API's event
stream), a header with the TPS, MSPT, players and RAM refreshed every second on
a terminal (an ANSI scroll region; no TUI framework), and a command line whose
lines run as console commands. Ctrl-D detaches and leaves the server running;
when stdout isn't a terminal it prints plain lines. The admin e2e attaches
through a pipe and runs two commands.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 15:59:57 +01:00
Ludovic Marie aa27eca326 Merge pull request #5186 from horizon-rust/server-admin/events
🤖 Agent: verified: pr_ready green (36 harnesses affected, all passed), the e2e's 39 event checks passed on the Mac mini; CI caught a race in the stream test (an event between the headers and the first cursor read was skipped), fixed in bef1eff27, CI green.
2026-10-31 15:52:34 +01:00
Ludovic MarieandClaude Opus 5.5 928cc155fb horizon-server: players, kick, ban, pardon, ban-ip and pardon-ip commands
`players [--json]` shows who is online, the operators, the whitelist and the
bans (a stopped server's from its files); `kick`, `ban`, `pardon`, `ban-ip`
and `pardon-ip` moderate the running server through the control API. The
admin e2e runs them too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 15:30:02 +01:00
Ludovic MarieandClaude Opus 5.5 48ccd93267 horizon-server: an event stream in the control API
GET /api/v1/events streams server-sent events: every log line, the
supervisor's phase, and the game's typed join, leave, kick, chat and death
events with the player's name and UUID (?types= picks some; Last-Event-ID or
?since= resumes). Without Accept: text/event-stream it answers the events
after since as JSON. The dedicated server records the typed events where it
logs them and answers `server-events SINCE` on its control endpoint; the
supervisor fetches them every 250 ms. The admin e2e streams a bot's joins,
chat (a raw chat packet), kick, leave and death.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 14:49:11 +01:00
Ludovic MarieandClaude Opus 5.5 d9c733419c horizon-server: config and backups in the control API, and a fixed address and token
GET /api/v1/config shows server.toml's settings (the API token hidden);
PATCH /api/v1/config changes them as `config set` does, live where vanilla
can, but never [engine], [panel], [api] or the RCON, query and management
keys. DELETE /api/v1/backups?name= and GET /api/v1/backups/download?name=
(streamed from the file). server.toml's new [api] section fixes the API's
address and token for a program that runs elsewhere, such as a moderation
bot; loopback or tailnet only unless allow_public. Panel changes of any
method need the X-Horizon header.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 14:37:44 +01:00
Ludovic MarieandClaude Opus 5.5 c50f97ec8f horizon-server: players, moderation and Prometheus metrics in the control API
GET /api/v1/players lists who is online (address, ping, op level) and vanilla's
lists; POST players/{kick,ban,pardon,ban-ip,pardon-ip,op,deop} and
whitelist[/add|/remove] run vanilla's console command on the running game and
answer whether the list changed and the console's lines; GET
metrics/prometheus serves the latest sample as Prometheus text.
tools/server_admin_e2e.py runs it all against a real server with two bots.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 14:36:38 +01:00
rdbtCVSandClaude Opus 5.5 5bd13dad80 Send saved chunks past the view distance (max_view_distance)
A dedicated server's new `max_view_distance` (server.toml, off by default)
sends each player, past `view_distance`, the chunks the world has saved:
read on two reader threads, sent and dropped, never generated, loaded or
ticked. Bodies sent are kept five minutes (96 MB) for players walking back,
dropped when their column changes. A brake pulls the ring in by two chunks
while ticks average over 40 ms, never inside the view, and lets it out by
one every 5 s after 30 s under 25 ms; reads pause while the save's writer
is behind. The docs point at /pregen to fill the ring.

Fixes #5008

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:13:51 +00:00
Ludovic MarieandClaude Opus 5.5 71e6b60d96 docs/api/server-reference.md: the report command
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 19:05:57 +01:00
Ludovic MarieandClaude Opus 5.5 f80d00802e Server reference generated from horizon-server's source
docs/api/server-reference.md lists horizon-server's commands (its help
text), every server.toml key (config::TEMPLATE: default, the
server.properties key it writes, what it does) and the control API's
endpoints. Tests fail when the page is out of date (HORIZON_WRITE_DOCS=1
rewrites it), when the template and Config disagree on the keys, when a key
has no comment, or when api::ROUTES and the endpoints route() answers
differ.

api::ROUTES replaces the endpoint list in api.rs's module comment and the
hand-kept path list of the 405 arm. The template's uncommented keys get a
comment (what init writes for new servers; no setting changes).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:42:51 +02:00