Add browser dashboard, run tracing, and logged navigation decisions

- dashboard.py: stdlib http.server + JSON API (tree/trace/dream/status,
  POST submit/relabel); static/ single-page Redux-DevTools-style inspector
- trace.py: runs.jsonl lifecycle events keyed by run_id
- scheduler/skills/skill: every decision carries run_id; navigation choices
  now logged (navigate:category/leaf); requeues stamp meta.parent_run
- cli: 'dashboard' subcommand; config.json untracked per-machine (see
  config.example.json)
This commit is contained in:
Denton Social
2026-09-23 13:43:39 -05:00
parent b568e6bd48
commit 0db41241be
15 changed files with 1581 additions and 16 deletions
+80
View File
@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SemIf Agent Dashboard</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<header class="topbar">
<div class="brand">SemIf <span class="muted">agent dashboard</span></div>
<div id="mode-badge" class="badge"></div>
</header>
<section class="inputbar">
<form id="submit-form">
<input id="query-input" type="text" autocomplete="off" spellcheck="false"
placeholder="type a request, e.g. 'send my girlfriend an email that I'm running late'">
<button type="submit">submit</button>
</form>
<button id="refresh-btn" type="button" title="reload trace">refresh</button>
</section>
<main class="layout">
<aside class="panel left">
<div class="panel-head">
<h2>Timeline</h2>
<select id="phase-filter" title="filter by phase">
<option value="">all phases</option>
</select>
</div>
<div id="timeline" class="timeline"></div>
</aside>
<section class="panel center">
<div class="panel-head">
<h2>Decision flow</h2>
<span id="run-label" class="muted"></span>
<div class="spacer"></div>
<label class="scrub-label">time travel
<input id="scrubber" type="range" min="0" max="0" value="0" step="1">
</label>
</div>
<div id="flow" class="flow"></div>
</section>
<aside class="panel right">
<div class="panel-head">
<h2>Inspector</h2>
<button id="relabel-btn" type="button" class="small" disabled>relabel…</button>
</div>
<div id="inspector" class="inspector"></div>
<div class="panel-head">
<h2>Skill tree</h2>
</div>
<div id="skill-tree" class="skill-tree"></div>
<div class="panel-head">
<h2>Dream / status</h2>
</div>
<div id="status" class="status"></div>
</aside>
</main>
<div id="relabel-modal" class="modal hidden">
<div class="modal-box">
<h3>Relabel decision</h3>
<p class="muted" id="relabel-id"></p>
<label>observed outcome
<select id="relabel-options"></select>
</label>
<div class="modal-actions">
<button id="relabel-cancel" type="button">cancel</button>
<button id="relabel-apply" type="button" class="primary">apply (3x weight)</button>
</div>
</div>
</div>
<script src="/static/app.js"></script>
</body>
</html>