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) + }, + } +}