forked from Rockachopa/Timmy-time-dashboard
Major:
- Extract all inline <style> blocks from 22 Jinja2 templates into
static/css/mission-control.css — single cacheable stylesheet
- Add tox lint check that fails on inline <style> in templates
Minor:
1. Connection status indicator in topbar (green/amber/red dot) reflecting
WebSocket + Ollama reachability, with auto-reconnect
2. Jinja2 {% macro panel(title) %} in macros.html — eliminates repeated
.card.mc-panel markup; index.html converted as example
3. SVG favicon (purple T + orange dot)
4. 30-second TTL cache on _check_ollama() to avoid blocking the event loop
on every health poll (asyncio.to_thread was already in place)
5. Toast notification system (McToast.show) for transient status messages —
wired into connection status for Ollama/WebSocket state changes
Enforcement:
- CLAUDE.md updated with conventions 11-14 (no inline CSS, use panel macro,
use toasts, never block the event loop)
- tox lint + pre-push environments now fail on inline <style> blocks
https://claude.ai/code/session_014FQ785MQdyJQ4BAXrRSo9w
Co-authored-by: Claude <noreply@anthropic.com>
71 lines
1.8 KiB
HTML
71 lines
1.8 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}{{ page_title }}{% endblock %}
|
|
|
|
{% block extra_styles %}{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="experiments-container">
|
|
<div class="exp-header">
|
|
<div>
|
|
<div class="exp-title">Autoresearch Experiments</div>
|
|
<div class="exp-subtitle">Autonomous ML experiment loops — modify code, train, evaluate, iterate</div>
|
|
</div>
|
|
<div>
|
|
{% if enabled %}
|
|
<button class="btn-start"
|
|
hx-post="/experiments/start"
|
|
hx-target="#experiment-status"
|
|
hx-swap="innerHTML">
|
|
Start Experiment
|
|
</button>
|
|
{% else %}
|
|
<button class="btn-start" disabled>Disabled</button>
|
|
<div class="disabled-note">Set AUTORESEARCH_ENABLED=true to enable</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="exp-config">
|
|
<span>Metric: {{ metric_name }}</span>
|
|
<span>Budget: {{ time_budget }}s</span>
|
|
<span>Max iters: {{ max_iterations }}</span>
|
|
</div>
|
|
|
|
<div id="experiment-status" style="margin: 12px 0;"></div>
|
|
|
|
{% if history %}
|
|
<table class="exp-table">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>{{ metric_name }}</th>
|
|
<th>Duration</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for run in history %}
|
|
<tr>
|
|
<td>{{ loop.index }}</td>
|
|
<td>
|
|
{% if run.metric is not none %}
|
|
{{ "%.4f"|format(run.metric) }}
|
|
{% else %}
|
|
—
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ run.get("duration_s", "—") }}s</td>
|
|
<td>{% if run.get("success") %}OK{% else %}{{ run.get("error", "failed") }}{% endif %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<div class="empty-state">
|
|
No experiments yet. Start one to begin autonomous training.
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock %}
|