/ utils / permissions / denialTracking.ts
denialTracking.ts
 1  /**
 2   * Denial tracking infrastructure for permission classifiers.
 3   * Tracks consecutive denials and total denials to determine
 4   * when to fall back to prompting.
 5   */
 6  
 7  export type DenialTrackingState = {
 8    consecutiveDenials: number
 9    totalDenials: number
10  }
11  
12  export const DENIAL_LIMITS = {
13    maxConsecutive: 3,
14    maxTotal: 20,
15  } as const
16  
17  export function createDenialTrackingState(): DenialTrackingState {
18    return {
19      consecutiveDenials: 0,
20      totalDenials: 0,
21    }
22  }
23  
24  export function recordDenial(state: DenialTrackingState): DenialTrackingState {
25    return {
26      ...state,
27      consecutiveDenials: state.consecutiveDenials + 1,
28      totalDenials: state.totalDenials + 1,
29    }
30  }
31  
32  export function recordSuccess(state: DenialTrackingState): DenialTrackingState {
33    if (state.consecutiveDenials === 0) return state // No change needed
34    return {
35      ...state,
36      consecutiveDenials: 0,
37    }
38  }
39  
40  export function shouldFallbackToPrompting(state: DenialTrackingState): boolean {
41    return (
42      state.consecutiveDenials >= DENIAL_LIMITS.maxConsecutive ||
43      state.totalDenials >= DENIAL_LIMITS.maxTotal
44    )
45  }