/** * Conflict resolution helpers for StateSyncManager. * * Extracted from sync.ts to stay within the 300-LOC target. */ import type { SDKState, ConflictResolution } from '@breakpilot/compliance-sdk-types' // ============================================================================= // DEFAULT CONFLICT HANDLER // ============================================================================= /** * Default strategy: if local is newer, keep local; otherwise merge * server as the base but preserve local preferences and deduplicate * commandBarHistory / recentSearches. */ export async function defaultConflictHandler( local: SDKState, server: SDKState ): Promise { const localTime = new Date(local.lastModified).getTime() const serverTime = new Date(server.lastModified).getTime() if (localTime > serverTime) { return { strategy: 'local' } } const mergedState: SDKState = { ...server, preferences: local.preferences, commandBarHistory: [ ...local.commandBarHistory, ...server.commandBarHistory.filter( h => !local.commandBarHistory.some(lh => lh.id === h.id) ), ].slice(0, 50), recentSearches: [...new Set([...local.recentSearches, ...server.recentSearches])].slice( 0, 20 ), } return { strategy: 'merge', mergedState } } // ============================================================================= // CONFLICT RESOLUTION APPLIER // ============================================================================= /** * Given a resolution strategy and both states, returns the winning state. */ export function applyConflictResolution( resolution: ConflictResolution, localState: SDKState, serverState: SDKState ): SDKState { switch (resolution.strategy) { case 'local': return localState case 'server': return serverState case 'merge': return resolution.mergedState || localState } }