2026-09-30 08:47:33 +00:00
|
|
|
<!doctype html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
|
<title>Wolloseum | Administration</title>
|
|
|
|
|
<link rel="stylesheet" href="/assets/app.css">
|
|
|
|
|
<script src="/assets/app.js" defer></script>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body data-page="admin">
|
|
|
|
|
<div class="shell">
|
|
|
|
|
<header class="topbar">
|
|
|
|
|
<a class="brand" href="/"><span class="brand-mark">W</span> WOLLOSEUM</a>
|
|
|
|
|
<nav class="nav"><a href="/">Player</a><a href="/viewer">Live viewer</a><a href="/admin"
|
|
|
|
|
aria-current="page">Admin</a></nav>
|
|
|
|
|
</header>
|
|
|
|
|
<main>
|
|
|
|
|
<section id="login-panel" class="panel login-panel">
|
|
|
|
|
<div class="accent-band"></div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<p class="eyebrow">Restricted console</p>
|
|
|
|
|
<h2>Administrator sign in</h2>
|
|
|
|
|
<p class="login-note">Authenticate by signing a fresh server challenge with the admin Ed25519 private key.</p>
|
|
|
|
|
<form id="login-form" class="form-grid">
|
|
|
|
|
<div class="field"><label for="identity-id">Admin identity ID</label><input id="identity-id"
|
|
|
|
|
autocomplete="username" spellcheck="false" placeholder="Printed when the server starts" required></div>
|
|
|
|
|
<div class="field"><label for="private-key-file">Admin private key</label><input id="private-key-file"
|
|
|
|
|
type="file" accept=".pem,.json,application/json" required><span class="help">Use
|
|
|
|
|
data/keys/admin-private.pem.</span></div>
|
|
|
|
|
<div class="actions"><button class="button" type="submit">Open console</button></div>
|
|
|
|
|
<p id="login-message" class="message" role="status"></p>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
<section id="admin-app" class="hidden">
|
|
|
|
|
<div class="page-head">
|
|
|
|
|
<div>
|
|
|
|
|
<p class="eyebrow">Operations | <span id="account-name"></span></p>
|
|
|
|
|
<h1>Server control</h1>
|
|
|
|
|
<p class="lede">Manage identities, simulation state, and the active core module.</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="actions"><span id="game-status" class="status-chip"><i class="status-dot"></i><span
|
|
|
|
|
id="game-status-label">CONNECTING</span></span><button id="admin-logout" class="button secondary"
|
|
|
|
|
type="button">Sign out</button></div>
|
|
|
|
|
</div>
|
|
|
|
|
<p id="admin-message" class="message" role="status"></p>
|
|
|
|
|
<div class="layout">
|
|
|
|
|
<div class="main-column">
|
|
|
|
|
<section class="panel">
|
|
|
|
|
<div class="panel-head">
|
|
|
|
|
<h2>Identities</h2><span class="panel-kicker"><span id="user-count">0</span> PLAYERS</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<form id="user-form" class="inline-form">
|
|
|
|
|
<div class="field"><label for="new-username">Create player</label><input id="new-username"
|
|
|
|
|
maxlength="32" pattern="[A-Za-z0-9_\-]+" placeholder="username" required></div>
|
|
|
|
|
<button class="button" type="submit">Create keypair</button>
|
|
|
|
|
</form>
|
|
|
|
|
<p id="create-user-message" class="message" role="status" style="margin-top:10px"></p>
|
|
|
|
|
<a id="identity-download" class="button secondary hidden" href="#" download>Download identity bundle</a>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="user-list" class="user-list">
|
|
|
|
|
<div class="empty">Loading identities...</div>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
<section class="panel">
|
|
|
|
|
<div class="panel-head">
|
|
|
|
|
<h2>Core simulation</h2><span class="panel-kicker">SANDBOX VALIDATED</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<form id="core-form" class="inline-form">
|
|
|
|
|
<div class="field"><label for="core-file">Core WASM module</label><input id="core-file" type="file"
|
|
|
|
|
accept=".wasm,application/wasm" required></div>
|
|
|
|
|
<button class="button" type="submit">Replace core</button>
|
|
|
|
|
</form>
|
|
|
|
|
<p id="core-message" class="message" role="status" style="margin-top:10px"></p>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
<aside class="side-column">
|
|
|
|
|
<section class="panel">
|
|
|
|
|
<div class="panel-head">
|
|
|
|
|
<h2>Simulation</h2><span class="panel-kicker">CONTROL</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body stack">
|
|
|
|
|
<p class="side-note">Changes apply immediately. Current state is also published to the live event
|
|
|
|
|
stream.</p><button id="game-control" class="button" type="button">Pause simulation</button>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
2026-10-01 09:40:30 +00:00
|
|
|
<section class="panel">
|
|
|
|
|
<div class="panel-head">
|
|
|
|
|
<h2>Agent updates</h2><span class="panel-kicker">SCHEDULE</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<form id="simulation-settings-form" class="form-grid">
|
|
|
|
|
<div class="field"><label for="ticks-per-day">Ticks per day</label><input id="ticks-per-day"
|
|
|
|
|
type="number" min="1" max="1000000" required></div>
|
|
|
|
|
<div class="field"><label for="days-per-week">Days per week</label><input id="days-per-week"
|
|
|
|
|
type="number" min="1" max="366" required></div>
|
|
|
|
|
<div class="field"><label for="days-per-month">Days per month</label><input id="days-per-month"
|
|
|
|
|
type="number" min="1" max="366" required></div>
|
|
|
|
|
<div class="field"><label for="agent-activation">Activate queued agents</label><select
|
|
|
|
|
id="agent-activation">
|
|
|
|
|
<option value="between_ticks">Between ticks</option>
|
|
|
|
|
<option value="between_days">Between days</option>
|
|
|
|
|
<option value="between_weeks">Between weeks</option>
|
|
|
|
|
<option value="between_months">Between months</option>
|
|
|
|
|
</select></div>
|
|
|
|
|
<div class="actions"><button class="button" type="submit">Save settings</button></div>
|
|
|
|
|
<p id="simulation-settings-message" class="message" role="status"></p>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
2026-09-30 08:47:33 +00:00
|
|
|
<section class="panel">
|
|
|
|
|
<div class="panel-head">
|
|
|
|
|
<h2>Session</h2>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="panel-body">
|
|
|
|
|
<p class="side-note"><strong>Seven-day idle expiry.</strong> Each authenticated server request extends
|
|
|
|
|
the session. Only a hash of the browser token is persisted.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
</aside>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
</main>
|
|
|
|
|
<footer><span>WOLLOSEUM | ADMIN</span><span>Privileged actions require an admin identity</span></footer>
|
|
|
|
|
</div>
|
|
|
|
|
</body>
|
|
|
|
|
|
|
|
|
|
</html>
|