{{/* The console's sections (plan Addendum 4). One list, used by every page that has a header, so a section is added in one place. The argument is the section the page belongs to. */}} {{define "nav"}}{{end}} {{define "home-page"}} Privatae bastion — agents on this machine

Agents on this machine

Every AI agent running here, and what each one is doing.

{{template "nav" "agents"}}
{{/* Ten seconds: building this walks every process, reads each session's record and the tail of its transcript. Nothing here changes faster. */}}
{{template "home" .}}
{{end}} {{define "home"}} {{if .Blind}}

This machine cannot watch itself.

This build has no way to list processes on this platform, so an empty list means nothing looked, not that nothing is running.

{{end}} {{if .WalkError}}

The list of agents could not be read.

{{.WalkError}}

{{end}} {{if .PerAccount}}

This bastion runs in your own account.

An AI agent running as you can stop it, and can read the secret behind your code. Install it for the whole machine to keep agents out.

{{end}} {{if or (not .CodeSet) (not .BaselineSet)}}

Getting started

  1. See what is running on this machine. That is this page, with no setup.
  2. {{if .CodeSet}}Your code is set up.{{else}}Set up your code, so you can stop an agent and answer what agents ask. It takes an authenticator app on your phone.{{end}} {{if .BaselineSet}}A baseline is recorded.{{else}}Record a baseline on This machine, so anything new that starts here stands out.{{end}}
  3. {{if .HostsPaired}}A Host is connected.{{else}}Optional: connect a Host, if you run one. Everything above works without it.{{end}}
{{end}} {{if .Waiting}}
{{.Waiting}} request{{if gt .Waiting 1}}s are{{else}} is{{end}} waiting for your approval

Open Waiting for you to read and answer {{if gt .Waiting 1}}them{{else}}it{{end}}.

{{end}} {{if not .WalkError}}

{{if or .Sessions .Others}}{{if .Sessions}}{{.Sessions}} session{{if gt .Sessions 1}}s{{end}}{{end}}{{if and .Sessions .Others}} · {{end}}{{if .Others}}{{.Others}} other program{{if gt .Others 1}}s{{end}}{{end}}{{else}}No AI agents are running here right now.{{end}} {{if .WaitingForYou}}{{.WaitingForYou}} waiting for you{{end}} {{if .NotYours}}{{.NotYours}} not marked as yours{{end}} {{if .WouldStop}}{{.WouldStop}} the stopping rule would stop{{end}}

{{end}} {{range .Families}}

{{.Heading}}

{{range .Rows}} {{if .Service}}
{{.Head}}
{{.State}}
{{else}}
{{.Head}}
{{if .State}}
{{.State}}
{{end}} {{if .Where}}
{{.Where}}
{{end}} {{if .RunningNow}}
running now: {{.RunningNow}}
{{end}} {{if .ToolServers}}
tool servers: {{.ToolServers}}
{{end}} {{if or .PermissionsOff .NotYours .WouldStop}}
{{if .PermissionsOff}}permission prompts off{{end}} {{if .NotYours}}not marked as yours{{end}} {{if .WouldStop}}the stopping rule would stop it{{end}}
{{end}}
{{end}} {{end}} {{end}}

Checked {{.CheckedAt}}. Names, titles and statuses are what each agent says about itself.

{{end}} {{define "agent-page"}} Privatae bastion — {{if .Found}}{{.Family}}: {{.Row.Head}}{{else}}agent not running{{end}}
{{template "nav" "agents"}} {{if .Found}}

{{.Row.Head}}

{{.Family}} · pid {{.PID}}

{{else}}

Not running

No agent this bastion can see has pid {{.PID}} now. It may have finished. Back to the agents.

{{end}}
{{if .Flash}}
{{.Flash}}
{{end}} {{if .Found}} {{if and (not .Row.App) (not .Row.Service)}}
{{if .OwnerCode}}

Stops it and every process it started. Your code is needed because anything that can drive your browser can click this button.

{{else}}

To stop agents from here, set up your code first.

{{end}}
{{end}}

What it is doing

{{if .Row.State}}

{{.Row.State}}

{{end}} {{if .Row.Where}}

{{.Row.Where}}

{{end}} {{if .Row.RunningNow}}

running now: {{.Row.RunningNow}}

{{end}} {{if .Self}}{{if .Self.LastPrompt}}

last asked: “{{.Self.LastPrompt}}”

{{end}}{{end}} {{if .Row.PermissionsOff}}

Permission prompts are off for this session: it acts without asking first.

{{end}} {{if .Self}}

