From e395eadfa44265b17c5a8891ac78e4735d41179a Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 4 May 2026 01:44:01 +0900 Subject: [PATCH] feat(ralph-loop): add loop session recovery state tracker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) --- src/hooks/ralph-loop/loop-session-recovery.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/hooks/ralph-loop/loop-session-recovery.ts diff --git a/src/hooks/ralph-loop/loop-session-recovery.ts b/src/hooks/ralph-loop/loop-session-recovery.ts new file mode 100644 index 000000000..517200e5f --- /dev/null +++ b/src/hooks/ralph-loop/loop-session-recovery.ts @@ -0,0 +1,33 @@ +type SessionState = { + isRecovering?: boolean +} + +export function createLoopSessionRecovery(options?: { recoveryWindowMs?: number }) { + const recoveryWindowMs = options?.recoveryWindowMs ?? 5000 + const sessions = new Map() + + function getSessionState(sessionID: string): SessionState { + let state = sessions.get(sessionID) + if (!state) { + state = {} + sessions.set(sessionID, state) + } + return state + } + + return { + isRecovering(sessionID: string): boolean { + return getSessionState(sessionID).isRecovering === true + }, + markRecovering(sessionID: string): void { + const state = getSessionState(sessionID) + state.isRecovering = true + setTimeout(() => { + state.isRecovering = false + }, recoveryWindowMs) + }, + clear(sessionID: string): void { + sessions.delete(sessionID) + }, + } +}