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 }