The name, title, status and last prompt are what {{.Family}} says about this session, read from its own files on this machine{{if not .Self.Verified}}. This platform cannot confirm the record belongs to this exact process{{end}}.

{{else}}

This agent keeps no session record this bastion can read, so it has no name or title here.

{{end}}

Its MCP tool servers

{{if .Tools}} {{range .Tools}}
{{.Name}} in {{.Where}}
{{range .Problems}}
{{.}}
{{else}}
no problems found
{{end}}
{{end}} {{else}}

No settings file this bastion can read gives this agent a tool server.

{{end}} {{if .Row.ToolServers}}

Running now: {{.Row.ToolServers}}

{{end}}

Whether it is yours

{{if .Sanctioned}}yours{{else}}not marked as yours{{end}} {{.SanctionWhy}}

{{if and (not .Sanctioned) .MarkID (not .Row.App) .OwnerCode}}
{{end}} {{if and (not .Sanctioned) (not .OwnerCode)}}

Marking a program as yours takes your code; set it up first.

{{end}}

Every mark, and taking one back: programs marked as yours.

The stopping rule

{{.Verdict}} The rule only rehearses: it stops nothing on its own.

{{range .Reasons}}

{{.Term}} {{.Detail}}

{{end}}

How the bastion knows

Kind
{{.Kind}}
{{if .Exe}}
File
{{.Exe}}
{{end}}
Command
{{.Cmdline}}
{{if .Origin}}
Started by
{{.Origin}}
{{end}} {{if .Endpoints}}
Talks to
{{range $i, $e := .Endpoints}}{{if $i}}, {{end}}{{$e}}{{end}}
{{end}} {{if .Self}}{{if .Self.SessionID}}
Session
{{.Self.SessionID}}
{{end}}{{end}}
{{range .Evidence}}

{{.Tier}} {{.Signal}}{{if .Value}} · {{.Value}}{{end}}

{{end}}
{{end}}
{{end}} {{define "activity-page"}} Privatae bastion — activity on this machine

Activity

What happened on this machine in the last seven days, newest first.

{{template "nav" "activity"}}

Everything Stops ({{index .Counts "stop"}}) Your approvals ({{index .Counts "approval"}}) What Hosts did ({{index .Counts "host"}}) Changes ({{index .Counts "change"}})

{{range .Items}}
{{.At.Local.Format "Jan 2 15:04"}} {{if .Who}}{{.Who}} {{end}}{{.What}}{{if .Refused}} refused{{end}}
{{else}}

Nothing has happened here in the last seven days{{if .Kind}} of this kind{{end}}.

{{end}}

Read from the records this bastion keeps on this machine. What a Host did here is also written to the machine's own system log, where the Host cannot change it.

{{end}} {{define "machine-schedules"}} {{if .Items}} {{range .Items}}
{{.Agent}} {{if .Schedule}}runs {{.Schedule}} · {{end}}{{.Where}}{{if .User}} · as {{.User}}{{end}}
{{.Command}}
{{end}} {{else if .Supported}}

No scheduled job on this machine starts an AI agent.

{{else}}

This platform's schedulers cannot be read by this build, so an empty list here means nothing looked.

{{end}} {{end}} {{define "machine-tools"}} {{range .}}
{{.Client}} {{len .Servers}} tool server{{if gt (len .Servers) 1}}s{{end}}{{if .Bad}}, {{.Bad}} with a problem{{end}}
{{range .Servers}}{{if .Problems}}
{{.Name}}{{range .Problems}}
{{.}}
{{end}}
{{end}}{{end}}
{{else}}

No MCP tool server is configured in any settings file this bastion can read.

{{end}} {{end}} {{define "machine-baseline"}} {{if .Flash}}
{{.Flash}}
{{end}} {{if .Has}}

Baseline recorded {{.TakenAt}}, {{.Entries}} entries.{{if .Note}} {{.Note}}{{end}}

{{if .Compared}}

Compared at {{.ComparedAt}}.{{if .WalkFailed}} The process walk failed ({{.WalkFailed}}): nothing was compared.{{end}}

{{range .Findings}}
{{.}}
{{else}}{{if not .WalkFailed}}

Nothing running here is outside the baseline.

{{end}}{{end}}

Something started in the last few seconds is judged on the next comparison, so a short command is not reported as new.

{{end}} {{else}}

No baseline yet. A baseline records what normally runs here, so anything new stands out.

{{end}} {{if .OwnerCode}}

Recording makes everything running now count as normal, so it takes your code.

{{else}}

To record a baseline, set up your code first.

{{end}} {{end}}