Conversation
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a small, focused server bug fix that preserves live Claude processes needed for cross-session messaging while leaving other provider cleanup behavior unchanged. Tests cover both retained Claude sessions and continued cleanup of stale Codex sessions. You can add or adjust custom eligibility rules. Learn more. |
|
Note: GPT-6 on behalf of shivam (@shivamhwp). Please rebase the new reaper cases onto the current |
|
Just to note, I too am eagerly awaiting this PR getting merged. It also covers Claude sessions that are idle but armed to wake themselves, which the reaper can't see cause neither shows up as a background task. In my case, a scheduled wakeup (ScheduleWakeup, Repro: T3 Code desktop, Claude provider with BTW I'd be happy to help with the test rebase if @Gigioxx has abandoned this. |
|
@Gigioxx I rebased this onto current main and moved the new cases onto the On top of that, two separate commits you can take or drop:
Compare against main: main...KonstantinKo:t3code:reaper-rebase-9612 Taking it is one command from your checkout: git fetch https://github.com/KonstantinKo/t3code reaper-rebase-9612 && git push -f origin FETCH_HEAD:t3code/keep-messaging-sessions-alive
(Written by Claude Opus 5 for Konstantin) |
What Changed
Keep live Claude sessions out of the inactivity reaper so their cross-session messaging endpoint remains addressable. Other providers and Claude bindings without a live adapter session keep the existing cleanup behavior.
Why
Claude's process owns its roster entry and messaging socket. Reaping an idle thread removes it from
ListAgents, makesSendMessagefail, and resuming cannot restore the same endpoint identity.Fixes #9586.
Verification
vp test run apps/server/src/provider/Layers/ProviderSessionReaper.test.ts(9 passed)vp run --filter t3 typecheckpassedgit diff --checkpassedChecklist
Implemented with
gpt-5.6-solin T3 Code through the Codex harness.Note
Medium Risk
Changes session lifecycle for Claude only and adds a listSessions dependency each sweep; wrong skip logic could leave zombie sessions or fail to reap when messaging is gone.
Overview
The inactivity ProviderSessionReaper no longer stops idle Claude bindings when
listSessions()still reports a liveclaudeAgentsession for that thread, so cross-session messaging can keep using the same process endpoint. Other providers and Claude bindings without a live adapter session still follow the existing stale-session cleanup.Tests mock
activeSessionson the harness, assert stale codex sessions are still reaped, and add cases for idle ready / error Claude threads that must not callstopSession. Multi-session failure/defect scenarios use error thread status on the Claude side so those bindings are not exempted by the new skip rule.Reviewed by Cursor Bugbot for commit c3ab694. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Fix
ProviderSessionReaperto keep live Claude messaging sessions aliveThe reaper previously stopped stale persisted Claude bindings even when a live session was still active. The sweep in
makeProviderSessionReapernow callsproviderService.listSessions, builds a set of active Claude thread IDs, and skips stopping any Claude binding whose thread ID is in that set.Tests in ProviderSessionReaper.test.ts are updated: the generic stale-session test switched to the Codex provider, and new parameterized tests verify that live idle Claude sessions in
readyanderrorstates are retained.Risk: non-Claude providers are unaffected; only Claude bindings with a matching live thread ID are exempted from reaping.
Macroscope summarized c3ab694.