diff --git a/cmd/web-ui/static/app.js b/cmd/web-ui/static/app.js index d0886b4..6106a3e 100644 --- a/cmd/web-ui/static/app.js +++ b/cmd/web-ui/static/app.js @@ -299,15 +299,19 @@ sessionsState.cursor = data.next_cursor; const tbody = document.getElementById('sessions-body'); - tbody.innerHTML = sessionsState.sessions.map(s => ` - - ${escapeHTML(s.session_id.substring(0, 12))}... - ${escapeHTML(s.framework || '-')} - ${escapeHTML(s.host || '-')} - ${s.run_count} - ${escapeHTML(relativeTime(s.started_at))} - - `).join('') || 'No sessions found'; + tbody.innerHTML = sessionsState.sessions.map(s => { + const fw = s.framework || 'unknown'; + const fwClass = fw.replace(/[^a-z0-9-]/g, '-'); + return ` + + ${escapeHTML(s.session_id.substring(0, 12))}… + ${escapeHTML(fw)} + ${escapeHTML(s.host || '-')} + ${s.run_count} + ${escapeHTML(relativeTime(s.started_at))} + + `; + }).join('') || 'No sessions found'; tbody.querySelectorAll('tr.clickable').forEach(row => { row.addEventListener('click', () => navigate('/sessions/' + row.dataset.session)); diff --git a/cmd/web-ui/static/style.css b/cmd/web-ui/static/style.css index f1eaa61..51558b2 100644 --- a/cmd/web-ui/static/style.css +++ b/cmd/web-ui/static/style.css @@ -247,6 +247,10 @@ main > * { margin-bottom: 1.5rem; flex-wrap: wrap; align-items: flex-end; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + padding: 1rem 1.25rem; } .filters label { @@ -1242,3 +1246,21 @@ tr.clickable:hover td:first-child { border-radius: 50%; flex-shrink: 0; } + +/* ── Framework dots ───────────────────────────────────────── */ +.fw-dot { + display: inline-block; + width: 7px; + height: 7px; + border-radius: 50%; + margin-right: 0.4rem; + flex-shrink: 0; + vertical-align: middle; + position: relative; + top: -1px; +} + +.fw-dot.openclaw { background: var(--accent); } +.fw-dot.claude-code { background: var(--success); } +.fw-dot.opencode { background: var(--purple); } +.fw-dot.unknown { background: var(--text-dim); }