/** * Utility functions for notification triggers. */ import type { NotificationTrigger, TriggerContentType, TriggerMode } from '@renderer/types/data'; /** * Generates a UUID v4 for new triggers. */ export function generateId(): string { return crypto.randomUUID(); } /** * Get available match fields based on content type and tool name. */ export function getAvailableMatchFields( contentType: TriggerContentType, toolName?: string ): { value: string; label: string }[] { if (contentType === 'tool_result') { return [{ value: 'content', label: 'Content' }]; } if (contentType === 'thinking') { return [{ value: 'thinking', label: 'Thinking Content' }]; } if (contentType === 'text') { return [{ value: 'text', label: 'Text Content' }]; } if (contentType === 'tool_use') { switch (toolName) { case 'Bash': return [ { value: 'command', label: 'Command' }, { value: 'description', label: 'Description' }, ]; case 'Task': return [ { value: 'description', label: 'Description' }, { value: 'prompt', label: 'Prompt' }, { value: 'subagent_type', label: 'Subagent Type' }, ]; case 'Read': case 'Write': return [{ value: 'file_path', label: 'File Path' }]; case 'Edit': return [ { value: 'file_path', label: 'File Path' }, { value: 'old_string', label: 'Old String' }, { value: 'new_string', label: 'New String' }, ]; case 'Glob': return [ { value: 'pattern', label: 'Pattern' }, { value: 'path', label: 'Path' }, ]; case 'Grep': return [ { value: 'pattern', label: 'Pattern' }, { value: 'path', label: 'Path' }, { value: 'glob', label: 'Glob Filter' }, ]; case 'WebFetch': return [ { value: 'url', label: 'URL' }, { value: 'prompt', label: 'Prompt' }, ]; case 'WebSearch': return [{ value: 'query', label: 'Query' }]; case 'Skill': return [ { value: 'skill', label: 'Skill Name' }, { value: 'args', label: 'Arguments' }, ]; default: // "Any Tool" - match against the entire JSON-serialized input return [{ value: '', label: 'Full Input (JSON)' }]; } } return []; } /** * Derive the effective mode from trigger configuration for backward compatibility. */ export function deriveMode(trigger: NotificationTrigger): TriggerMode { if (trigger.mode) return trigger.mode; // Backward compatibility: if requireError is true and no mode, default to error_status if (trigger.requireError && trigger.contentType === 'tool_result') { return 'error_status'; } return 'content_match'; } /** * Validates a regex pattern. * @returns null if valid, error message if invalid */ export function validateRegexPattern(pattern: string): string | null { if (!pattern) { return null; } try { new RegExp(pattern); return null; } catch { return 'Invalid regex pattern'; } }