fix(dashboard): stop agents in dashboard from moving during selection
This commit is contained in:
@@ -466,14 +466,20 @@ def enumerate_active_agents() -> list[ActiveAgent]:
|
|||||||
"""All currently-running agents, across every available
|
"""All currently-running agents, across every available
|
||||||
backend. Used by CLI `list active` and the dashboard's agents
|
backend. Used by CLI `list active` and the dashboard's agents
|
||||||
pane so neither has to know which backends exist. Skips
|
pane so neither has to know which backends exist. Skips
|
||||||
backends whose `is_available()` reports False. Ordered by
|
backends whose `is_available()` reports False.
|
||||||
backend name, then by whatever each backend's
|
|
||||||
`enumerate_active` returns."""
|
Sorted by `(started_at, slug)` so the list is stable across
|
||||||
|
dashboard refresh ticks — agents don't shift position while
|
||||||
|
the operator navigates with arrow keys. ISO 8601 timestamps
|
||||||
|
sort lexicographically in chronological order; `slug` is the
|
||||||
|
deterministic tiebreaker. Agents with missing metadata
|
||||||
|
(`started_at == ""`) sort first."""
|
||||||
out: list[ActiveAgent] = []
|
out: list[ActiveAgent] = []
|
||||||
for name in known_backend_names():
|
for name in known_backend_names():
|
||||||
if not has_backend(name):
|
if not has_backend(name):
|
||||||
continue
|
continue
|
||||||
out.extend(_BACKENDS[name].enumerate_active())
|
out.extend(_BACKENDS[name].enumerate_active())
|
||||||
|
out.sort(key=lambda a: (a.started_at, a.slug))
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,46 @@ class TestEnumerateActiveAgents(unittest.TestCase):
|
|||||||
):
|
):
|
||||||
self.assertEqual([a, b], enumerate_active_agents())
|
self.assertEqual([a, b], enumerate_active_agents())
|
||||||
|
|
||||||
|
def test_sorts_by_started_at_then_slug_across_backends(self):
|
||||||
|
newer = ActiveAgent(
|
||||||
|
backend_name="docker", slug="docker-new", agent_name="impl",
|
||||||
|
started_at="2026-06-02T12:00:00Z", services=(),
|
||||||
|
)
|
||||||
|
tie_b = ActiveAgent(
|
||||||
|
backend_name="docker", slug="b-slug", agent_name="review",
|
||||||
|
started_at="2026-06-02T11:00:00Z", services=(),
|
||||||
|
)
|
||||||
|
missing_metadata = ActiveAgent(
|
||||||
|
backend_name="smolmachines", slug="missing-metadata",
|
||||||
|
agent_name="?", started_at="", services=(),
|
||||||
|
)
|
||||||
|
tie_a = ActiveAgent(
|
||||||
|
backend_name="smolmachines", slug="a-slug", agent_name="research",
|
||||||
|
started_at="2026-06-02T11:00:00Z", services=(),
|
||||||
|
)
|
||||||
|
|
||||||
|
class _FakeBackend:
|
||||||
|
def __init__(self, items):
|
||||||
|
self._items = items
|
||||||
|
|
||||||
|
def is_available(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def enumerate_active(self):
|
||||||
|
return self._items
|
||||||
|
|
||||||
|
with patch.object(
|
||||||
|
backend_mod, "_BACKENDS",
|
||||||
|
{
|
||||||
|
"docker": _FakeBackend([newer, tie_b]),
|
||||||
|
"smolmachines": _FakeBackend([missing_metadata, tie_a]),
|
||||||
|
},
|
||||||
|
):
|
||||||
|
self.assertEqual(
|
||||||
|
[missing_metadata, tie_a, tie_b, newer],
|
||||||
|
enumerate_active_agents(),
|
||||||
|
)
|
||||||
|
|
||||||
def test_empty_when_no_backends_have_active(self):
|
def test_empty_when_no_backends_have_active(self):
|
||||||
class _FakeBackend:
|
class _FakeBackend:
|
||||||
def is_available(self):
|
def is_available(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user