From 7b12bfd04416881a075f6ee531c1167386a3b355 Mon Sep 17 00:00:00 2001 From: Vikas Singhal Date: Mon, 12 Oct 2026 18:23:42 +0530 Subject: [PATCH] fix(console): drop the sidebar's "N ended" sessions toggle (v0.460.1) The sidebar session list now shows only live sessions plus the open one; past runs live on All sessions. Empty state says "No live sessions." Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- web/src/App.tsx | 24 ++++-------------------- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60cb2509..e6826f9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,14 @@ new version heading in the same commit. ## [Unreleased] +## [0.460.1] - 2026-10-12 +### Removed +- **The sidebar's "N ended" toggle.** The sidebar session list now shows only live sessions (plus the + one you have open, even if it ended); past runs are on All sessions. With nothing live it says so + instead of rendering an empty list. + **For users:** the sidebar no longer lists ended sessions behind an "ended" toggle — find past runs + under All sessions. [Open Sessions](#/sessions) + ## [0.460.0] - 2026-10-12 ### Changed - **Live bets per goal is now an operator setting, not a constant.** The cap (4) exists so a loop cannot diff --git a/package-lock.json b/package-lock.json index d77d3936..bbda791b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "agent-os", - "version": "0.460.0", + "version": "0.460.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "agent-os", - "version": "0.460.0", + "version": "0.460.1", "license": "MIT", "bin": { "agent-os": "bin/agent-os" diff --git a/package.json b/package.json index ce8a60ed..a277e822 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agent-os", - "version": "0.460.0", + "version": "0.460.1", "description": "A generic, governed operating system for running autonomous agents safely across brands. Ships with a local web console.", "license": "MIT", "type": "commonjs", diff --git a/web/src/App.tsx b/web/src/App.tsx index 4149601d..29a3958e 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1499,8 +1499,6 @@ function Console({ me }: { me: Member }) { // own open/close state — the old inline footer expander outgrew the fixed footer once the nav hit // ~16 items and fought the sessions list for space. const [sidebarCollapsed, setSidebarCollapsed] = useState(() => localStorage.getItem('aos_sidebar_collapsed') === '1') - // Sidebar session list: ended runs collapse behind a toggle so live work stays at the top. - const [showEndedNav, setShowEndedNav] = useState(false) useEffect(() => { localStorage.setItem('aos_sidebar_collapsed', sidebarCollapsed ? '1' : '0') }, [sidebarCollapsed]) useEffect(() => { @@ -1861,16 +1859,13 @@ function Console({ me }: { me: Member }) { const rank = (s: Session) => (isLive(s) ? 0 : 1) // live first; all terminal (dead) states tie return rank(a) - rank(b) || b.createdAt - a.createdAt }) - // Sidebar split: live sessions always show; the open one shows even if ended; the rest of the ended - // ones hide behind the "N ended" toggle so a pile of past runs doesn't push live work off-screen. + // Sidebar shows live sessions plus the open one even if it ended; past runs live on All sessions. const navLive = mySessions.filter(isLive) // Signals the collapsed rail surfaces (the expanded sidebar shows them per-row / per-label): // how many of MY sessions are blocked on me, and whether the Inbox has anything unread at all. const waitingMine = mySessions.filter((s) => waiting.has(s.id)).length const unreadInbox = messages.filter((m) => !m.read).length - const navEnded = mySessions.filter((s) => !isLive(s)) - const selectedEndedNav = navEnded.find((s) => s.tmux === selected?.tmux) - const collapsibleNav = navEnded.filter((s) => s.tmux !== selected?.tmux) + const selectedEndedNav = mySessions.find((s) => !isLive(s) && s.tmux === selected?.tmux) // A sidebar switcher row. The "⋯" menu is a SIBLING of the link, not a child — a button nested inside // an is invalid interactive content and swallows the anchor's navigation. It stays in flow at // opacity-0 (so hovering doesn't reflow the title) and reveals on row hover / keyboard focus / while @@ -1992,25 +1987,14 @@ function Console({ me }: { me: Member }) { - {mySessions.length === 0 && ( + {navLive.length === 0 && !selectedEndedNav && (
- No sessions yet. nav('agents'))}>Spawn an agent. + {mySessions.length === 0 ? 'No sessions yet.' : 'No live sessions.'} nav('agents'))}>Spawn an agent.
)}
{navLive.map(renderNavSession)} {selectedEndedNav && renderNavSession(selectedEndedNav)} - {showEndedNav && collapsibleNav.map(renderNavSession)} - {collapsibleNav.length > 0 && ( - - )}