/** * Compliance Policy Diff Engine * * Compares rule sets and generates detailed diffs for version control * and audit trails (Enhancement #11). */ import type { ArkaRule } from '@arka-protocol/types'; /** * Diff operation type */ export type DiffOperation = 'ADD' | 'DELETE' | 'MODIFY' | 'UNCHANGED'; /** * Field-level change */ export interface FieldChange { /** Field path */ field: string; /** Previous value */ oldValue: unknown; /** New value */ newValue: unknown; /** Type of change */ changeType: 'ADDED' | 'REMOVED' | 'MODIFIED'; } /** * Rule diff entry */ export interface RuleDiff { /** Rule ID */ ruleId: string; /** Rule name */ ruleName: string; /** Diff operation */ operation: DiffOperation; /** Old rule (if modified or deleted) */ oldRule?: ArkaRule; /** New rule (if added or modified) */ newRule?: ArkaRule; /** Field-level changes */ fieldChanges: FieldChange[]; /** Condition changes (structural diff) */ conditionDiff?: ConditionDiff; /** Consequence changes */ consequenceDiff?: ConsequenceDiff; /** Impact assessment */ impact: DiffImpact; } /** * Condition structural diff */ export interface ConditionDiff { /** Whether condition structure changed */ structureChanged: boolean; /** Fields added */ fieldsAdded: string[]; /** Fields removed */ fieldsRemoved: string[]; /** Operators changed */ operatorsChanged: Array<{ field: string; oldOperator: string; newOperator: string; }>; /** Values changed */ valuesChanged: Array<{ field: string; oldValue: unknown; newValue: unknown; }>; /** Human-readable summary */ summary: string; } /** * Consequence diff */ export interface ConsequenceDiff { /** Decision changed */ decisionChanged: boolean; /** Old decision */ oldDecision?: string; /** New decision */ newDecision?: string; /** Code changed */ codeChanged: boolean; /** Message changed */ messageChanged: boolean; /** Severity changed */ severityChanged: boolean; /** Summary */ summary: string; } /** * Impact assessment */ export interface DiffImpact { /** Severity of the change */ severity: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'; /** Categories affected */ categories: string[]; /** Potential risks */ risks: string[]; /** Recommended review level */ reviewLevel: 'NONE' | 'AUTOMATED' | 'PEER' | 'SENIOR' | 'COMMITTEE'; /** Breaking change indicator */ breakingChange: boolean; /** Backward compatible */ backwardCompatible: boolean; } /** * Full diff result between two rule sets */ export interface RuleSetDiff { /** Diff identifier */ id: string; /** Timestamp */ timestamp: string; /** Source rule set version/identifier */ sourceVersion: string; /** Target rule set version/identifier */ targetVersion: string; /** Individual rule diffs */ diffs: RuleDiff[]; /** Summary statistics */ summary: { totalRules: { source: number; target: number; }; added: number; deleted: number; modified: number; unchanged: number; }; /** Overall impact */ overallImpact: DiffImpact; /** Metadata */ metadata?: Record; } /** * Rule Diff Engine */ export declare class RuleDiffEngine { /** * Compare two rule sets */ compare(sourceRules: ArkaRule[], targetRules: ArkaRule[], sourceVersion?: string, targetVersion?: string): RuleSetDiff; /** * Compare two individual rules */ compareRules(sourceRule: ArkaRule, targetRule: ArkaRule): RuleDiff; /** * Compare conditions */ private compareConditions; /** * Extract fields from condition tree */ private extractConditionFields; /** * Compare consequences */ private compareConsequences; /** * Create diff for added rule */ private createAddDiff; /** * Create diff for deleted rule */ private createDeleteDiff; /** * Calculate impact for a rule change */ private calculateRuleImpact; /** * Calculate overall impact from all diffs */ private calculateOverallImpact; private severityFromRuleSeverity; private deepEquals; private arraysEqual; } /** * Create a rule diff engine */ export declare function createRuleDiffEngine(): RuleDiffEngine; /** * Generate human-readable diff report */ export declare function formatDiffReport(diff: RuleSetDiff): string; //# sourceMappingURL=ruleDiffEngine.d.ts.map