Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,17 +161,24 @@ Control records its own observation time; it does not trust remote wall-clock ti
Configuration is split into independently negotiated capabilities. `config.proxy-routing.v1` exposes typed proxy routing.
`config.files.v1` manages `Config.yml`, `VoteSites.yml`, `SpecialRewards.yml`, `GUI.yml`, `Shop.yml`, and
`BungeeSettings.yml` on enrolled Bukkit nodes through a bounded YAML editor. `config.quick-setup.v1` supplies standalone,
proxy-backend, vote-site, easy-reward, common-settings, and vote-party presets. Bukkit registration also reports a bounded
proxy-backend, vote-site, easy-reward, common-settings, and vote-party presets. Readable presets load their installed
values before editing, and reward presets append without replacing existing commands or messages. Reward-safe VoteSites
synchronization is part of the same Quick Setup workflow: it copies site definitions while preserving rewards,
credentials, reward files, and target-only sites on every destination. Bukkit registration also reports a bounded
set of installed plugin names (at most 16384 entries across the registry) so the WebUI can offer editable Minecraft,
Essentials, CMI, and LuckPerms command suggestions;
these are suggestions, not executed commands, and follow the normal preview/approval path. Password, secret, token, API-key, authorization, and webhook-secret values are masked
on every read; leaving the redaction marker in a proposal preserves the current value. A newly entered secret is accepted
only in the authenticated proposal and is not returned in results or written to the audit log.

Read actions load only the primary server shown in the configuration header. Preview and apply still cover every server
explicitly included in configuration changes, so one slow secondary node does not delay opening the editor or guided form.

Preview parses YAML and calculates path-level changes without writing. Apply consumes a
single-use random approval token, carries each previewed revision to that node, and reports partial failures instead of a
network-wide success. Proxies and Bukkit nodes create local backups, require atomic replacement, reload, and restore the
backup if reload fails. Bukkit reads normalize YAML; administrators should expect comments and formatting to be normalized
backup if reload fails. The WebUI labels a rolled-back node as not saved and displays the bounded reload cause returned by
the plugin. Bukkit reads normalize YAML; administrators should expect comments and formatting to be normalized
when applying through the full editor.

`configuration-audit.jsonl` records bounded, append-only, hash-chained operation metadata and rotates once at 5 MiB. A
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/web/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,8 @@ select { width: 100%; margin-bottom: 16px; }
label span { color: var(--muted); font-weight: 400; }
.operation-actions { display: flex; flex-wrap: wrap; gap: 9px; }
.method-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(145px, 1fr)); gap: 9px; }
#operation-status, #file-operation-status, #quick-operation-status, #vote-sites-sync-status, #transport-test-status, #proxy-method-status { min-height: 84px; margin: 18px 0 0; padding: 14px; overflow: auto; border: 1px solid var(--border); border-radius: 9px; background: #050c16; color: #c6d5e8; white-space: pre-wrap; }
.method-buttons button.active { box-shadow: 0 0 0 3px rgba(42, 122, 226, .22); }
#operation-status, #file-operation-status, #quick-operation-status, #transport-test-status, #proxy-method-status { min-height: 84px; margin: 18px 0 0; padding: 14px; overflow: auto; border: 1px solid var(--border); border-radius: 9px; background: #050c16; color: #c6d5e8; white-space: pre-wrap; }
#file-operation-status { margin: 0; border: 0; border-top: 1px solid var(--border); border-radius: 0; }
.form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; margin: 16px 0; }
.form-grid label { color: var(--muted); }
Expand Down
Loading
Loading