diff --git a/src/hooks/claude-code-hooks/session-hook-state.ts b/src/hooks/claude-code-hooks/session-hook-state.ts index a6b4024bd..cef303d30 100644 --- a/src/hooks/claude-code-hooks/session-hook-state.ts +++ b/src/hooks/claude-code-hooks/session-hook-state.ts @@ -7,7 +7,12 @@ export const sessionInterruptState = new Map() export function clearSessionHookState(sessionID: string): void { sessionErrorState.delete(sessionID) sessionInterruptState.delete(sessionID) - sessionFirstMessageProcessed.delete(sessionID) + // sessionFirstMessageProcessed must NOT be cleared on idle. + // It tracks whether the first message of a session has been processed, + // so that SessionStart hooks fire only once per session. Clearing it + // on idle (which fires after every model response) makes isFirstMessage + // always return true, causing SessionStart hooks to fire on every + // prompt instead of only the first one. } export function clearAllSessionHookState(): void {