{"version":3,"sources":["../../../src/utils/logger.ts","../../../src/services/plugin-service.ts"],"names":["winston","chalk"],"mappings":"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","file":"plugin-service.cjs","sourcesContent":["import winston from 'winston';\nimport chalk from 'chalk';\nimport { IssueError, FileNotFoundError, InvalidFilenameError, InvalidTargetError, FileExistsError, handleError } from '../errors/errors.js';\n\n// Define our custom logger interface\nexport interface CustomLogger extends winston.Logger {\n  success(message: any, ...meta: any[]): winston.Logger;\n  debug(message: any, ...meta: any[]): winston.Logger;\n}\n\nconst { format, createLogger, transports } = winston;\nconst { combine, timestamp, printf } = format;\n\n// Custom format for different log levels\nconst customFormat = printf((info: winston.Logform.TransformableInfo) => {\n  const ts = new Date(info.timestamp?.toString() || Date.now()).toLocaleTimeString();\n  \n  switch (info.level) {\n    case 'error':\n      return `${chalk.gray(ts)} ${chalk.red('✖')} ${chalk.red(info.message)}`;\n    case 'warn':\n      return `${chalk.gray(ts)} ${chalk.yellow('⚠')} ${chalk.yellow(info.message)}`;\n    case 'info':\n      return `${chalk.gray(ts)} ${chalk.blue('ℹ')} ${info.message}`;\n    case 'debug':\n      return `${chalk.gray(ts)} ${chalk.gray('🔍')} ${chalk.gray(info.message)}`;\n    case 'success':\n      return `${chalk.gray(ts)} ${chalk.green('✔')} ${chalk.green(info.message)}`;\n    default:\n      return `${chalk.gray(ts)} ${info.message}`;\n  }\n});\n\n// Create custom success level\nconst customLevels = {\n  levels: {\n    error: 0,\n    warn: 1,\n    info: 2,\n    debug: 3,\n    success: 4\n  },\n  colors: {\n    error: 'red',\n    warn: 'yellow',\n    info: 'blue',\n    debug: 'gray',\n    success: 'green'\n  }\n};\n\n// Create a filter to completely silence debug messages unless explicitly enabled\nconst silenceDebug = format((info) => {\n  if (info.level === 'debug' && !process.env.DEBUG_ENABLED) {\n    return false;\n  }\n  return info;\n});\n\n// Create the logger with silent debug by default\nconst baseLogger = createLogger({\n  levels: customLevels.levels,\n  format: combine(\n    silenceDebug(),\n    timestamp(),\n    customFormat\n  ),\n  transports: [\n    new transports.Console({\n      level: 'info'\n    })\n  ]\n});\n\n// Add success method to match our interface\n(baseLogger as any).success = baseLogger.info;\n\nexport const logger = baseLogger as CustomLogger;\n\n// Add colors to winston\nwinston.addColors(customLevels.colors);\n\n// Function to configure logger based on debug flag\nexport function configureLogger(debug: boolean = false) {\n  process.env.DEBUG_ENABLED = debug ? 'true' : '';\n  const level = debug ? 'debug' : 'info';\n  logger.transports.forEach(transport => {\n    if (transport instanceof winston.transports.Console) {\n      transport.level = level;\n    }\n  });\n}\n\n// Re-export error types for convenience\nexport { IssueError, FileNotFoundError, InvalidFilenameError, InvalidTargetError, FileExistsError, handleError }; ","import { IntentPattern } from './intent-service.js';\nimport { FrontmatterMetadata } from '../types.js';\nimport { InterpretedIntent } from './intent-service.js';\nimport { logger } from '../utils/logger.js';\nimport { ValidationResult } from '../types.js';\nimport { LLMail } from '../LLMail.js';\nimport { ResolvedConfig } from '../utils/config.js';\n\n/**\n * Context object passed to plugin commands during execution\n */\nexport interface CommandContext {\n  llmail: LLMail;           // Core llmail instance\n  logger: typeof logger;     // llmail's logger\n  config: ResolvedConfig;   // Current config\n  cwd: string;             // Working directory\n  pluginService: PluginService; // Access to plugin service for configuration\n}\n\n/**\n * Describes a command that a plugin may register to extend the llmail CLI.\n */\nexport interface PluginCommand {\n  name: string;\n  description: string;\n  subcommands?: PluginCommand[];\n  options?: Array<{\n    name: string;\n    description?: string;\n    type?: 'boolean' | 'string' | 'number';\n    required?: boolean;\n    default?: any;\n  }>;\n  \n  /** Execute the command with arguments and context */\n  execute: (args: Record<string, any>, context: CommandContext) => Promise<void>;\n  \n  /** Optional hook that runs before command execution. Can modify args. */\n  beforeExecute?: (args: Record<string, any>) => Promise<void | Record<string, any>>;\n  \n  /** Optional hook that runs after successful command execution */\n  afterExecute?: (result: any) => Promise<void>;\n  \n  /** Optional hook that runs when an error occurs. Can transform the error. */\n  onError?: (error: Error, args: Record<string, any>) => Promise<void | Error>;\n}\n\n/**\n * Interface that all plugins must implement\n */\nexport interface Plugin {\n  /** Unique identifier for the plugin */\n  name: string;\n\n  /** Plugin priority - higher numbers run first (default: 0) */\n  priority?: number;\n\n  /** Default configuration for this plugin */\n  defaultConfig?: Record<string, any>;\n\n  /** Optional function to validate plugin configuration */\n  validateConfig?: (config: Record<string, any>) => ValidationResult;\n\n  /** Register new or override existing intent patterns */\n  registerIntents?: (existingPatterns: IntentPattern[]) => IntentPattern[];\n  \n  /** Register additional valid types */\n  registerTypes?: () => string[];\n  \n  /** Register additional valid active states */\n  registerActiveStates?: () => string[];\n  \n  /** Register additional valid inactive reasons */\n  registerInactiveReasons?: () => string[];\n  \n  /** Custom metadata validation hook */\n  validateMetadata?: (metadata: FrontmatterMetadata) => ValidationResult;\n  \n  /** Post-processing hook for interpreted intents */\n  postInterpretIntent?: (intent: InterpretedIntent) => InterpretedIntent;\n\n  /** Optional: Register additional CLI commands for this plugin */\n  registerCommands?: () => PluginCommand[];\n}\n\nexport class PluginService {\n  private plugins: Plugin[] = [];\n  private registeredTypes: Set<string> = new Set();\n  private registeredActiveStates: Set<string> = new Set();\n  private registeredInactiveReasons: Set<string> = new Set();\n  private pluginConfigs: Map<string, any> = new Map();\n  private commands: PluginCommand[] = [];\n\n  /**\n   * Register a new plugin\n   */\n  registerPlugin(plugin: Plugin): void {\n    logger.debug(`Registering plugin: ${plugin.name}`);\n\n    // Check if plugin is already registered\n    if (this.plugins.some(p => p.name === plugin.name)) {\n      throw new Error(\n        `Plugin ${plugin.name} is already registered. ` +\n        `This usually means the plugin is being registered at the wrong level. ` +\n        `Plugins should be registered once at the run level, not per handled object.`\n      );\n    }\n    \n    // Register commands\n    if (plugin.registerCommands) {\n      logger.debug(`Registering commands for plugin ${plugin.name}`);\n      try {\n        const commands = plugin.registerCommands();\n        logger.debug(`Plugin ${plugin.name} registered commands:`, commands);\n        this.commands.push(...commands);\n      } catch (error) {\n        logger.error(`Error registering commands for plugin ${plugin.name}:`, error);\n      }\n    }\n\n    // Register types\n    if (plugin.registerTypes) {\n      logger.debug(`Registering types for plugin ${plugin.name}`);\n      try {\n        const types = plugin.registerTypes();\n        logger.debug(`Plugin ${plugin.name} registered types:`, types);\n        types.forEach(type => this.registeredTypes.add(type));\n      } catch (error) {\n        logger.error(`Error registering types for plugin ${plugin.name}:`, error);\n      }\n    }\n\n    // Register active states\n    if (plugin.registerActiveStates) {\n      logger.debug(`Registering active states for plugin ${plugin.name}`);\n      try {\n        const states = plugin.registerActiveStates();\n        logger.debug(`Plugin ${plugin.name} registered active states:`, states);\n        states.forEach(state => this.registeredActiveStates.add(state));\n      } catch (error) {\n        logger.error(`Error registering active states for plugin ${plugin.name}:`, error);\n      }\n    }\n\n    // Register inactive reasons\n    if (plugin.registerInactiveReasons) {\n      logger.debug(`Registering inactive reasons for plugin ${plugin.name}`);\n      try {\n        const reasons = plugin.registerInactiveReasons();\n        logger.debug(`Plugin ${plugin.name} registered inactive reasons:`, reasons);\n        reasons.forEach(reason => this.registeredInactiveReasons.add(reason));\n      } catch (error) {\n        logger.error(`Error registering inactive reasons for plugin ${plugin.name}:`, error);\n      }\n    }\n\n    // Initialize plugin config with defaults if provided\n    if (plugin.defaultConfig) {\n      logger.debug(`Initializing config for plugin ${plugin.name}`);\n      this.pluginConfigs.set(plugin.name, { ...plugin.defaultConfig });\n    }\n\n    this.plugins.push(plugin);\n    \n    // Sort plugins by priority (highest first)\n    this.plugins.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n    logger.info(`Registered plugin: ${plugin.name}`);\n  }\n\n  /**\n   * Get configuration for a specific plugin\n   */\n  getPluginConfig(pluginName: string): any {\n    return this.pluginConfigs.get(pluginName);\n  }\n\n  /**\n   * Set configuration for a specific plugin\n   */\n  setPluginConfig(pluginName: string, config: any): void {\n    const plugin = this.plugins.find(p => p.name === pluginName);\n    if (!plugin) {\n      throw new Error(`Plugin \"${pluginName}\" not found`);\n    }\n\n    // Validate config if plugin has a validator\n    if (plugin.validateConfig) {\n      const result = plugin.validateConfig(config);\n      if (!result.valid) {\n        throw new Error(`Invalid config for plugin ${pluginName}: ${result.errors?.join(', ')}`);\n      }\n    }\n\n    this.pluginConfigs.set(pluginName, config);\n  }\n\n  /**\n   * Get all registered plugins\n   */\n  getPlugins(): Plugin[] {\n    return [...this.plugins];\n  }\n\n  /**\n   * Apply all plugin intent patterns to the existing patterns\n   */\n  applyPluginIntents(existingPatterns: IntentPattern[]): IntentPattern[] {\n    let patterns = [...existingPatterns];\n\n    for (const plugin of this.plugins) {\n      try {\n        if (plugin.registerIntents) {\n          patterns = plugin.registerIntents(patterns);\n        }\n      } catch (error) {\n        logger.error(`Error applying intents from plugin \"${plugin.name}\":`, error);\n      }\n    }\n\n    return patterns;\n  }\n\n  /**\n   * Get all valid types (including plugin-provided ones)\n   */\n  getValidTypes(): string[] {\n    // Start with core types\n    const types = new Set(this.registeredTypes);\n    \n    // Add plugin-provided types\n    for (const plugin of this.plugins) {\n      try {\n        if (plugin.registerTypes) {\n          const pluginTypes = plugin.registerTypes();\n          pluginTypes.forEach(type => types.add(type));\n        }\n      } catch (error) {\n        logger.error(`Error getting types from plugin \"${plugin.name}\":`, error);\n      }\n    }\n\n    // Always ensure 'issue' is included\n    types.add('issue');\n\n    return Array.from(types);\n  }\n\n  /**\n   * Get all valid active states (including plugin-provided ones)\n   */\n  getValidActiveStates(): string[] {\n    const states = new Set(this.registeredActiveStates);\n    \n    for (const plugin of this.plugins) {\n      try {\n        if (plugin.registerActiveStates) {\n          plugin.registerActiveStates().forEach(state => states.add(state));\n        }\n      } catch (error) {\n        logger.error(`Error getting active states from plugin \"${plugin.name}\":`, error);\n      }\n    }\n\n    return Array.from(states);\n  }\n\n  /**\n   * Get all valid inactive reasons (including plugin-provided ones)\n   */\n  getValidInactiveReasons(): string[] {\n    const reasons = new Set(this.registeredInactiveReasons);\n    \n    for (const plugin of this.plugins) {\n      try {\n        if (plugin.registerInactiveReasons) {\n          plugin.registerInactiveReasons().forEach(reason => reasons.add(reason));\n        }\n      } catch (error) {\n        logger.error(`Error getting inactive reasons from plugin \"${plugin.name}\":`, error);\n      }\n    }\n\n    return Array.from(reasons);\n  }\n\n  /**\n   * Get all valid states (both active states and inactive reasons)\n   */\n  getValidStates(): string[] {\n    return [\n      ...this.getValidActiveStates(),\n      ...this.getValidInactiveReasons()\n    ];\n  }\n\n  /**\n   * Run validation hooks from all plugins\n   */\n  validateMetadata(metadata: FrontmatterMetadata): ValidationResult {\n    const result: ValidationResult = {\n      valid: true,\n      errors: [],\n      warnings: []\n    };\n\n    for (const plugin of this.plugins) {\n      try {\n        if (plugin.validateMetadata) {\n          const pluginResult = plugin.validateMetadata(metadata);\n          \n          // Merge warnings\n          if (pluginResult.warnings) {\n            result.warnings.push(...pluginResult.warnings);\n          }\n\n          // If plugin validation fails, merge errors and mark as invalid\n          if (!pluginResult.valid) {\n            result.valid = false;\n            if (pluginResult.errors) {\n              result.errors.push(...pluginResult.errors);\n            }\n          }\n        }\n      } catch (error: any) {\n        logger.error(`Error validating metadata in plugin \"${plugin.name}\":`, error);\n        result.warnings.push(`Plugin ${plugin.name} validation error: ${error.message}`);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Run post-processing hooks from all plugins\n   */\n  processIntent(intent: InterpretedIntent): InterpretedIntent {\n    let processedIntent = { ...intent };\n\n    for (const plugin of this.plugins) {\n      try {\n        if (plugin.postInterpretIntent) {\n          processedIntent = plugin.postInterpretIntent(processedIntent);\n        }\n      } catch (error) {\n        logger.error(`Error processing intent in plugin \"${plugin.name}\":`, error);\n      }\n    }\n\n    return processedIntent;\n  }\n\n  /**\n   * Register core types that plugins can extend\n   */\n  registerCoreTypes(types: string[]): void {\n    // Add each core type to existing types\n    types.forEach(type => this.registeredTypes.add(type));\n  }\n\n  /**\n   * Register core active states that plugins can extend\n   */\n  registerCoreActiveStates(states: string[]): void {\n    states.forEach(state => this.registeredActiveStates.add(state));\n  }\n\n  /**\n   * Register core inactive reasons that plugins can extend\n   */\n  registerCoreInactiveReasons(reasons: string[]): void {\n    reasons.forEach(reason => this.registeredInactiveReasons.add(reason));\n  }\n\n  /**\n   * Collects all plugin commands from every plugin in the order of their priority.\n   */\n  getAllCommands(): PluginCommand[] {\n    logger.debug('Getting all commands:', this.commands);\n    return this.commands;\n  }\n} "]}