Patrick Buckley
bf17b0511e
fix(console): periodic idle cleanup for the coordinator pool
...
The console's coord SessionManager had no idle thread — close_idle was
never called for coordinator workstreams. This is the worse half of
the lifecycle leak: the dashboard filters via the in-memory pool, so
DB-only orphan coords were invisible. At empirical diagnosis,
coord closure was 16% (10 closed / 64 total) vs interactive 63%.
Adds _coord_idle_cleanup_thread mirroring turnstone/server.py's
_idle_cleanup_thread but skipping the rate-limiter / global-queue arms
the console doesn't have. Started from the lifespan when coord_mgr is
constructed and server.workstream_idle_timeout > 0 (reuses the
existing setting — same cadence works for both kinds).
Initial sweep runs INSIDE the thread before the first sleep, not
synchronously in the lifespan: cold-start orphans are reaped without
blocking Starlette boot. Important because cold start with many DB
orphans (the precise condition this code targets) is exactly when the
UPDATE is most likely to be slow.
Helper takes an optional stop_event parameter purely for tests —
production callers pass None and the daemon runs for process lifetime.
This avoids the SystemExit-from-stub + module-wide filterwarnings
fragility a previous iteration relied on.
Four tests: initial sweep runs before first sleep, ticks fire each
loop, exceptions don't kill the thread, stop_event exits cleanly.
2026-04-30 13:32:05 -07:00
..
2026-03-02 00:33:37 -08:00
2026-04-28 09:37:54 -07:00
2026-04-28 10:27:26 -07:00
2026-04-27 21:52:57 -07:00
2026-04-29 18:25:40 -07:00
2026-04-26 22:14:22 -07:00
2026-04-27 19:37:26 -07:00
2026-04-27 22:51:31 -07:00
2026-04-26 22:14:22 -07:00
2026-04-26 22:14:22 -07:00
2026-03-13 21:21:09 -07:00
2026-04-04 12:26:10 -07:00
2026-04-28 12:52:36 -07:00
2026-04-18 05:49:54 -07:00
2026-04-18 05:49:54 -07:00
2026-03-30 20:30:05 -07:00
2026-04-18 05:49:54 -07:00
2026-04-18 05:49:54 -07:00
2026-03-23 11:11:40 -07:00
2026-04-26 22:14:22 -07:00
2026-04-16 11:08:26 -07:00
2026-04-06 14:18:02 -07:00
2026-04-30 13:32:05 -07:00
2026-04-27 21:52:57 -07:00
2026-04-16 13:30:25 -07:00
2026-04-18 19:02:52 -07:00
2026-04-26 22:14:22 -07:00
2026-04-29 19:52:44 -07:00
2026-04-26 17:32:44 -07:00
2026-04-27 21:52:57 -07:00
2026-04-29 19:52:44 -07:00
2026-04-28 12:52:36 -07:00
2026-04-24 16:56:06 -07:00
2026-04-27 11:41:14 -07:00
2026-04-28 10:27:26 -07:00
2026-04-24 16:56:06 -07:00
2026-04-29 19:52:44 -07:00
2026-04-16 21:40:50 -07:00
2026-04-28 14:23:32 -07:00
2026-03-13 21:21:09 -07:00
2026-04-04 17:53:20 -07:00
2026-03-02 00:33:37 -08:00
2026-03-23 14:55:14 -07:00
2026-03-03 22:57:34 -08:00
2026-04-04 22:19:03 -07:00
2026-03-23 11:11:40 -07:00
2026-04-04 23:44:29 -07:00
2026-04-03 15:36:20 -07:00
2026-04-25 22:52:39 -07:00
2026-04-05 01:53:33 -07:00
2026-04-05 01:53:33 -07:00
2026-04-27 21:52:57 -07:00
2026-04-17 23:56:10 -07:00
2026-04-28 19:51:00 -07:00
2026-03-04 06:47:30 -08:00
2026-03-02 16:55:12 -08:00
2026-03-24 03:13:23 -07:00
2026-04-16 21:40:50 -07:00
2026-03-15 17:12:13 -07:00
2026-03-12 15:46:00 -07:00
2026-03-12 16:57:31 -07:00
2026-03-21 16:12:50 -07:00
2026-03-20 20:01:26 -07:00
2026-03-23 11:11:40 -07:00
2026-03-15 14:28:03 -07:00
2026-03-13 21:21:09 -07:00
2026-04-30 03:13:37 -07:00
2026-04-13 17:14:58 -07:00
2026-03-30 04:19:24 -07:00
2026-04-29 18:25:40 -07:00
2026-04-28 13:49:31 -07:00
2026-04-06 03:08:19 -07:00
2026-04-06 09:54:03 -07:00
2026-04-05 17:18:26 -07:00
2026-03-07 12:49:07 -08:00
2026-03-17 17:02:25 -07:00
2026-03-23 11:11:40 -07:00
2026-03-21 00:14:46 -07:00
2026-04-26 22:14:22 -07:00
2026-03-23 11:11:40 -07:00
2026-04-05 01:53:33 -07:00
2026-04-27 11:41:14 -07:00
2026-04-25 22:52:39 -07:00
2026-04-28 19:51:00 -07:00
2026-04-15 13:30:22 -07:00
2026-04-30 03:13:37 -07:00
2026-04-26 22:14:22 -07:00
2026-04-15 13:30:22 -07:00
2026-04-27 12:47:21 -07:00
2026-04-18 19:02:52 -07:00
2026-03-30 20:30:05 -07:00
2026-03-29 14:18:39 -07:00
2026-04-26 22:14:22 -07:00
2026-04-05 01:53:33 -07:00
2026-03-02 00:33:37 -08:00
2026-03-02 16:55:12 -08:00
2026-03-10 19:32:37 -07:00
2026-03-23 11:11:40 -07:00
2026-03-30 20:30:05 -07:00
2026-03-02 16:55:12 -08:00
2026-04-26 22:14:22 -07:00
2026-04-16 09:56:17 -07:00
2026-04-04 22:19:03 -07:00
2026-04-16 13:30:25 -07:00
2026-04-26 22:14:22 -07:00
2026-04-26 22:14:22 -07:00
2026-04-26 13:11:07 -07:00
2026-04-26 22:14:22 -07:00
2026-04-26 04:07:39 -07:00
2026-04-28 10:27:26 -07:00
2026-04-14 11:05:51 -07:00
2026-04-24 14:28:51 -07:00
2026-04-26 20:00:45 -07:00
2026-03-30 20:30:05 -07:00
2026-04-15 13:30:22 -07:00
2026-04-30 13:32:05 -07:00
2026-04-26 22:14:22 -07:00
2026-04-27 15:51:01 -07:00
2026-04-26 22:14:22 -07:00
2026-04-30 03:13:37 -07:00
2026-04-06 08:14:18 +02:00
2026-04-05 13:09:36 -07:00
2026-04-16 11:08:26 -07:00
2026-03-17 01:26:44 -07:00
2026-03-17 16:09:06 -07:00
2026-03-31 22:34:24 -07:00
2026-03-17 01:26:44 -07:00
2026-03-23 11:11:40 -07:00
2026-03-16 15:45:21 -07:00
2026-03-17 01:26:44 -07:00
2026-04-26 04:07:39 -07:00
2026-04-25 20:11:47 -07:00
2026-04-16 13:39:32 -07:00
2026-04-04 17:53:20 -07:00
2026-04-18 10:20:19 -07:00
2026-04-30 13:32:05 -07:00
2026-03-23 11:11:40 -07:00
2026-04-28 12:19:34 -07:00
2026-04-01 19:38:24 -07:00
2026-03-31 11:28:39 -07:00
2026-04-01 19:38:24 -07:00
2026-03-25 16:07:05 -07:00
2026-04-28 19:51:00 -07:00
2026-03-30 20:30:05 -07:00
2026-03-12 14:49:58 -07:00
2026-03-17 17:02:25 -07:00
2026-04-04 19:11:07 -07:00
2026-04-28 12:19:34 -07:00
2026-03-23 11:11:40 -07:00
2026-04-25 20:11:47 -07:00
2026-03-23 11:11:40 -07:00
2026-03-10 08:18:28 -07:00
2026-04-05 16:25:53 -07:00
2026-03-23 16:09:03 -07:00
2026-04-27 15:51:01 -07:00
2026-04-29 19:52:44 -07:00
2026-04-30 03:13:37 -07:00
2026-04-28 12:19:34 -07:00