Flag hung seats and memory pressure

A turn that has run 15 minutes while producing under 50 tokens a minute is a
stalled API stream: flagged on the page with an Esc button, and notified once.
The container's memory use is shown in the header and notified near the limit.

Claude-Session: https://claude.ai/code/session_01QhLkBGEip8wQdaZ54z4AqJ
This commit is contained in:
Asger Geel Weirsøe
2026-10-20 19:45:34 +02:00
parent 150abd9afe
commit 94b4576a96
4 changed files with 95 additions and 6 deletions
+20
View File
@@ -133,6 +133,26 @@ class ParseAskTest(unittest.TestCase):
def test_numbered_list_without_cursor_is_not_a_menu(self):
self.assertIsNone(server.parse_ask("● Plan:\n 1. engine\n 2. rooms\n", idle=False))
def test_stalled_turn(self):
self.assertEqual(server.stalled("· Ionizing… (34m 31s · ↓ 439 tokens · thinking some more)"), 35)
self.assertIsNone(server.stalled("✶ Levitating… (10m 40s · ↓ 30.1k tokens)")) # short and busy
self.assertIsNone(server.stalled("✻ Doing… (16m 3s · ↓ 3.4k tokens)")) # long but producing
self.assertEqual(server.stalled("* Thinking… (1h 2m 0s · ↓ 900 tokens)"), 62)
self.assertIsNone(server.stalled("✻ Churned for 1m 24s · done 4:26 PM"))
def test_stall_notifies_once(self):
w = server.Watcher()
s = snap()
s["rigs"][0]["seats"][0]["stalled"] = 34
self.assertEqual(w.events(s)[-1][0], "dev-qa@team ser ud til at hænge")
self.assertEqual(w.events(s), [])
def test_memory_warning_once(self):
w = server.Watcher()
s = {**snap(), "memory": {"used": 95, "limit": 100, "fraction": 0.95}}
self.assertTrue(w.events(s)[-1][0].startswith("Containeren"))
self.assertEqual(w.events(s), [])
def test_ask_text_for_notifications(self):
self.assertIn("2. Yes, and", server.ask_text(server.parse_ask(PERMISSION, idle=False)))