72 lines
3.3 KiB
HTML
72 lines
3.3 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<meta name="referrer" content="no-referrer">
|
|
<title>Privatae bastion — this machine</title>
|
|
<link rel="stylesheet" href="/assets/app.css">
|
|
<link rel="stylesheet" href="/assets/given.css">
|
|
<link rel="stylesheet" href="/assets/home.css">
|
|
<!-- htmx injects its own indicator stylesheet with insertAdjacentHTML (it does
|
|
`<style>` + `.htmx-indicator{opacity:0...}` when includeIndicatorStyles is
|
|
true, which is its default). This page's CSP is `default-src 'self'` with no
|
|
style-src escape and no nonce, so the browser BLOCKS that injection and logs
|
|
a violation on every load. Nothing here uses hx-indicator, so the effect is
|
|
nil and the console noise is the whole cost — but a CSP that is violated on
|
|
every page teaches whoever reads the console to ignore it, which is the one
|
|
thing a CSP cannot afford.
|
|
|
|
Turn the injection OFF rather than widen the policy. Found by the disk-map
|
|
unit while building against this CSP; it fires on the pages shipped in
|
|
0.25.0 too, so it predates that work. -->
|
|
<meta name="htmx-config" content='{"includeIndicatorStyles":false}'>
|
|
<script src="/assets/htmx.min.js"></script>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<h1>This machine</h1>
|
|
<p class="sub">The bastion running here, and the Hosts it serves.</p>
|
|
{{template "nav" "machine"}}
|
|
<!-- The older pages, until the steps that replace them land (plan Addendum 4):
|
|
what each Host may do here, and the disk. -->
|
|
<p class="sub">
|
|
<a href="/given">What this machine has given away</a> ·
|
|
<a href="/diskmap">This machine's disk</a>
|
|
</p>
|
|
</header>
|
|
|
|
<!-- The ONE piece of htmx in the page: re-fetch the same fragment the server
|
|
rendered below, every few seconds, and swap it in. No client-side state,
|
|
no JSON, no duplicate rendering path — the fragment is the truth. -->
|
|
<main id="status"
|
|
hx-get="/fragments/status"
|
|
hx-trigger="every 3s"
|
|
hx-swap="innerHTML">
|
|
{{template "status" .}}
|
|
</main>
|
|
|
|
{{/* Loaded once when the page opens (uimachine.go): they read files and walk
|
|
processes, and nothing in them changes at the status block's pace. */}}
|
|
<main class="machine-sections">
|
|
<h3>Report</h3>
|
|
<div class="panel">
|
|
<form method="post" action="/machine/report"><button class="go" type="submit">Write report</button></form>
|
|
<p class="dim">One Markdown file: the agents running now, scheduled jobs that start one, MCP tool-server problems,
|
|
changes since your baseline, and the last seven days of activity. No AI model writes any of it.</p>
|
|
</div>
|
|
<h3>Scheduled jobs that start an agent</h3>
|
|
<div class="panel" hx-get="/fragments/machine/schedules" hx-trigger="load" hx-swap="innerHTML"><p class="dim">Reading…</p></div>
|
|
<h3>MCP tool servers on this machine</h3>
|
|
<div class="panel" hx-get="/fragments/machine/tools" hx-trigger="load" hx-swap="innerHTML"><p class="dim">Reading…</p></div>
|
|
<h3>Changes since your baseline</h3>
|
|
<div class="panel" id="machine-baseline" hx-get="/fragments/machine/baseline" hx-trigger="load" hx-swap="innerHTML"><p class="dim">Reading…</p></div>
|
|
</main>
|
|
|
|
<footer>
|
|
privatae-bastion {{.Version}} · this page is served from this machine only and
|
|
is not reachable from anywhere else.
|
|
</footer>
|
|
</body>
|
|
</html>
|