{"version":3,"sources":["../src/core/templates.ts","../src/core/errors.ts","../src/core/resilience.ts","../src/utils/http-errors.ts","../src/providers/base/Provider.ts","../src/providers/email/SmtpProvider.ts","../src/providers/discord/DiscordWebhookProvider.ts","../src/providers/rocketchat/RocketChatWebhookProvider.ts","../src/providers/slack/SlackWebhookProvider.ts","../src/providers/telegram/TelegramBotProvider.ts","../src/providers/http/JsonWebhookProvider.ts","../src/providers/ntfy/NtfyProvider.ts","../src/providers/gotify/GotifyProvider.ts","../src/providers/gchat/GoogleChatProvider.ts","../src/providers/mattermost/MattermostProvider.ts","../src/providers/msteams/MSTeamsProvider.ts","../src/providers/onesignal/OneSignalProvider.ts","../src/providers/pushover/PushoverProvider.ts","../src/providers/twilio/TwilioProvider.ts","../src/providers/fire/FireProvider.ts","../src/providers/index.ts","../src/config/ConfigLoader.ts","../src/config/env.ts","../src/config/tags.ts","../src/utils/logger.ts","../src/core/FireSignal.ts","../src/utils/stdin.ts","../src/core/UrlParser.ts","../src/core/UrlValidator.ts","../src/cli/index.ts"],"names":["path","text","colonIndex","config"],"mappings":"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","file":"cli.mjs","sourcesContent":["import Handlebars from 'handlebars';\nimport { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport type { FSMessage } from './Message';\n\n/**\n * Template definition structure.\n */\nexport interface FSTemplate {\n  /** Unique template name for reference. */\n  name: string;\n  /** Path to .hbs file OR inline template string. */\n  source: string;\n  /** Whether source is inline content (true) or file path (false). */\n  inline?: boolean;\n}\n\n/**\n * Compiled template cache entry.\n */\ninterface CompiledTemplate {\n  title?: Handlebars.TemplateDelegate;\n  body: Handlebars.TemplateDelegate;\n}\n\n/**\n * TemplateManager handles registration, loading, and rendering of message templates.\n *\n * Templates use Handlebars syntax for variable substitution.\n *\n * @example\n * ```typescript\n * const manager = new TemplateManager();\n *\n * // Register from file\n * await manager.register('welcome', 'templates/welcome.hbs');\n *\n * // Register inline\n * manager.registerInline('alert', {\n *   title: 'Alert: {{severity}}',\n *   body: 'Service {{service}} is {{status}}.',\n * });\n *\n * // Render\n * const message = await manager.render('welcome', { name: 'John' });\n * ```\n */\nexport class TemplateManager {\n  private templates: Map<string, CompiledTemplate> = new Map();\n\n  /**\n   * Register a template from a file path.\n   *\n   * File format (JSON or YAML-like):\n   * ```\n   * ---\n   * title: Welcome, {{name}}!\n   * ---\n   * Hello {{name}},\n   *\n   * Thank you for joining us!\n   * ```\n   *\n   * @param name - Unique template identifier.\n   * @param filePath - Path to the template file (.hbs or .md).\n   */\n  async register(name: string, filePath: string): Promise<void> {\n    if (!existsSync(filePath)) {\n      throw new Error(`Template file not found: ${filePath}`);\n    }\n\n    const content = await readFile(filePath, 'utf-8');\n    const { title, body } = this.parseTemplateFile(content);\n\n    this.templates.set(name, {\n      title: title ? Handlebars.compile(title) : undefined,\n      body: Handlebars.compile(body),\n    });\n  }\n\n  /**\n   * Register a template inline (no file).\n   *\n   * @param name - Unique template identifier.\n   * @param template - Object with title (optional) and body template strings.\n   */\n  registerInline(\n    name: string,\n    template: { title?: string; body: string }\n  ): void {\n    this.templates.set(name, {\n      title: template.title ? Handlebars.compile(template.title) : undefined,\n      body: Handlebars.compile(template.body),\n    });\n  }\n\n  /**\n   * Check if a template is registered.\n   */\n  has(name: string): boolean {\n    return this.templates.has(name);\n  }\n\n  /**\n   * Render a template with data.\n   *\n   * @param name - Template name to render.\n   * @param data - Data object for variable substitution.\n   * @returns FSMessage with rendered title and body.\n   */\n  render(name: string, data: Record<string, unknown> = {}): FSMessage {\n    const template = this.templates.get(name);\n    if (!template) {\n      throw new Error(`Template not found: ${name}`);\n    }\n\n    return {\n      title: template.title ? template.title(data) : undefined,\n      body: template.body(data),\n    };\n  }\n\n  /**\n   * Parse a template file with frontmatter-style title.\n   *\n   * Supported formats:\n   * 1. Frontmatter (---):\n   *    ```\n   *    ---\n   *    title: Hello {{name}}\n   *    ---\n   *    Body content here.\n   *    ```\n   *\n   * 2. Plain body (no title):\n   *    ```\n   *    Just body content.\n   *    ```\n   */\n  private parseTemplateFile(content: string): { title?: string; body: string } {\n    const frontmatterRegex = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n    const match = content.match(frontmatterRegex);\n\n    if (match) {\n      const frontmatter = match[1] ?? '';\n      const body = match[2]?.trim() ?? '';\n\n      // Parse title from frontmatter\n      const titleMatch = frontmatter.match(/^title:\\s*(.+)$/m);\n      const title = titleMatch?.[1]?.trim();\n\n      return { title, body };\n    }\n\n    // No frontmatter, entire content is body\n    return { body: content.trim() };\n  }\n\n  /**\n   * List all registered template names.\n   */\n  list(): string[] {\n    return Array.from(this.templates.keys());\n  }\n\n  /**\n   * Clear all registered templates.\n   */\n  clear(): void {\n    this.templates.clear();\n  }\n}\n","/**\n * Custom error types for fire-signal.\n */\n\n/**\n * Base error class for all fire-signal errors.\n */\nexport class FSError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string\n  ) {\n    super(message);\n    this.name = 'FSError';\n    Error.captureStackTrace?.(this, this.constructor);\n  }\n}\n\n/**\n * Error thrown when a provider fails to send a notification.\n */\nexport class FSProviderError extends FSError {\n  constructor(\n    message: string,\n    public readonly providerId: string,\n    public readonly cause?: Error\n  ) {\n    super(message, 'PROVIDER_ERROR');\n    this.name = 'FSProviderError';\n  }\n}\n\n/**\n * Error thrown when parsing a notification URL fails.\n */\nexport class FSParseError extends FSError {\n  constructor(\n    message: string,\n    public readonly url: string\n  ) {\n    super(message, 'PARSE_ERROR');\n    this.name = 'FSParseError';\n  }\n}\n\n/**\n * Error thrown when loading configuration fails.\n */\nexport class FSConfigError extends FSError {\n  constructor(\n    message: string,\n    public readonly path?: string\n  ) {\n    super(message, 'CONFIG_ERROR');\n    this.name = 'FSConfigError';\n  }\n}\n\n/**\n * Error thrown when a required provider is not found.\n */\nexport class FSProviderNotFoundError extends FSError {\n  constructor(public readonly schema: string) {\n    super(`No provider found for schema: ${schema}`, 'PROVIDER_NOT_FOUND');\n    this.name = 'FSProviderNotFoundError';\n  }\n}\n\n/**\n * Error thrown when URL validation fails with specific field errors.\n */\nexport class FSValidationError extends FSError {\n  constructor(\n    message: string,\n    public readonly field: string,\n    public readonly url: string,\n    public readonly suggestion?: string\n  ) {\n    super(message, 'VALIDATION_ERROR');\n    this.name = 'FSValidationError';\n  }\n}\n\n/**\n * Error thrown when credentials are missing or invalid.\n */\nexport class FSCredentialsError extends FSError {\n  constructor(\n    message: string,\n    public readonly schema: string,\n    public readonly missingFields?: string[]\n  ) {\n    super(message, 'CREDENTIALS_ERROR');\n    this.name = 'FSCredentialsError';\n  }\n}\n\n/**\n * Error thrown when a network/HTTP request fails.\n */\nexport class FSNetworkError extends FSError {\n  constructor(\n    message: string,\n    public readonly statusCode?: number,\n    public readonly providerId?: string\n  ) {\n    super(message, 'NETWORK_ERROR');\n    this.name = 'FSNetworkError';\n  }\n\n  /**\n   * Creates a human-readable error from HTTP status code.\n   */\n  static fromStatus(status: number, providerId?: string): FSNetworkError {\n    const messages: Record<number, string> = {\n      400: 'Bad Request - Check your message format or URL parameters',\n      401: 'Unauthorized - Token expired or invalid credentials',\n      403: 'Forbidden - Access denied to this resource',\n      404: 'Not Found - Webhook URL is invalid or deleted',\n      429: 'Rate Limited - Too many requests, try again later',\n      500: 'Internal Server Error - Provider service issue',\n      502: 'Bad Gateway - Provider service temporarily unavailable',\n      503: 'Service Unavailable - Provider is down for maintenance',\n      504: 'Gateway Timeout - Server did not respond in time',\n    };\n    const msg = messages[status] ?? `HTTP Error ${status}`;\n    return new FSNetworkError(`[${status}] ${msg}`, status, providerId);\n  }\n}\n\n/**\n * Error thrown when platform ingestion/evaluate request fails.\n */\nexport class FSPlatformError extends FSError {\n  constructor(\n    message: string,\n    public readonly category:\n      | 'auth'\n      | 'validation'\n      | 'transient'\n      | 'network'\n      | 'configuration',\n    public readonly statusCode?: number,\n    public readonly retryable: boolean = false,\n    public readonly details?: string\n  ) {\n    super(message, 'PLATFORM_ERROR');\n    this.name = 'FSPlatformError';\n  }\n}\n\n/**\n * Circuit breaker states.\n */\nexport enum CircuitState {\n  /** Normal operation, requests allowed. */\n  CLOSED = 'CLOSED',\n  /** Failing, requests blocked. */\n  OPEN = 'OPEN',\n  /** Testing if service recovered. */\n  HALF_OPEN = 'HALF_OPEN',\n}\n\n/**\n * Error thrown when resilience controls block a request.\n */\nexport class ResilienceError extends FSError {\n  constructor(\n    message: string,\n    public readonly reason: 'rate_limit' | 'circuit_breaker',\n    public readonly providerId: string,\n    public readonly retryAfterMs?: number\n  ) {\n    super(message, 'RESILIENCE_ERROR');\n    this.name = 'ResilienceError';\n  }\n}\n","import { CircuitState, ResilienceError } from './errors';\n\n/**\n * Resilience configuration options.\n */\nexport interface ResilienceConfig {\n  /**\n   * Rate limiting configuration.\n   */\n  rateLimit?: {\n    /** Maximum number of requests allowed. */\n    requests: number;\n    /** Time period in milliseconds. */\n    periodMs: number;\n  };\n\n  /**\n   * Circuit breaker configuration.\n   */\n  circuitBreaker?: {\n    /** Number of consecutive failures before opening the circuit. */\n    failureThreshold: number;\n    /** Time in milliseconds before attempting to close the circuit. */\n    resetTimeoutMs: number;\n  };\n}\n\n/**\n * Token Bucket Rate Limiter.\n *\n * Controls the rate of requests using a token bucket algorithm.\n * Tokens are replenished over time up to a maximum capacity.\n */\nexport class TokenBucketLimiter {\n  private tokens: number;\n  private lastRefill: number;\n  private readonly capacity: number;\n  private readonly refillRate: number; // tokens per ms\n\n  /**\n   * @param requests - Maximum number of requests (bucket capacity).\n   * @param periodMs - Time period for refill in milliseconds.\n   */\n  constructor(requests: number, periodMs: number) {\n    this.capacity = requests;\n    this.tokens = requests;\n    this.refillRate = requests / periodMs;\n    this.lastRefill = Date.now();\n  }\n\n  /**\n   * Try to acquire a token for a request.\n   *\n   * @returns true if token acquired, false if rate limited.\n   */\n  tryAcquire(): boolean {\n    this.refill();\n\n    if (this.tokens >= 1) {\n      this.tokens -= 1;\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get time in ms until next token is available.\n   */\n  getWaitTime(): number {\n    this.refill();\n    if (this.tokens >= 1) return 0;\n    return Math.ceil((1 - this.tokens) / this.refillRate);\n  }\n\n  private refill(): void {\n    const now = Date.now();\n    const elapsed = now - this.lastRefill;\n    const tokensToAdd = elapsed * this.refillRate;\n    this.tokens = Math.min(this.capacity, this.tokens + tokensToAdd);\n    this.lastRefill = now;\n  }\n}\n\n/**\n * Circuit Breaker pattern implementation.\n *\n * Prevents cascading failures by temporarily stopping requests\n * to a failing service.\n *\n * States:\n * - CLOSED: Normal operation, requests allowed.\n * - OPEN: Failing, requests blocked.\n * - HALF_OPEN: Testing if service recovered.\n */\nexport class CircuitBreakerImpl {\n  private state: CircuitState = CircuitState.CLOSED;\n  private failures: number = 0;\n  private lastFailureTime: number = 0;\n  private readonly failureThreshold: number;\n  private readonly resetTimeoutMs: number;\n\n  constructor(failureThreshold: number, resetTimeoutMs: number) {\n    this.failureThreshold = failureThreshold;\n    this.resetTimeoutMs = resetTimeoutMs;\n  }\n\n  /**\n   * Check if request is allowed through the circuit.\n   */\n  isAllowed(): boolean {\n    if (this.state === CircuitState.CLOSED) {\n      return true;\n    }\n\n    if (this.state === CircuitState.OPEN) {\n      // Check if reset timeout has elapsed\n      if (Date.now() - this.lastFailureTime >= this.resetTimeoutMs) {\n        this.state = CircuitState.HALF_OPEN;\n        return true;\n      }\n      return false;\n    }\n\n    // HALF_OPEN: allow one request to test\n    return true;\n  }\n\n  /**\n   * Record a successful request.\n   */\n  recordSuccess(): void {\n    if (this.state === CircuitState.HALF_OPEN) {\n      // Service recovered, close the circuit\n      this.state = CircuitState.CLOSED;\n    }\n    this.failures = 0;\n  }\n\n  /**\n   * Record a failed request.\n   */\n  recordFailure(): void {\n    this.failures++;\n    this.lastFailureTime = Date.now();\n\n    if (this.state === CircuitState.HALF_OPEN) {\n      // Still failing, reopen\n      this.state = CircuitState.OPEN;\n      return;\n    }\n\n    if (this.failures >= this.failureThreshold) {\n      this.state = CircuitState.OPEN;\n    }\n  }\n\n  /**\n   * Get current circuit state.\n   */\n  getState(): CircuitState {\n    // Update state based on timeout\n    if (\n      this.state === CircuitState.OPEN &&\n      Date.now() - this.lastFailureTime >= this.resetTimeoutMs\n    ) {\n      this.state = CircuitState.HALF_OPEN;\n    }\n    return this.state;\n  }\n\n  /**\n   * Reset the circuit to closed state.\n   */\n  reset(): void {\n    this.state = CircuitState.CLOSED;\n    this.failures = 0;\n    this.lastFailureTime = 0;\n  }\n}\n\n/**\n * Manages resilience features (rate limiting + circuit breaker) per provider.\n */\nexport class ResilienceManager {\n  private rateLimiters: Map<string, TokenBucketLimiter> = new Map();\n  private circuitBreakers: Map<string, CircuitBreakerImpl> = new Map();\n  private config: ResilienceConfig;\n\n  constructor(config: ResilienceConfig = {}) {\n    this.config = config;\n  }\n\n  /**\n   * Check if a request to a provider is allowed.\n   *\n   * @param providerId - Provider identifier.\n   * @returns true if allowed, throws ResilienceError if blocked.\n   */\n  checkAllowed(providerId: string): void {\n    // Check circuit breaker first\n    if (this.config.circuitBreaker) {\n      const cb = this.getCircuitBreaker(providerId);\n      if (!cb.isAllowed()) {\n        throw new ResilienceError(\n          `Circuit breaker open for provider '${providerId}'`,\n          'circuit_breaker',\n          providerId\n        );\n      }\n    }\n\n    // Check rate limiter\n    if (this.config.rateLimit) {\n      const limiter = this.getRateLimiter(providerId);\n      if (!limiter.tryAcquire()) {\n        throw new ResilienceError(\n          `Rate limit exceeded for provider '${providerId}'`,\n          'rate_limit',\n          providerId,\n          limiter.getWaitTime()\n        );\n      }\n    }\n  }\n\n  /**\n   * Record a successful request.\n   */\n  recordSuccess(providerId: string): void {\n    if (this.config.circuitBreaker) {\n      const cb = this.getCircuitBreaker(providerId);\n      cb.recordSuccess();\n    }\n  }\n\n  /**\n   * Record a failed request.\n   */\n  recordFailure(providerId: string): void {\n    if (this.config.circuitBreaker) {\n      const cb = this.getCircuitBreaker(providerId);\n      cb.recordFailure();\n    }\n  }\n\n  /**\n   * Get circuit state for a provider.\n   */\n  getCircuitState(providerId: string): CircuitState | undefined {\n    if (!this.config.circuitBreaker) return undefined;\n    return this.getCircuitBreaker(providerId).getState();\n  }\n\n  private getRateLimiter(providerId: string): TokenBucketLimiter {\n    if (!this.rateLimiters.has(providerId)) {\n      const { requests, periodMs } = this.config.rateLimit!;\n      this.rateLimiters.set(\n        providerId,\n        new TokenBucketLimiter(requests, periodMs)\n      );\n    }\n    return this.rateLimiters.get(providerId)!;\n  }\n\n  private getCircuitBreaker(providerId: string): CircuitBreakerImpl {\n    if (!this.circuitBreakers.has(providerId)) {\n      const { failureThreshold, resetTimeoutMs } = this.config.circuitBreaker!;\n      this.circuitBreakers.set(\n        providerId,\n        new CircuitBreakerImpl(failureThreshold, resetTimeoutMs)\n      );\n    }\n    return this.circuitBreakers.get(providerId)!;\n  }\n}\n\nexport { CircuitState };\n","/**\n * HTTP error utilities for fire-signal.\n */\n\n/**\n * Human-readable descriptions for common HTTP status codes.\n */\nconst HTTP_ERROR_DESCRIPTIONS: Record<number, string> = {\n  400: 'Bad Request - Invalid payload or parameters',\n  401: 'Unauthorized - Token expired or invalid credentials',\n  403: 'Forbidden - Access denied or insufficient permissions',\n  404: 'Not Found - Webhook URL is invalid or deleted',\n  405: 'Method Not Allowed - Incorrect HTTP method',\n  408: 'Request Timeout - Server took too long to respond',\n  429: 'Too Many Requests - Rate limited, slow down',\n  500: 'Internal Server Error - Server-side issue',\n  502: 'Bad Gateway - Upstream server error',\n  503: 'Service Unavailable - Server is down or overloaded',\n  504: 'Gateway Timeout - Server did not respond in time',\n};\n\n/**\n * Gets a human-readable description for an HTTP status code.\n *\n * @param status - HTTP status code\n * @param responseText - Optional response body text\n * @returns Descriptive error message including the status code\n */\nexport function getHttpErrorDescription(\n  status: number,\n  responseText?: string\n): string {\n  const description =\n    HTTP_ERROR_DESCRIPTIONS[status] ?? `Unknown Error (HTTP ${status})`;\n  const codePrefix = `[${status}]`;\n\n  if (responseText && responseText.trim()) {\n    return `${codePrefix} ${description}\\nDetails: ${responseText.substring(0, 200)}`;\n  }\n\n  return `${codePrefix} ${description}`;\n}\n","import type { FSMessage } from '../../core/Message';\nimport { getHttpErrorDescription } from '../../utils/http-errors';\n\n/**\n * Represents a parsed notification URL.\n */\nexport interface FSParsedUrl {\n  /** The URL schema/protocol (e.g., 'mailto', 'discord', 'slack'). */\n  schema: string;\n  /** Hostname portion of the URL. */\n  hostname?: string;\n  /** Port number if specified. */\n  port?: number;\n  /** Username for authentication. */\n  username?: string;\n  /** Password for authentication. */\n  password?: string;\n  /** Path portion of the URL (without leading slash). */\n  path?: string;\n  /** Path split into segments. */\n  segments: string[];\n  /** Query parameters parsed from the URL. */\n  params: Record<string, string | string[]>;\n  /** The original raw URL string. */\n  raw: string;\n}\n\n/**\n * Context provided to a provider when sending a notification.\n */\nexport interface FSProviderContext {\n  url: string;\n  parsed: FSParsedUrl;\n  tags?: string[];\n  audience?: string[];\n  segmentId?: string;\n  templateKey?: string;\n}\n\n/**\n * Result of a provider send operation.\n */\nexport interface FSProviderResult {\n  success: boolean;\n  providerId: string;\n  raw?: unknown;\n  error?: Error;\n  /** Number of attempts made (1 = no retries, >1 = retried). */\n  attempts?: number;\n  /** Total duration including retries in milliseconds. */\n  durationMs?: number;\n  /** Whether this result came after retrying. */\n  retried?: boolean;\n}\n\n/**\n * Interface for notification providers.\n */\nexport interface FSProvider {\n  /** Unique identifier for this provider. */\n  id: string;\n  /** URL schemas this provider handles (e.g., ['discord']). */\n  schemas: string[];\n  /** Parses a URL into components specific to this provider. */\n  parseUrl(raw: string): FSParsedUrl;\n  /** Sends a notification message. */\n  send(message: FSMessage, ctx: FSProviderContext): Promise<FSProviderResult>;\n}\n\n/**\n * Base class for notification providers with common helper methods.\n */\nexport abstract class BaseProvider implements FSProvider {\n  abstract readonly id: string;\n  abstract readonly schemas: string[];\n\n  abstract parseUrl(raw: string): FSParsedUrl;\n  abstract send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult>;\n\n  /** Creates a success result. */\n  protected success(raw?: unknown): FSProviderResult {\n    return { success: true, providerId: this.id, raw };\n  }\n\n  /** Creates a failure result. */\n  protected failure(error: Error, raw?: unknown): FSProviderResult {\n    return { success: false, providerId: this.id, error, raw };\n  }\n\n  /**\n   * Creates an HTTP failure result with human-readable error description.\n   * Use this for API/webhook errors.\n   *\n   * @param providerName - Display name for the provider (e.g., \"Discord\", \"Slack\")\n   * @param response - The HTTP Response object\n   * @param responseText - Optional response body text\n   */\n  protected async httpFailure(\n    providerName: string,\n    response: Response,\n    responseText?: string\n  ): Promise<FSProviderResult> {\n    const text = responseText ?? (await response.text().catch(() => ''));\n    const errorDetails = text.trim() || response.statusText || '';\n    const errorDesc = getHttpErrorDescription(response.status, errorDetails);\n    return this.failure(new Error(`${providerName}: ${errorDesc}`), {\n      status: response.status,\n      statusText: response.statusText,\n      text,\n    });\n  }\n\n  /** Gets the first value from a param that may be an array. */\n  protected getParam(value: string | string[] | undefined): string | undefined {\n    if (Array.isArray(value)) return value[0];\n    return value;\n  }\n\n  /** Extracts the schema from a URL string. */\n  protected extractSchema(url: string): string {\n    const match = url.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):/);\n    return match?.[1]?.toLowerCase() ?? '';\n  }\n\n  /** Parses a query string into a params object. */\n  protected parseQueryParams(\n    queryString: string\n  ): Record<string, string | string[]> {\n    const params: Record<string, string | string[]> = {};\n    if (!queryString) return params;\n\n    const searchParams = new URLSearchParams(queryString);\n    searchParams.forEach((value, key) => {\n      const existing = params[key];\n      if (existing !== undefined) {\n        if (Array.isArray(existing)) {\n          existing.push(value);\n        } else {\n          params[key] = [existing, value];\n        }\n      } else {\n        params[key] = value;\n      }\n    });\n    return params;\n  }\n}\n","import nodemailer from 'nodemailer';\nimport type { Transporter, SentMessageInfo } from 'nodemailer';\nimport {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * SMTP Email Provider.\n *\n * URL Format: mailto://user:pass@smtp.example.com:port\n *\n * Query params:\n *  - to: Recipient email(s), comma-separated\n *  - from: Sender email (optional, defaults to user)\n *  - cc: CC recipients\n *  - bcc: BCC recipients\n *  - secure: Use TLS (true/false, default based on port)\n */\nexport class SmtpProvider extends BaseProvider {\n  readonly id = 'smtp';\n  readonly schemas = ['mailto', 'mailtos'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n\n    let username: string | undefined;\n    let password: string | undefined;\n    let hostname: string | undefined;\n    let port: number | undefined;\n\n    if (pathPart?.includes('@')) {\n      const [authPart, hostPart] = pathPart.split('@');\n      if (authPart?.includes(':')) {\n        const [user, pass] = authPart.split(':');\n        username = user ? decodeURIComponent(user) : undefined;\n        password = pass ? decodeURIComponent(pass) : undefined;\n      } else {\n        username = authPart ? decodeURIComponent(authPart) : undefined;\n      }\n\n      if (hostPart?.includes(':')) {\n        const colonIndex = hostPart.lastIndexOf(':');\n        const potentialPort = hostPart.slice(colonIndex + 1);\n        if (/^\\d+$/.test(potentialPort)) {\n          hostname = hostPart.slice(0, colonIndex);\n          port = parseInt(potentialPort, 10);\n        } else {\n          hostname = hostPart;\n        }\n      } else {\n        hostname = hostPart;\n      }\n    } else {\n      hostname = pathPart;\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      username,\n      password,\n      segments: [],\n      path: undefined,\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    if (!parsed.hostname) {\n      return this.failure(\n        new Error(\n          'Invalid mailto URL. Expected: mailto://user:pass@smtp.example.com'\n        )\n      );\n    }\n\n    const to = this.getParam(parsed.params.to);\n    if (!to) {\n      return this.failure(new Error('Missing \"to\" parameter in mailto URL'));\n    }\n\n    const defaultPort = parsed.schema === 'mailtos' ? 465 : 587;\n    const port = parsed.port ?? defaultPort;\n    const secure = parsed.schema === 'mailtos' || port === 465;\n\n    const transporter: Transporter = nodemailer.createTransport({\n      host: parsed.hostname,\n      port,\n      secure,\n      auth:\n        parsed.username && parsed.password\n          ? { user: parsed.username, pass: parsed.password }\n          : undefined,\n    });\n\n    const from =\n      this.getParam(parsed.params.from) ??\n      parsed.username ??\n      'noreply@fire-signal.local';\n    const cc = this.getParam(parsed.params.cc);\n    const bcc = this.getParam(parsed.params.bcc);\n\n    const mailOptions: {\n      from: string;\n      to: string;\n      cc?: string;\n      bcc?: string;\n      subject: string;\n      text: string;\n      html: string;\n      attachments?: Array<{\n        filename?: string;\n        content?: Buffer | string;\n        path?: string;\n        contentType?: string;\n      }>;\n    } = {\n      from,\n      to,\n      cc,\n      bcc,\n      subject: message.title ?? 'Notification from Fire-Signal',\n      text: message.body,\n      html: this.formatHtml(message),\n    };\n\n    // Add attachments if present\n    if (message.attachments && message.attachments.length > 0) {\n      mailOptions.attachments = message.attachments.map((att) => {\n        if (att.content) {\n          return {\n            filename: att.name,\n            content: att.content,\n            contentType: att.contentType,\n          };\n        } else if (att.url) {\n          return {\n            filename: att.name ?? att.url.split('/').pop(),\n            path: att.url,\n            contentType: att.contentType,\n          };\n        }\n        return { filename: att.name };\n      });\n    }\n\n    try {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n      const info: SentMessageInfo = await transporter.sendMail(mailOptions);\n      return this.success({\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        messageId: String(info.messageId ?? ''),\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        accepted: info.accepted as string[] | undefined,\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        rejected: info.rejected as string[] | undefined,\n      });\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  private formatHtml(message: FSMessage): string {\n    const escape = (text: string) =>\n      text\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&#039;')\n        .replace(/\\n/g, '<br>');\n\n    if (message.title) {\n      return `<h2>${escape(message.title)}</h2><p>${escape(message.body)}</p>`;\n    }\n    return `<p>${escape(message.body)}</p>`;\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\nimport { getHttpErrorDescription } from '../../utils/http-errors';\n\n/**\n * Discord Webhook Provider.\n *\n * URL Format: discord://webhookId/webhookToken\n *\n * Query params:\n *  - avatar_url: URL to avatar image\n *  - username: Bot username\n *  - tts: Text-to-speech (true/false)\n */\nexport class DiscordWebhookProvider extends BaseProvider {\n  readonly id = 'discord';\n  readonly schemas = ['discord'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    return {\n      schema,\n      hostname: segments[0],\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const webhookId = parsed.hostname;\n    const webhookToken = parsed.segments[0];\n\n    if (!webhookId || !webhookToken) {\n      return this.failure(\n        new Error(\n          'Invalid Discord URL. Expected: discord://webhookId/webhookToken'\n        )\n      );\n    }\n\n    const webhookUrl = `https://discord.com/api/webhooks/${webhookId}/${webhookToken}`;\n    const embeds: unknown[] = [];\n    let content = this.formatContent(message);\n\n    if (message.actions && message.actions.length > 0) {\n      const links = message.actions\n        .map((action) => {\n          const icon =\n            action.style === 'danger'\n              ? '🔴'\n              : action.style === 'primary'\n                ? '🔵'\n                : '🔗';\n          return `${icon} [${action.label}](${action.url})`;\n        })\n        .join('  ');\n\n      embeds.push({\n        title: message.title,\n        description: message.body + '\\n\\n' + links,\n        color: 0x5865f2, // Blurple\n      });\n\n      content = '';\n    }\n\n    const payload: Record<string, unknown> = {\n      content: content || undefined,\n    };\n\n    if (embeds.length > 0) {\n      payload.embeds = embeds;\n    }\n\n    const avatarUrl = this.getParam(parsed.params.avatar_url);\n    const username = this.getParam(parsed.params.username);\n    const tts = this.getParam(parsed.params.tts);\n\n    if (avatarUrl) payload.avatar_url = avatarUrl;\n    if (username) payload.username = username;\n    if (tts === 'true') payload.tts = true;\n\n    try {\n      let response: Response;\n\n      // Check if we have attachments\n      if (message.attachments && message.attachments.length > 0) {\n        // Use multipart form-data for attachments\n        const formData = new FormData();\n        formData.append('payload_json', JSON.stringify(payload));\n\n        for (let i = 0; i < message.attachments.length; i++) {\n          const att = message.attachments[i];\n          if (!att) continue;\n\n          let blob: Blob;\n\n          if (att.content) {\n            // Content provided directly\n            const buffer =\n              typeof att.content === 'string'\n                ? Buffer.from(att.content, 'base64')\n                : att.content;\n            blob = new Blob([buffer], { type: att.contentType });\n          } else if (att.url) {\n            // Fetch from URL\n            const fetchRes = await fetch(att.url);\n            blob = await fetchRes.blob();\n          } else {\n            continue;\n          }\n\n          formData.append(`files[${i}]`, blob, att.name ?? `file${i}`);\n        }\n\n        response = await fetch(webhookUrl, {\n          method: 'POST',\n          headers: { 'User-Agent': 'fire-signal/0.1.0' },\n          body: formData,\n        });\n      } else {\n        // No attachments, use JSON\n        response = await fetch(webhookUrl, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'User-Agent': 'fire-signal/0.1.0',\n          },\n          body: JSON.stringify(payload),\n        });\n      }\n\n      if (!response.ok) {\n        const text = await response.text().catch(() => '');\n        const errorDetails = text.trim() || response.statusText || '';\n        const errorDesc = getHttpErrorDescription(\n          response.status,\n          errorDetails\n        );\n        return this.failure(new Error(`Discord: ${errorDesc}`), {\n          status: response.status,\n          statusText: response.statusText,\n          text,\n        });\n      }\n\n      return this.success({ status: response.status });\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  private formatContent(message: FSMessage): string {\n    if (message.title) return `**${message.title}**\\n${message.body}`;\n    return message.body;\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\nimport { getHttpErrorDescription } from '../../utils/http-errors';\n\n/**\n * Rocket.Chat Webhook Provider.\n *\n * URL Format: rocketchat://hostname/webhookToken\n *\n * Query params:\n *  - channel: Channel to post to (e.g., #general or @username)\n *  - alias: Bot alias/username\n *  - avatar: URL to avatar image\n *  - emoji: Emoji to use as avatar (e.g., :rocket:)\n */\nexport class RocketChatWebhookProvider extends BaseProvider {\n  readonly id = 'rocketchat';\n  readonly schemas = ['rocketchat', 'rocket'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    const firstSegment = segments[0] ?? '';\n    let hostname = firstSegment;\n    let port: number | undefined;\n\n    const colonIndex = firstSegment.lastIndexOf(':');\n    if (colonIndex !== -1) {\n      const potentialPort = firstSegment.slice(colonIndex + 1);\n      if (/^\\d+$/.test(potentialPort)) {\n        hostname = firstSegment.slice(0, colonIndex);\n        port = parseInt(potentialPort, 10);\n      }\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    if (!parsed.hostname) {\n      return this.failure(\n        new Error(\n          'Invalid Rocket.Chat URL. Expected: rocketchat://hostname/webhookToken'\n        )\n      );\n    }\n\n    const port = parsed.port ? `:${parsed.port}` : '';\n    const path = parsed.path || '';\n    const webhookUrl = `https://${parsed.hostname}${port}/hooks/${path}`;\n\n    const payload: Record<string, unknown> = {\n      text: this.formatContent(message),\n    };\n\n    const channel = this.getParam(parsed.params.channel);\n    const alias = this.getParam(parsed.params.alias);\n    const avatar = this.getParam(parsed.params.avatar);\n    const emoji = this.getParam(parsed.params.emoji);\n\n    if (channel) payload.channel = channel;\n    if (alias) payload.alias = alias;\n    if (avatar) payload.avatar = avatar;\n    if (emoji) payload.emoji = emoji;\n\n    try {\n      const response = await fetch(webhookUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const text = await response.text().catch(() => '');\n        // Use response body if available, otherwise use statusText\n        const errorDetails = text.trim() || response.statusText || '';\n        const errorDesc = getHttpErrorDescription(\n          response.status,\n          errorDetails\n        );\n        return this.failure(new Error(`Rocket.Chat: ${errorDesc}`), {\n          status: response.status,\n          statusText: response.statusText,\n          text,\n        });\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  private formatContent(message: FSMessage): string {\n    if (message.title) return `*${message.title}*\\n${message.body}`;\n    return message.body;\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\nimport { getHttpErrorDescription } from '../../utils/http-errors';\n\n/**\n * Slack Webhook Provider.\n *\n * URL Format: slack://T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX\n *\n * Query params:\n *  - channel: Channel to post to (e.g., #general or @username)\n *  - username: Bot username\n *  - icon_emoji: Emoji to use as icon (e.g., :robot:)\n *  - icon_url: URL to icon image\n */\nexport class SlackWebhookProvider extends BaseProvider {\n  readonly id = 'slack';\n  readonly schemas = ['slack'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    return {\n      schema,\n      hostname: segments[0],\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const hookParts = [parsed.hostname, ...parsed.segments].filter(Boolean);\n\n    if (hookParts.length < 3) {\n      return this.failure(\n        new Error('Invalid Slack URL. Expected: slack://T.../B.../XXX')\n      );\n    }\n\n    let webhookUrl: string;\n    if (parsed.hostname === 'hooks.slack.com') {\n      webhookUrl = `https://hooks.slack.com/${parsed.path || ''}`;\n    } else {\n      webhookUrl = `https://hooks.slack.com/services/${hookParts.join('/')}`;\n    }\n\n    const payload: Record<string, unknown> = {\n      text: this.formatContent(message),\n    };\n\n    if (message.actions && message.actions.length > 0) {\n      payload.blocks = [\n        {\n          type: 'section',\n          text: {\n            type: 'mrkdwn',\n            text: this.formatContent(message),\n          },\n        },\n        {\n          type: 'actions',\n          elements: message.actions.map((action) => ({\n            type: 'button',\n            text: {\n              type: 'plain_text',\n              text: action.label,\n            },\n            url: action.url,\n            style:\n              action.style === 'primary' || action.style === 'danger'\n                ? action.style\n                : undefined,\n          })),\n        },\n      ];\n    }\n\n    const channel = this.getParam(parsed.params.channel);\n    const username = this.getParam(parsed.params.username);\n    const iconEmoji = this.getParam(parsed.params.icon_emoji);\n    const iconUrl = this.getParam(parsed.params.icon_url);\n\n    if (channel) payload.channel = channel;\n    if (username) payload.username = username;\n    if (iconEmoji) payload.icon_emoji = iconEmoji;\n    if (iconUrl) payload.icon_url = iconUrl;\n\n    try {\n      const response = await fetch(webhookUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const text = await response.text().catch(() => '');\n        const errorDetails = text.trim() || response.statusText || '';\n        const errorDesc = getHttpErrorDescription(\n          response.status,\n          errorDetails\n        );\n        return this.failure(new Error(`Slack: ${errorDesc}`), {\n          status: response.status,\n          statusText: response.statusText,\n          text,\n        });\n      }\n\n      const text = await response.text();\n      return this.success({ response: text });\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  private formatContent(message: FSMessage): string {\n    if (message.title) return `*${message.title}*\\n${message.body}`;\n    return message.body;\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\nimport { getHttpErrorDescription } from '../../utils/http-errors';\n\n/**\n * Telegram Bot Provider.\n *\n * URL Format: tgram://botToken/chatId\n *\n * Query params:\n *  - parse_mode: Message format (HTML, Markdown, MarkdownV2)\n *  - disable_web_page_preview: Disable link previews (true/false)\n *  - disable_notification: Send silently (true/false)\n */\nexport class TelegramBotProvider extends BaseProvider {\n  readonly id = 'telegram';\n  readonly schemas = ['tgram', 'telegram'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    return {\n      schema,\n      hostname: segments[0],\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const botToken = parsed.hostname;\n    const chatId = parsed.segments[0];\n\n    if (!botToken || !chatId) {\n      return this.failure(\n        new Error('Invalid Telegram URL. Expected: tgram://botToken/chatId')\n      );\n    }\n\n    const parseMode = this.getParam(parsed.params.parse_mode);\n    const disablePreview = this.getParam(\n      parsed.params.disable_web_page_preview\n    );\n    const disableNotification = this.getParam(\n      parsed.params.disable_notification\n    );\n\n    try {\n      // Send attachments first if present\n      if (message.attachments && message.attachments.length > 0) {\n        for (const att of message.attachments) {\n          if (!att) continue;\n\n          const docUrl = `https://api.telegram.org/bot${botToken}/sendDocument`;\n          const formData = new FormData();\n          formData.append('chat_id', chatId);\n\n          if (att.content) {\n            const buffer =\n              typeof att.content === 'string'\n                ? Buffer.from(att.content, 'base64')\n                : att.content;\n            const blob = new Blob([buffer], { type: att.contentType });\n            formData.append('document', blob, att.name ?? 'file');\n          } else if (att.url) {\n            // Telegram can fetch URLs directly\n            formData.append('document', att.url);\n          } else {\n            continue;\n          }\n\n          if (disableNotification === 'true') {\n            formData.append('disable_notification', 'true');\n          }\n\n          await fetch(docUrl, {\n            method: 'POST',\n            headers: { 'User-Agent': 'fire-signal/0.1.0' },\n            body: formData,\n          });\n        }\n      }\n\n      // Send the text message\n      const apiUrl = `https://api.telegram.org/bot${botToken}/sendMessage`;\n      const payload: Record<string, unknown> = {\n        chat_id: chatId,\n        text: this.formatContent(message),\n      };\n\n      if (message.actions && message.actions.length > 0) {\n        payload.reply_markup = {\n          inline_keyboard: message.actions.map((action) => [\n            {\n              text: action.label,\n              url: action.url,\n            },\n          ]),\n        };\n      }\n\n      if (parseMode) payload.parse_mode = parseMode;\n      if (disablePreview === 'true') payload.disable_web_page_preview = true;\n      if (disableNotification === 'true') payload.disable_notification = true;\n\n      const response = await fetch(apiUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      const responseData = (await response.json()) as Record<string, unknown>;\n\n      if (!response.ok || responseData.ok !== true) {\n        const errorDesc = getHttpErrorDescription(\n          response.status,\n          JSON.stringify(responseData)\n        );\n        return this.failure(new Error(`Telegram: ${errorDesc}`), responseData);\n      }\n\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n\n  private formatContent(message: FSMessage): string {\n    if (message.title) return `*${message.title}*\\n\\n${message.body}`;\n    return message.body;\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\nimport { getHttpErrorDescription } from '../../utils/http-errors';\n\n/**\n * JSON Webhook Provider - Generic JSON POST webhook.\n *\n * URL Format: json://hostname/path or jsons://hostname/path (HTTPS)\n *\n * Query params:\n *  - method: HTTP method (default: POST)\n *  - content_type: Content-Type header (default: application/json)\n */\nexport class JsonWebhookProvider extends BaseProvider {\n  readonly id = 'json';\n  readonly schemas = ['json', 'jsons'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    const firstSegment = segments[0] ?? '';\n    let hostname = firstSegment;\n    let port: number | undefined;\n\n    const colonIndex = firstSegment.lastIndexOf(':');\n    if (colonIndex !== -1) {\n      const potentialPort = firstSegment.slice(colonIndex + 1);\n      if (/^\\d+$/.test(potentialPort)) {\n        hostname = firstSegment.slice(0, colonIndex);\n        port = parseInt(potentialPort, 10);\n      }\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const method = this.getParam(parsed.params.method) ?? 'POST';\n    const contentType =\n      this.getParam(parsed.params.content_type) ?? 'application/json';\n\n    const protocol = parsed.schema === 'jsons' ? 'https' : 'http';\n    const port = parsed.port ? `:${parsed.port}` : '';\n    const path = parsed.path ? `/${parsed.path}` : '';\n    const url = `${protocol}://${parsed.hostname}${port}${path}`;\n\n    const body = JSON.stringify({\n      title: message.title,\n      body: message.body,\n      tags: ctx.tags,\n      metadata: message.metadata,\n    });\n\n    try {\n      const response = await fetch(url, {\n        method,\n        headers: {\n          'Content-Type': contentType,\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body,\n      });\n\n      if (!response.ok) {\n        const text = await response.text().catch(() => '');\n        const errorDetails = text.trim() || response.statusText || '';\n        const errorDesc = getHttpErrorDescription(\n          response.status,\n          errorDetails\n        );\n        return this.failure(new Error(`JSON Webhook: ${errorDesc}`), {\n          status: response.status,\n          statusText: response.statusText,\n          text,\n        });\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * ntfy Provider - Self-hosted push notifications.\n *\n * URL Format: ntfy://host/topic or ntfys://host/topic (HTTPS)\n *\n * Query params:\n *  - priority: Message priority (min, low, default, high, urgent)\n *  - tags: Comma-separated emoji tags (e.g., warning,skull)\n *  - click: URL to open when notification is clicked\n *  - attach: URL of attachment\n *  - icon: URL of notification icon\n *  - email: Email address for email notifications\n *  - delay: Delay before sending (e.g., 30min, 2h)\n */\nexport class NtfyProvider extends BaseProvider {\n  readonly id = 'ntfy';\n  readonly schemas = ['ntfy', 'ntfys'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    // Handle user:pass@host format\n    const firstSegment = segments[0] ?? '';\n    let hostname = firstSegment;\n    let username: string | undefined;\n    let password: string | undefined;\n    let port: number | undefined;\n\n    const atIndex = firstSegment.lastIndexOf('@');\n    if (atIndex !== -1) {\n      const userPass = firstSegment.slice(0, atIndex);\n      const hostPort = firstSegment.slice(atIndex + 1);\n      const colonIndex = userPass.indexOf(':');\n      if (colonIndex !== -1) {\n        username = userPass.slice(0, colonIndex);\n        password = userPass.slice(colonIndex + 1);\n      } else {\n        username = userPass;\n      }\n      hostname = hostPort;\n    }\n\n    // Handle port in hostname\n    const colonIndex = hostname.lastIndexOf(':');\n    if (colonIndex !== -1) {\n      const potentialPort = hostname.slice(colonIndex + 1);\n      if (/^\\d+$/.test(potentialPort)) {\n        port = parseInt(potentialPort, 10);\n        hostname = hostname.slice(0, colonIndex);\n      }\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      username,\n      password,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    if (!parsed.hostname) {\n      return this.failure(\n        new Error('Invalid ntfy URL. Expected: ntfy://host/topic')\n      );\n    }\n\n    const topic = parsed.segments[0] || parsed.path;\n    if (!topic) {\n      return this.failure(\n        new Error('Invalid ntfy URL. Topic is required: ntfy://host/topic')\n      );\n    }\n\n    const protocol = parsed.schema === 'ntfys' ? 'https' : 'http';\n    const port = parsed.port ? `:${parsed.port}` : '';\n    const url = `${protocol}://${parsed.hostname}${port}/${topic}`;\n\n    const headers: Record<string, string> = {\n      'User-Agent': 'fire-signal/0.1.0',\n    };\n\n    // Add title if present\n    if (message.title) {\n      const hasNonAscii = /[^\\x00-\\x7F]/.test(message.title);\n      if (hasNonAscii) {\n        headers['X-Title'] = Buffer.from(message.title).toString('base64');\n        headers['X-Encoding'] = 'base64';\n      } else {\n        headers['Title'] = message.title;\n      }\n    }\n\n    // Add optional headers from query params\n    const priority = this.getParam(parsed.params.priority);\n    const tags = this.getParam(parsed.params.tags);\n    const click = this.getParam(parsed.params.click);\n    const attach = this.getParam(parsed.params.attach);\n    const icon = this.getParam(parsed.params.icon);\n    const email = this.getParam(parsed.params.email);\n    const delay = this.getParam(parsed.params.delay);\n\n    if (priority) headers['Priority'] = priority;\n    if (tags) headers['Tags'] = tags;\n    if (click) headers['Click'] = click;\n    if (attach) headers['Attach'] = attach;\n    if (icon) headers['Icon'] = icon;\n    if (email) headers['Email'] = email;\n    if (delay) headers['Delay'] = delay;\n\n    // Add basic auth if credentials provided\n    if (parsed.username && parsed.password) {\n      const auth = Buffer.from(\n        `${parsed.username}:${parsed.password}`\n      ).toString('base64');\n      headers['Authorization'] = `Basic ${auth}`;\n    }\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers,\n        body: message.body,\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('ntfy', response);\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Gotify Provider - Self-hosted push notifications.\n *\n * URL Format: gotify://host/token or gotifys://host/token (HTTPS)\n *\n * Query params:\n *  - priority: Message priority (1-10, default 5)\n */\nexport class GotifyProvider extends BaseProvider {\n  readonly id = 'gotify';\n  readonly schemas = ['gotify', 'gotifys'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    let hostname = segments[0] ?? '';\n    let port: number | undefined;\n\n    // Handle port in hostname\n    const colonIndex = hostname.lastIndexOf(':');\n    if (colonIndex !== -1) {\n      const potentialPort = hostname.slice(colonIndex + 1);\n      if (/^\\d+$/.test(potentialPort)) {\n        port = parseInt(potentialPort, 10);\n        hostname = hostname.slice(0, colonIndex);\n      }\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    if (!parsed.hostname) {\n      return this.failure(\n        new Error('Invalid Gotify URL. Expected: gotify://host/token')\n      );\n    }\n\n    // Token can be in path or as first segment\n    const token = parsed.segments[0] || parsed.path;\n    if (!token) {\n      return this.failure(\n        new Error('Invalid Gotify URL. Token is required: gotify://host/token')\n      );\n    }\n\n    const protocol = parsed.schema === 'gotifys' ? 'https' : 'http';\n    const port = parsed.port ? `:${parsed.port}` : '';\n\n    // If there's a path after the token, include it\n    const remainingPath = parsed.segments.slice(1).join('/');\n    const basePath = remainingPath ? `/${remainingPath}` : '';\n    const url = `${protocol}://${parsed.hostname}${port}${basePath}/message?token=${token}`;\n\n    const priority = this.getParam(parsed.params.priority);\n\n    // Build form data (Gotify expects form-urlencoded, not JSON)\n    const formData = new URLSearchParams();\n    formData.append('message', message.body);\n\n    if (message.title) {\n      formData.append('title', message.title);\n    }\n\n    if (priority) {\n      formData.append('priority', priority);\n    }\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: formData.toString(),\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('Gotify', response);\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Google Chat Provider - Workspace chat via webhooks.\n *\n * URL Format: gchat://chat.googleapis.com/v1/spaces/SPACE/messages?key=KEY&token=TOKEN\n *\n * The webhook URL from Google Chat is:\n * https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN\n *\n * Convert to fire-signal format:\n * gchat://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY&token=TOKEN\n *\n * Or simpler (just the webhook path after the host):\n * gchat://SPACE_ID/KEY/TOKEN\n */\nexport class GoogleChatProvider extends BaseProvider {\n  readonly id = 'gchat';\n  readonly schemas = ['gchat', 'googlechat'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    return {\n      schema,\n      hostname: segments[0],\n      segments: segments.slice(1),\n      path: segments.join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    // Build webhook URL\n    let webhookUrl: string;\n\n    // Check if it's the full URL format (chat.googleapis.com/v1/spaces/...)\n    if (parsed.hostname === 'chat.googleapis.com') {\n      const key = this.getParam(parsed.params.key);\n      const token = this.getParam(parsed.params.token);\n\n      if (!key || !token) {\n        return this.failure(\n          new Error(\n            'Invalid Google Chat URL. key and token params are required.'\n          )\n        );\n      }\n\n      webhookUrl = `https://chat.googleapis.com/${parsed.segments.join('/')}?key=${key}&token=${token}`;\n    } else {\n      // Simplified format: gchat://SPACE_ID/KEY/TOKEN\n      const [spaceId, key, token] = [\n        parsed.hostname,\n        parsed.segments[0],\n        parsed.segments[1],\n      ];\n\n      if (!spaceId || !key || !token) {\n        return this.failure(\n          new Error(\n            'Invalid Google Chat URL. Expected: gchat://SPACE_ID/KEY/TOKEN'\n          )\n        );\n      }\n\n      webhookUrl = `https://chat.googleapis.com/v1/spaces/${spaceId}/messages?key=${key}&token=${token}`;\n    }\n\n    // Build message payload\n    const text = message.title\n      ? `*${message.title}*\\n${message.body}`\n      : message.body;\n\n    const payload: Record<string, unknown> = { text };\n\n    try {\n      const response = await fetch(webhookUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('Google Chat', response);\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Mattermost Provider - Incoming webhooks.\n *\n * URL Format: mmost://host/hook_id or mmosts://host/hook_id (HTTPS)\n *\n * The webhook URL from Mattermost is:\n * https://mattermost.example.com/hooks/HOOK_ID\n *\n * Convert to fire-signal format:\n * mmosts://mattermost.example.com/HOOK_ID\n *\n * Query params:\n *  - channel: Override the default channel (e.g., #general, @username)\n *  - username: Override the webhook username\n *  - icon_url: Override the webhook icon\n */\nexport class MattermostProvider extends BaseProvider {\n  readonly id = 'mattermost';\n  readonly schemas = ['mmost', 'mmosts'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    let hostname = segments[0] ?? '';\n    let port: number | undefined;\n\n    // Handle port in hostname\n    const colonIndex = hostname.lastIndexOf(':');\n    if (colonIndex !== -1) {\n      const potentialPort = hostname.slice(colonIndex + 1);\n      if (/^\\d+$/.test(potentialPort)) {\n        port = parseInt(potentialPort, 10);\n        hostname = hostname.slice(0, colonIndex);\n      }\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    if (!parsed.hostname) {\n      return this.failure(\n        new Error('Invalid Mattermost URL. Expected: mmost://host/hook_id')\n      );\n    }\n\n    const hookId = parsed.segments[0] || parsed.path;\n    if (!hookId) {\n      return this.failure(\n        new Error(\n          'Invalid Mattermost URL. Hook ID is required: mmost://host/hook_id'\n        )\n      );\n    }\n\n    const protocol = parsed.schema === 'mmosts' ? 'https' : 'http';\n    const port = parsed.port ? `:${parsed.port}` : '';\n    const url = `${protocol}://${parsed.hostname}${port}/hooks/${hookId}`;\n\n    // Build message text with optional title (markdown)\n    const text = message.title\n      ? `**${message.title}**\\n${message.body}`\n      : message.body;\n\n    const payload: Record<string, unknown> = { text };\n\n    // Optional overrides from query params\n    const channel = this.getParam(parsed.params.channel);\n    const username = this.getParam(parsed.params.username);\n    const iconUrl = this.getParam(parsed.params.icon_url);\n\n    if (channel) payload.channel = channel;\n    if (username) payload.username = username;\n    if (iconUrl) payload.icon_url = iconUrl;\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('Mattermost', response);\n      }\n\n      const responseData = await response.text().catch(() => '');\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Microsoft Teams Provider - Incoming webhooks.\n *\n * URL Format: msteams://WEBHOOK_URL_ENCODED or the full webhook URL\n *\n * MS Teams webhook URLs look like:\n * https://tenant.webhook.office.com/webhookb2/GUID@GUID/IncomingWebhook/GUID/GUID\n *\n * Convert to fire-signal format:\n * msteams://tenant.webhook.office.com/webhookb2/GUID@GUID/IncomingWebhook/GUID/GUID\n *\n * Query params:\n *  - theme_color: Hex color for the message card (without #)\n */\nexport class MSTeamsProvider extends BaseProvider {\n  readonly id = 'msteams';\n  readonly schemas = ['msteams'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    let hostname = segments[0] ?? '';\n    let port: number | undefined;\n\n    // Handle port in hostname\n    const colonIndex = hostname.lastIndexOf(':');\n    if (colonIndex !== -1) {\n      const potentialPort = hostname.slice(colonIndex + 1);\n      if (/^\\d+$/.test(potentialPort)) {\n        port = parseInt(potentialPort, 10);\n        hostname = hostname.slice(0, colonIndex);\n      }\n    }\n\n    return {\n      schema,\n      hostname,\n      port,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n\n    if (!parsed.hostname) {\n      return this.failure(\n        new Error('Invalid MS Teams URL. Expected: msteams://host/webhook-path')\n      );\n    }\n\n    // Reconstruct the webhook URL\n    const port = parsed.port ? `:${parsed.port}` : '';\n    const path = parsed.path ? `/${parsed.path}` : '';\n    const url = `https://${parsed.hostname}${port}${path}`;\n\n    // Build MessageCard payload\n    const themeColor = this.getParam(parsed.params.theme_color) ?? '0076D7';\n\n    const payload: Record<string, unknown> = {\n      '@type': 'MessageCard',\n      '@context': 'http://schema.org/extensions',\n      themeColor,\n      summary: message.title ?? message.body.substring(0, 50),\n      sections: [\n        {\n          activityTitle: message.title ?? 'Fire-Signal',\n          text: message.body,\n          markdown: true,\n        },\n      ],\n    };\n\n    if (message.actions && message.actions.length > 0) {\n      payload.potentialAction = message.actions.map((action) => ({\n        '@type': 'OpenUri',\n        name: action.label,\n        targets: [\n          {\n            os: 'default',\n            uri: action.url,\n          },\n        ],\n      }));\n    }\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('MS Teams', response);\n      }\n\n      const responseData = await response.text().catch(() => '');\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * OneSignal Provider - Push notifications via OneSignal.\n *\n * URL Format (Apprise-compatible):\n *   onesignal://app_id@api_key/\n *   onesignal://template_id:app_id@api_key/\n *   onesignal://app_id@api_key/{player_id}/{player_id2}/\n *   onesignal://app_id@api_key/#{segment}/\n *   onesignal://app_id@api_key/@{user_id}/\n *   onesignal://app_id@api_key/{email}/\n *\n * Path targets:\n *   - {player_id} - Target by OneSignal player ID\n *   - #{segment} - Target by segment (e.g., #Subscribed%20Users)\n *   - @{user_id} - Target by external user ID\n *   - {email} - Target by email address\n *\n * Query params:\n *   - subtitle: Subtitle for iOS\n *   - language: 2-char language code (default: en)\n *   - image: yes/no to include image (default: yes)\n *   - batch: yes/no for batch mode (default: no)\n */\nexport class OneSignalProvider extends BaseProvider {\n  readonly id = 'onesignal';\n  readonly schemas = ['onesignal'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    // Parse template_id:app_id@api_key or app_id@api_key format\n    const firstSegment = segments[0] ?? '';\n    let templateId: string | undefined;\n    let appId: string;\n    let apiKey: string | undefined;\n\n    const atIndex = firstSegment.indexOf('@');\n    if (atIndex !== -1) {\n      const beforeAt = firstSegment.slice(0, atIndex);\n      apiKey = firstSegment.slice(atIndex + 1);\n\n      const colonIndex = beforeAt.indexOf(':');\n      if (colonIndex !== -1) {\n        templateId = beforeAt.slice(0, colonIndex);\n        appId = beforeAt.slice(colonIndex + 1);\n      } else {\n        appId = beforeAt;\n      }\n    } else {\n      appId = firstSegment;\n    }\n\n    return {\n      schema,\n      hostname: appId,\n      password: apiKey,\n      username: templateId,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const appId = parsed.hostname;\n    const apiKey = parsed.password;\n    const templateId = parsed.username;\n\n    if (!appId || !apiKey) {\n      return this.failure(\n        new Error(\n          'Invalid OneSignal URL. Expected: onesignal://app_id@api_key/'\n        )\n      );\n    }\n\n    const url = 'https://onesignal.com/api/v1/notifications';\n\n    // Build payload\n    const payload: Record<string, unknown> = {\n      app_id: appId,\n      contents: { en: message.body },\n    };\n\n    // Add title if present\n    if (message.title) {\n      payload.headings = { en: message.title };\n    }\n\n    // Add template if specified\n    if (templateId) {\n      payload.template_id = templateId;\n    }\n\n    // Parse path targets: player_ids, #segments, @user_ids, emails\n    const playerIds: string[] = [];\n    const includeSegments: string[] = [];\n    const externalUserIds: string[] = [];\n    const emails: string[] = [];\n\n    for (const segment of parsed.segments) {\n      if (segment.startsWith('#')) {\n        // Segment: #SegmentName\n        includeSegments.push(decodeURIComponent(segment.slice(1)));\n      } else if (segment.startsWith('@')) {\n        // External user ID: @userId\n        externalUserIds.push(decodeURIComponent(segment.slice(1)));\n      } else if (segment.includes('@')) {\n        // Email address\n        emails.push(decodeURIComponent(segment));\n      } else {\n        // Player ID\n        playerIds.push(segment);\n      }\n    }\n\n    // Set targeting based on parsed path\n    if (playerIds.length > 0) {\n      payload.include_player_ids = playerIds;\n    } else if (externalUserIds.length > 0) {\n      payload.include_external_user_ids = externalUserIds;\n    } else if (emails.length > 0) {\n      payload.include_email_tokens = emails;\n    } else if (includeSegments.length > 0) {\n      payload.included_segments = includeSegments;\n    } else {\n      // Default to all subscribed users\n      payload.included_segments = ['Subscribed Users'];\n    }\n\n    // Optional query params\n    const subtitle = this.getParam(parsed.params.subtitle);\n    const language = this.getParam(parsed.params.language);\n    const image = this.getParam(parsed.params.image);\n\n    if (subtitle) {\n      payload.subtitle = { en: subtitle };\n    }\n\n    if (language && language !== 'en') {\n      // Add content in specified language\n      (payload.contents as Record<string, string>)[language] = message.body;\n      if (message.title) {\n        (payload.headings as Record<string, string>)[language] = message.title;\n      }\n    }\n\n    if (image === 'no') {\n      payload.chrome_web_icon = '';\n      payload.firefox_icon = '';\n    }\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Basic ${apiKey}`,\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('OneSignal', response);\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Pushover Provider - Push notifications via Pushover.\n *\n * URL Format:\n *   pover://user_key@api_token/\n *   pover://user_key@api_token/{device}/\n *   pover://user_key@api_token/{device1}/{device2}/\n *\n * Path targets:\n *   - {device} - Target specific device(s)\n *\n * Query params:\n *   - priority: -2 (lowest) to 2 (emergency)\n *   - sound: Notification sound\n *   - url: Supplementary URL\n *   - url_title: Title for the URL\n *   - html: yes/no for HTML formatting\n *   - ttl: Time to live in seconds\n */\nexport class PushoverProvider extends BaseProvider {\n  readonly id = 'pushover';\n  readonly schemas = ['pover', 'pushover'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n    const segments = (pathPart ?? '').split('/').filter(Boolean);\n\n    // Parse user_key@api_token format\n    const firstSegment = segments[0] ?? '';\n    let userKey = firstSegment;\n    let apiToken: string | undefined;\n\n    const atIndex = firstSegment.indexOf('@');\n    if (atIndex !== -1) {\n      userKey = firstSegment.slice(0, atIndex);\n      apiToken = firstSegment.slice(atIndex + 1);\n    }\n\n    return {\n      schema,\n      hostname: userKey,\n      password: apiToken,\n      segments: segments.slice(1),\n      path: segments.slice(1).join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const userKey = parsed.hostname;\n    const apiToken = parsed.password;\n\n    if (!userKey || !apiToken) {\n      return this.failure(\n        new Error('Invalid Pushover URL. Expected: pover://user_key@api_token/')\n      );\n    }\n\n    const url = 'https://api.pushover.net/1/messages.json';\n\n    // Build form data\n    const formData = new URLSearchParams();\n    formData.append('token', apiToken);\n    formData.append('user', userKey);\n    formData.append('message', message.body);\n\n    if (message.title) {\n      formData.append('title', message.title);\n    }\n\n    // Add devices from path\n    if (parsed.segments.length > 0) {\n      formData.append('device', parsed.segments.join(','));\n    }\n\n    // Optional query params\n    const priority = this.getParam(parsed.params.priority);\n    const sound = this.getParam(parsed.params.sound);\n    const urlParam = this.getParam(parsed.params.url);\n    const urlTitle = this.getParam(parsed.params.url_title);\n    const html = this.getParam(parsed.params.html);\n    const ttl = this.getParam(parsed.params.ttl);\n\n    if (priority) formData.append('priority', priority);\n    if (sound) formData.append('sound', sound);\n    if (urlParam) formData.append('url', urlParam);\n    if (urlTitle) formData.append('url_title', urlTitle);\n    if (html === 'yes') formData.append('html', '1');\n    if (ttl) formData.append('ttl', ttl);\n\n    // Emergency priority requires retry/expire\n    if (priority === '2') {\n      formData.append('retry', '30');\n      formData.append('expire', '3600');\n    }\n\n    try {\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n          'User-Agent': 'fire-signal/0.1.0',\n        },\n        body: formData.toString(),\n      });\n\n      if (!response.ok) {\n        return this.httpFailure('Pushover', response);\n      }\n\n      const responseData = await response.json().catch(() => ({}));\n      return this.success(responseData);\n    } catch (error) {\n      return this.failure(\n        error instanceof Error ? error : new Error(String(error))\n      );\n    }\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n  FSParsedUrl,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Twilio Provider - SMS and WhatsApp messages via Twilio.\n *\n * URL Format:\n *   twilio://AccountSID:AuthToken@FromPhone/ToPhone\n *   twilio://AccountSID:AuthToken@FromPhone/ToPhone1/ToPhone2\n *   twilio://AccountSID:AuthToken@FromPhone/w:ToWhatsApp\n *\n * Phone numbers must include country code (e.g., +5511999999999)\n * WhatsApp recipients use w: prefix (e.g., w:+5511999999999)\n */\nexport class TwilioProvider extends BaseProvider {\n  readonly id = 'twilio';\n  readonly schemas = ['twilio'];\n\n  parseUrl(raw: string): FSParsedUrl {\n    const schema = this.extractSchema(raw);\n    const afterSchema = raw.slice(`${schema}://`.length);\n    const [pathPart, queryPart] = afterSchema.split('?');\n\n    // Parse AccountSID:AuthToken@FromPhone/ToPhones\n    const atIndex = (pathPart ?? '').lastIndexOf('@');\n    if (atIndex === -1) {\n      return {\n        schema,\n        hostname: '',\n        segments: [],\n        path: '',\n        params: {},\n        raw,\n      };\n    }\n\n    const credentials = (pathPart ?? '').slice(0, atIndex);\n    const phonePart = (pathPart ?? '').slice(atIndex + 1);\n\n    const colonIndex = credentials.indexOf(':');\n    const accountSid =\n      colonIndex !== -1 ? credentials.slice(0, colonIndex) : credentials;\n    const authToken =\n      colonIndex !== -1 ? credentials.slice(colonIndex + 1) : '';\n\n    const phoneSegments = phonePart.split('/').filter(Boolean);\n    const fromPhone = phoneSegments[0] ?? '';\n    const toPhones = phoneSegments.slice(1);\n\n    return {\n      schema,\n      hostname: fromPhone,\n      username: accountSid,\n      password: authToken,\n      segments: toPhones,\n      path: toPhones.join('/'),\n      params: this.parseQueryParams(queryPart ?? ''),\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { parsed } = ctx;\n    const accountSid = parsed.username;\n    const authToken = parsed.password;\n    const fromPhone = parsed.hostname;\n    const toPhones = parsed.segments;\n\n    if (!accountSid || !authToken || !fromPhone) {\n      return this.failure(\n        new Error(\n          'Invalid Twilio URL. Expected: twilio://AccountSID:AuthToken@FromPhone/ToPhone'\n        )\n      );\n    }\n\n    if (toPhones.length === 0) {\n      return this.failure(\n        new Error('At least one recipient phone is required')\n      );\n    }\n\n    const url = `https://api.twilio.com/2010-04-01/Accounts/${accountSid}/Messages.json`;\n    const authHeader = Buffer.from(`${accountSid}:${authToken}`).toString(\n      'base64'\n    );\n\n    const results: Array<{ to: string; success: boolean; error?: string }> = [];\n\n    for (const toPhone of toPhones) {\n      // Determine if WhatsApp (w: prefix)\n      const isWhatsApp = toPhone.startsWith('w:');\n      const actualToPhone = isWhatsApp ? toPhone.slice(2) : toPhone;\n      const from = isWhatsApp ? `whatsapp:${fromPhone}` : fromPhone;\n      const to = isWhatsApp ? `whatsapp:${actualToPhone}` : actualToPhone;\n\n      const formData = new URLSearchParams();\n      formData.append('From', from);\n      formData.append('To', to);\n      formData.append('Body', message.body);\n\n      try {\n        const response = await fetch(url, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/x-www-form-urlencoded',\n            Authorization: `Basic ${authHeader}`,\n            'User-Agent': 'fire-signal/0.1.0',\n          },\n          body: formData.toString(),\n        });\n\n        if (!response.ok) {\n          const errorData = await response.json().catch(() => ({}));\n          results.push({\n            to: actualToPhone,\n            success: false,\n            error:\n              (errorData as Record<string, string>).message ??\n              `HTTP ${response.status}`,\n          });\n        } else {\n          results.push({ to: actualToPhone, success: true });\n        }\n      } catch (error) {\n        results.push({\n          to: actualToPhone,\n          success: false,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    const allSuccess = results.every((r) => r.success);\n    const failures = results.filter((r) => !r.success);\n\n    if (!allSuccess) {\n      return this.failure(\n        new Error(\n          `Failed to send to: ${failures.map((f) => `${f.to} (${f.error})`).join(', ')}`\n        )\n      );\n    }\n\n    return this.success({ sent: results.length, recipients: toPhones });\n  }\n}\n","import {\n  BaseProvider,\n  FSProviderContext,\n  FSProviderResult,\n} from '../base/Provider';\nimport type { FSMessage } from '../../core/Message';\n\n/**\n * Fire Platform Provider\n *\n * Delegates notification delivery to Fire Platform (the SaaS).\n * Fire Platform then distributes to configured channels (Discord, Slack, Email, etc.)\n *\n * @example\n * ```typescript\n * fire.add('fire://fp_live_xyz123@api.fire-signal.com');\n * ```\n */\nexport class FireProvider extends BaseProvider {\n  readonly id = 'fire';\n  readonly schemas = ['fire'];\n\n  static readonly DEFAULT_HOST = 'api.fire-signal.com';\n\n  parseUrl(raw: string) {\n    const tokenOnlyMatch = raw.match(/^fire:\\/\\/([^@/?#]+)$/i);\n\n    if (tokenOnlyMatch) {\n      const apiKey = tokenOnlyMatch[1];\n      return {\n        schema: 'fire',\n        hostname: FireProvider.DEFAULT_HOST,\n        port: undefined,\n        username: apiKey,\n        password: undefined,\n        path: '',\n        params: {},\n        segments: [],\n        raw,\n      };\n    }\n\n    const url = new URL(raw);\n    const hostname = url.hostname || FireProvider.DEFAULT_HOST;\n\n    return {\n      schema: 'fire',\n      hostname,\n      port: url.port ? parseInt(url.port, 10) : undefined,\n      username: url.username || undefined,\n      password: undefined,\n      path: url.pathname,\n      params: {},\n      segments: [],\n      raw,\n    };\n  }\n\n  async send(\n    message: FSMessage,\n    ctx: FSProviderContext\n  ): Promise<FSProviderResult> {\n    const { hostname, port, username: apiKey } = ctx.parsed;\n\n    if (!apiKey) {\n      return this.failure(new Error('API key is required in URL username'));\n    }\n\n    if (!hostname) {\n      return this.failure(\n        new Error(\n          'Invalid fire:// URL: missing host. Use fire://<api_key>@api.fire-signal.com'\n        )\n      );\n    }\n\n    // Auto-detect protocol: localhost/127.0.0.1 uses http, others use https\n    const isLocalHost =\n      hostname.includes('localhost') || hostname === '127.0.0.1';\n    const protocol = isLocalHost ? 'http' : 'https';\n    const host = port ? `${hostname}:${port}` : hostname;\n    const apiUrl = `${protocol}://${host}/v1/send`;\n\n    try {\n      const response = await fetch(apiUrl, {\n        method: 'POST',\n        headers: {\n          Authorization: `Bearer ${apiKey}`,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          title: message.title,\n          body: message.body,\n          ...(message.actions &&\n            message.actions.length > 0 && { actions: message.actions }),\n          data: message.metadata,\n          audience: ctx.audience,\n          segmentId: ctx.segmentId,\n          templateKey: ctx.templateKey,\n        }),\n      });\n\n      if (!response.ok) {\n        const errorText = await response.text();\n\n        if (response.status === 401) {\n          return this.failure(\n            new Error(\n              `Fire Platform: Invalid API key (401). Check fire:// key and workspace permissions for host ${host}`\n            ),\n            {\n              status: response.status,\n              statusText: response.statusText,\n              text: errorText,\n            }\n          );\n        }\n\n        if (response.status === 403) {\n          return this.failure(\n            new Error(\n              `Fire Platform: Access forbidden (403). API key may not have permission to send on host ${host}`\n            ),\n            {\n              status: response.status,\n              statusText: response.statusText,\n              text: errorText,\n            }\n          );\n        }\n\n        if (response.status === 404) {\n          return this.failure(\n            new Error(\n              `Fire Platform: Endpoint not found (404) on ${host}. Confirm fire:// host is correct and exposes /v1/send`\n            ),\n            {\n              status: response.status,\n              statusText: response.statusText,\n              text: errorText,\n            }\n          );\n        }\n\n        return this.httpFailure('Fire Platform', response, errorText);\n      }\n\n      const data = await response.json();\n      return this.success(data);\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n\n      if (err.message.toLowerCase().includes('fetch failed')) {\n        return this.failure(\n          new Error(\n            `Fire Platform: Unable to reach ${host}. Verify fire:// host, DNS, and network connectivity`\n          )\n        );\n      }\n\n      return this.failure(err);\n    }\n  }\n}\n","/**\n * Provider registry - exports all built-in providers.\n */\n\nimport { FSProvider } from './base/Provider';\nimport { SmtpProvider } from './email/SmtpProvider';\nimport { DiscordWebhookProvider } from './discord/DiscordWebhookProvider';\nimport { RocketChatWebhookProvider } from './rocketchat/RocketChatWebhookProvider';\nimport { SlackWebhookProvider } from './slack/SlackWebhookProvider';\nimport { TelegramBotProvider } from './telegram/TelegramBotProvider';\nimport { JsonWebhookProvider } from './http/JsonWebhookProvider';\nimport { NtfyProvider } from './ntfy/NtfyProvider';\nimport { GotifyProvider } from './gotify/GotifyProvider';\nimport { GoogleChatProvider } from './gchat/GoogleChatProvider';\nimport { MattermostProvider } from './mattermost/MattermostProvider';\nimport { MSTeamsProvider } from './msteams/MSTeamsProvider';\nimport { OneSignalProvider } from './onesignal/OneSignalProvider';\nimport { PushoverProvider } from './pushover/PushoverProvider';\nimport { TwilioProvider } from './twilio/TwilioProvider';\nimport { FireProvider } from './fire/FireProvider';\n\n// Export individual providers\nexport { SmtpProvider } from './email/SmtpProvider';\nexport { DiscordWebhookProvider } from './discord/DiscordWebhookProvider';\nexport { RocketChatWebhookProvider } from './rocketchat/RocketChatWebhookProvider';\nexport { SlackWebhookProvider } from './slack/SlackWebhookProvider';\nexport { TelegramBotProvider } from './telegram/TelegramBotProvider';\nexport { JsonWebhookProvider } from './http/JsonWebhookProvider';\nexport { NtfyProvider } from './ntfy/NtfyProvider';\nexport { GotifyProvider } from './gotify/GotifyProvider';\nexport { GoogleChatProvider } from './gchat/GoogleChatProvider';\nexport { MattermostProvider } from './mattermost/MattermostProvider';\nexport { MSTeamsProvider } from './msteams/MSTeamsProvider';\nexport { OneSignalProvider } from './onesignal/OneSignalProvider';\nexport { PushoverProvider } from './pushover/PushoverProvider';\nexport { TwilioProvider } from './twilio/TwilioProvider';\nexport { FireProvider } from './fire/FireProvider';\n\n/**\n * Creates instances of all built-in providers.\n *\n * @returns Array of provider instances\n */\nexport function createDefaultProviders(): FSProvider[] {\n  return [\n    new SmtpProvider(),\n    new DiscordWebhookProvider(),\n    new RocketChatWebhookProvider(),\n    new SlackWebhookProvider(),\n    new TelegramBotProvider(),\n    new JsonWebhookProvider(),\n    new NtfyProvider(),\n    new GotifyProvider(),\n    new GoogleChatProvider(),\n    new MattermostProvider(),\n    new MSTeamsProvider(),\n    new OneSignalProvider(),\n    new PushoverProvider(),\n    new TwilioProvider(),\n    new FireProvider(),\n  ];\n}\n\n/**\n * Provider schema to provider class mapping.\n */\nexport const PROVIDER_SCHEMAS = {\n  mailto: SmtpProvider,\n  mailtos: SmtpProvider,\n  discord: DiscordWebhookProvider,\n  rocketchat: RocketChatWebhookProvider,\n  rocket: RocketChatWebhookProvider,\n  slack: SlackWebhookProvider,\n  tgram: TelegramBotProvider,\n  telegram: TelegramBotProvider,\n  json: JsonWebhookProvider,\n  jsons: JsonWebhookProvider,\n  ntfy: NtfyProvider,\n  ntfys: NtfyProvider,\n  gotify: GotifyProvider,\n  gotifys: GotifyProvider,\n  gchat: GoogleChatProvider,\n  googlechat: GoogleChatProvider,\n  mmost: MattermostProvider,\n  mmosts: MattermostProvider,\n  msteams: MSTeamsProvider,\n  onesignal: OneSignalProvider,\n  pover: PushoverProvider,\n  pushover: PushoverProvider,\n  twilio: TwilioProvider,\n  fire: FireProvider,\n} as const;\n","/**\n * Configuration file loader for fire-signal.\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport YAML from 'yaml';\nimport { FSConfigError } from '../core/errors';\n\n/**\n * Represents a single URL entry from configuration.\n */\nexport interface FSConfigEntry {\n  url: string;\n  tags?: string[];\n}\n\n/**\n * Loaded configuration data.\n */\nexport interface FSLoadedConfig {\n  entries: FSConfigEntry[];\n}\n\n/**\n * Default configuration file paths.\n */\nexport const DEFAULT_CONFIG_PATHS = [\n  path.join(os.homedir(), '.fire-signal.yml'),\n  path.join(os.homedir(), '.fire-signal.yaml'),\n  path.join(os.homedir(), '.config', 'fire-signal', 'config.yml'),\n  '/etc/fire-signal.yml',\n];\n\n/**\n * Parses a configuration file content.\n *\n * @param content - YAML content string\n * @param filePath - Path to the file (for error messages)\n * @returns Array of config entries\n */\nfunction parseConfigContent(\n  content: string,\n  filePath: string\n): FSConfigEntry[] {\n  const entries: FSConfigEntry[] = [];\n\n  try {\n    const data = YAML.parse(content) as unknown;\n\n    if (!data || typeof data !== 'object') {\n      return entries;\n    }\n\n    const config = data as Record<string, unknown>;\n\n    // Handle 'urls' array format\n    if (Array.isArray(config.urls)) {\n      for (const item of config.urls) {\n        if (typeof item === 'string') {\n          entries.push({ url: item, tags: [] });\n        } else if (typeof item === 'object' && item !== null) {\n          const urlItem = item as Record<string, unknown>;\n          if (typeof urlItem.url === 'string') {\n            const tags = Array.isArray(urlItem.tags)\n              ? urlItem.tags.filter((t): t is string => typeof t === 'string')\n              : [];\n            entries.push({ url: urlItem.url, tags });\n          }\n        }\n      }\n    }\n\n    // Handle simple key-value format (key = tag, value = url)\n    if (typeof config.services === 'object' && config.services !== null) {\n      const services = config.services as Record<string, unknown>;\n      for (const [tag, url] of Object.entries(services)) {\n        if (typeof url === 'string') {\n          entries.push({ url, tags: [tag] });\n        }\n      }\n    }\n  } catch (error) {\n    throw new FSConfigError(\n      `Failed to parse config file: ${error instanceof Error ? error.message : String(error)}`,\n      filePath\n    );\n  }\n\n  return entries;\n}\n\n/**\n * Loads configuration from the default and specified paths.\n *\n * @param paths - Additional paths to check\n * @returns Loaded configuration\n */\nexport async function loadFSConfig(\n  paths: string[] = []\n): Promise<FSLoadedConfig> {\n  const entries: FSConfigEntry[] = [];\n  const allPaths = [...paths, ...DEFAULT_CONFIG_PATHS];\n\n  for (const configPath of allPaths) {\n    try {\n      const content = await fs.readFile(configPath, 'utf8');\n      const parsed = parseConfigContent(content, configPath);\n      entries.push(...parsed);\n    } catch (error) {\n      // Ignore file not found errors\n      if (\n        error instanceof Error &&\n        'code' in error &&\n        error.code === 'ENOENT'\n      ) {\n        continue;\n      }\n      // Re-throw parse errors\n      if (error instanceof FSConfigError) {\n        throw error;\n      }\n      // Ignore other read errors (permission, etc.)\n    }\n  }\n\n  return { entries };\n}\n\n/**\n * Writes a configuration file.\n *\n * @param filePath - Path to write to\n * @param entries - Entries to write\n */\nexport async function writeFSConfig(\n  filePath: string,\n  entries: FSConfigEntry[]\n): Promise<void> {\n  const config = {\n    urls: entries.map((e) => ({\n      url: e.url,\n      tags: e.tags && e.tags.length > 0 ? e.tags : undefined,\n    })),\n  };\n\n  const content = YAML.stringify(config);\n  await fs.mkdir(path.dirname(filePath), { recursive: true });\n  await fs.writeFile(filePath, content, 'utf8');\n}\n","/**\n * Environment variable utilities for fire-signal.\n */\n\n/**\n * Environment variable names used by fire-signal.\n */\nexport const ENV_VARS = {\n  URLS: 'FIRE_SIGNAL_URLS',\n  CONFIG_PATH: 'FIRE_SIGNAL_CONFIG_PATH',\n} as const;\n\n/**\n * Loads notification URLs from the FIRE_SIGNAL_URLS environment variable.\n * URLs can be separated by commas, spaces, or newlines.\n *\n * @returns Array of URL strings\n */\nexport function loadUrlsFromEnv(): string[] {\n  const raw = process.env[ENV_VARS.URLS];\n  if (!raw) {\n    return [];\n  }\n  return raw\n    .split(/[,\\s]+/)\n    .map((s) => s.trim())\n    .filter(Boolean);\n}\n\n/**\n * Loads configuration file paths from the FIRE_SIGNAL_CONFIG_PATH environment variable.\n * Paths can be separated by colons, semicolons, or newlines.\n *\n * @returns Array of file paths\n */\nexport function loadConfigPathsFromEnv(): string[] {\n  const raw = process.env[ENV_VARS.CONFIG_PATH];\n  if (!raw) {\n    return [];\n  }\n  return raw\n    .split(/[:;\\n\\r]+/)\n    .map((s) => s.trim())\n    .filter(Boolean);\n}\n","/**\n * Tag filtering utilities for fire-signal.\n */\n\n/**\n * Represents a URL entry with optional tags.\n */\nexport interface TaggedUrl {\n  url: string;\n  tags: string[];\n}\n\n/**\n * Filters URLs by tags.\n * If no filter tags are provided, all URLs are returned.\n * If filter tags are provided, only URLs with at least one matching tag are returned.\n *\n * @param entries - Array of tagged URL entries\n * @param filterTags - Tags to filter by (optional)\n * @returns Filtered array of URL strings\n */\nexport function filterByTags(\n  entries: TaggedUrl[],\n  filterTags?: string[]\n): string[] {\n  if (!filterTags || filterTags.length === 0) {\n    return entries.map((e) => e.url);\n  }\n\n  const filterSet = new Set(filterTags.map((t) => t.toLowerCase()));\n\n  return entries\n    .filter((entry) => {\n      if (!entry.tags || entry.tags.length === 0) {\n        return false;\n      }\n      return entry.tags.some((tag) => filterSet.has(tag.toLowerCase()));\n    })\n    .map((e) => e.url);\n}\n\n/**\n * Parses a comma-separated tag string into an array.\n *\n * @param tagString - Comma or space separated tags\n * @returns Array of tags\n */\nexport function parseTags(tagString: string): string[] {\n  return tagString\n    .split(/[,\\s]+/)\n    .map((t) => t.trim().toLowerCase())\n    .filter(Boolean);\n}\n","/**\n * Simple logger utility for fire-signal.\n */\n\n/**\n * Available log levels.\n * - silent: No output\n * - error: Only errors\n * - warn: Errors and warnings\n * - info: Errors, warnings, and info\n * - debug: All output including debug\n */\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'debug';\n\nexport type LoggerFn = (message: string, level?: LogLevel) => void;\n\n/**\n * Log level priority (higher = more severe/important).\n */\nexport const LOG_LEVELS: Record<LogLevel, number> = {\n  silent: -1,\n  debug: 0,\n  info: 1,\n  warn: 2,\n  error: 3,\n};\n\n/**\n * Creates a console logger.\n *\n * @param minLevel - Minimum log level to output\n * @returns A logger function\n */\nexport function createConsoleLogger(minLevel: LogLevel = 'info'): LoggerFn {\n  if (minLevel === 'silent') {\n    return silentLogger;\n  }\n\n  return (message: string, level: LogLevel = 'info') => {\n    if (level === 'silent') return;\n    if (LOG_LEVELS[level] >= LOG_LEVELS[minLevel]) {\n      const prefix = `[fire-signal] [${level.toUpperCase()}]`;\n      switch (level) {\n        case 'debug':\n          console.debug(`${prefix} ${message}`);\n          break;\n        case 'info':\n          console.info(`${prefix} ${message}`);\n          break;\n        case 'warn':\n          console.warn(`${prefix} ${message}`);\n          break;\n        case 'error':\n          console.error(`${prefix} ${message}`);\n          break;\n      }\n    }\n  };\n}\n\n/**\n * A no-op logger that does nothing.\n */\nexport const silentLogger: LoggerFn = () => {};\n","import type { FSMessage } from './Message';\nimport { TemplateManager } from './templates';\nimport { ResilienceManager, ResilienceConfig } from './resilience';\nimport {\n  FSPlatformError,\n  FSProviderNotFoundError,\n  ResilienceError,\n} from './errors';\nimport type { FSProvider, FSProviderResult } from '../providers/base/Provider';\nimport { createDefaultProviders } from '../providers';\nimport { loadFSConfig, FSConfigEntry } from '../config/ConfigLoader';\nimport { loadUrlsFromEnv, loadConfigPathsFromEnv } from '../config/env';\nimport { filterByTags, TaggedUrl } from '../config/tags';\nimport {\n  LoggerFn,\n  LogLevel,\n  silentLogger,\n  createConsoleLogger,\n} from '../utils/logger';\nimport { FireProvider } from '../providers/fire/FireProvider';\n\n/**\n * Context passed to onError handlers.\n */\nexport interface FSErrorContext {\n  /** The provider ID that failed */\n  providerId: string;\n  /** The URL that was being used */\n  url: string;\n  /** The original message being sent */\n  message: FSMessage;\n  /** Tags used in this send operation */\n  tags?: string[];\n}\n\n/**\n * Error handler configuration.\n */\nexport interface FSOnErrorConfig {\n  /**\n   * Tags to automatically notify when a send fails.\n   * These tags will not be used if they caused the original failure (to prevent loops).\n   */\n  fallbackTags?: string[];\n  /**\n   * Custom message function for fallback notifications.\n   */\n  message?: (error: Error, context: FSErrorContext) => string;\n  /**\n   * External callback for additional error handling (e.g., send to Sentry).\n   */\n  callback?: (error: Error, context: FSErrorContext) => void | Promise<void>;\n}\n\n/**\n * Options for creating a FireSignal instance.\n */\nexport interface FireSignalOptions {\n  /** Initial URLs to add. */\n  urls?: string[];\n  /** Custom providers to register (in addition to built-in ones). */\n  providers?: FSProvider[];\n  /** Logger function for debugging. */\n  logger?: LoggerFn;\n  /**\n   * Log level. Uses console logger at this level.\n   * Overridden if custom `logger` is provided.\n   * @default 'silent'\n   */\n  logLevel?: LogLevel;\n  /** Additional config file paths to load. */\n  configPaths?: string[];\n  /** Whether to automatically load config from default paths. @default true */\n  autoLoadConfig?: boolean;\n  /** Whether to skip registering built-in providers. @default false */\n  skipDefaultProviders?: boolean;\n  /**\n   * Error handler configuration.\n   * Called when a provider fails to send a notification.\n   */\n  onError?: FSOnErrorConfig;\n\n  /**\n   * Resilience configuration for rate limiting and circuit breaker.\n   */\n  resilience?: ResilienceConfig;\n\n  /**\n   * Notification mode.\n   * - 'enabled': Normal operation, sends notifications (default)\n   * - 'disabled': Silent, skips all sends\n   * - 'dryRun': Logs but doesn't send\n   * @default 'enabled'\n   */\n  mode?: 'enabled' | 'disabled' | 'dryRun';\n\n  /**\n   * When true, platform-only APIs throw if fire:// provider is not configured.\n   * When false (default), they warn and no-op.\n   */\n  strictPlatformProvider?: boolean;\n\n  /** Request timeout for platform ingestion/evaluate API calls. */\n  platformTimeoutMs?: number;\n\n  /** Max retries for transient platform request failures. */\n  platformMaxRetries?: number;\n\n  /** Track batching configuration. */\n  trackBatch?: {\n    enabled?: boolean;\n    flushIntervalMs?: number;\n    maxBatchSize?: number;\n    maxQueueSize?: number;\n    autoFlushOnExit?: boolean;\n    flushOnExitTimeoutMs?: number;\n  };\n}\n\n/**\n * Options for sending a notification.\n */\nexport interface SendOptions {\n  /** Tags to filter URLs. Only URLs with matching tags will receive the notification. */\n  tags?: string[];\n  /**\n   * Fire Platform audience labels (forwarded only by FireProvider).\n   * This is independent from `tags`, which are used for provider routing.\n   */\n  audience?: string[];\n  /**\n   * Fire Platform segment identifier (forwarded only by FireProvider).\n   * When provided, Fire Platform routes by segment.\n   */\n  segmentId?: string;\n  /**\n   * Fire Platform template key (forwarded only by FireProvider).\n   * Fire Platform resolves this key to the corresponding server-side template.\n   */\n  templateKey?: string;\n  /**\n   * Parameters to replace placeholders in URLs.\n   * Placeholders use {name} format and will be replaced with the corresponding value.\n   * @example\n   * ```typescript\n   * fire.add('mailto://...?to={email}', ['user']);\n   * await fire.send(msg, { params: { email: 'user@example.com' } });\n   * ```\n   */\n  params?: Record<string, string>;\n}\n\nexport interface PlatformCallOptions {\n  tags?: string[];\n  params?: Record<string, string>;\n}\n\nexport interface TrackPayload {\n  occurredAt?: string;\n  user?: { id: string };\n  company?: { id: string };\n  properties?: Record<string, unknown>;\n  [key: string]: unknown;\n}\n\nexport interface IdentifyTraits {\n  [key: string]: unknown;\n}\n\nexport interface IncidentReportPayload {\n  title?: string;\n  code: string;\n  fingerprint: string;\n  severity: 'P1' | 'P2' | 'P3' | 'P4';\n  message?: string;\n  metadata?: Record<string, unknown>;\n  occurredAt?: string;\n}\n\nexport interface FlagsContext {\n  user?: { id: string };\n  company?: { id: string };\n  traits?: Record<string, unknown>;\n}\n\nexport interface FlagDecision<T = unknown> {\n  key: string;\n  enabled: boolean;\n  variantKey?: string;\n  value?: T;\n  reason?: string;\n  fetchedAt: string;\n}\n\ntype TrackQueueItem = {\n  eventName: string;\n  payload: TrackPayload;\n  options: PlatformCallOptions;\n  resolve: (value: boolean) => void;\n  reject: (error: Error) => void;\n};\n\n/**\n * Replaces placeholders in a URL with values from params.\n * Placeholders are in {name} format.\n */\nfunction replacePlaceholders(\n  url: string,\n  params: Record<string, string> = {}\n): string {\n  return url.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n    const value = params[key];\n    if (value === undefined) {\n      throw new Error(`Missing param '${key}' for URL placeholder`);\n    }\n    return encodeURIComponent(value);\n  });\n}\n\n/**\n * FireSignal - Unified notification sender.\n *\n * @example\n * ```typescript\n * const fs = new FireSignal({\n *   urls: ['discord://webhookId/webhookToken', 'mailto://user:pass@smtp.example.com']\n * });\n *\n * await fs.send({ title: 'Hello', body: 'World!' });\n * ```\n */\nexport class FireSignal {\n  private entries: TaggedUrl[] = [];\n  private providers: Map<string, FSProvider> = new Map();\n  private logger: LoggerFn;\n  private configPaths: string[];\n  private configLoaded = false;\n  private onErrorConfig?: FSOnErrorConfig;\n  private templateManager: TemplateManager = new TemplateManager();\n  private resilienceManager?: ResilienceManager;\n  private mode: 'enabled' | 'disabled' | 'dryRun' = 'enabled';\n  private strictPlatformProvider = false;\n  private platformTimeoutMs = 5000;\n  private platformMaxRetries = 2;\n  private trackBatchEnabled = true;\n  private trackBatchFlushIntervalMs = 1000;\n  private trackBatchMaxBatchSize = 50;\n  private trackBatchMaxQueueSize = 1000;\n  private trackBatchAutoFlushOnExit = false;\n  private trackBatchFlushOnExitTimeoutMs = 1500;\n  private trackQueue: TrackQueueItem[] = [];\n  private trackFlushTimer: ReturnType<typeof setTimeout> | null = null;\n  private trackExitHandlersRegistered = false;\n  private trackExitInProgress = false;\n  private beforeExitHandler?: () => void;\n  private sigintHandler?: () => void;\n  private sigtermHandler?: () => void;\n\n  readonly incident = {\n    report: async (\n      payload: IncidentReportPayload,\n      options: PlatformCallOptions = {}\n    ): Promise<boolean> => this.reportIncident(payload, options),\n  };\n\n  readonly flags = {\n    evaluate: async <T = unknown>(\n      key: string,\n      context: FlagsContext = {},\n      options: PlatformCallOptions = {}\n    ): Promise<FlagDecision<T>> => this.evaluateFlag<T>(key, context, options),\n    isEnabled: async (\n      key: string,\n      context: FlagsContext = {},\n      options: PlatformCallOptions = {}\n    ): Promise<boolean> => {\n      const decision = await this.evaluateFlag(key, context, options);\n      return !!decision.enabled;\n    },\n    getVariantValue: async <T = unknown>(\n      key: string,\n      context: FlagsContext = {},\n      options: PlatformCallOptions = {}\n    ): Promise<T | undefined> => {\n      const decision = await this.evaluateFlag<T>(key, context, options);\n      return decision.value;\n    },\n  };\n\n  constructor(options: FireSignalOptions = {}) {\n    // Set up logger: custom logger takes precedence, then logLevel, then silent\n    if (options.logger) {\n      this.logger = options.logger;\n    } else if (options.logLevel && options.logLevel !== 'silent') {\n      this.logger = createConsoleLogger(options.logLevel);\n    } else {\n      this.logger = silentLogger;\n    }\n\n    this.configPaths = options.configPaths ?? [];\n    this.onErrorConfig = options.onError;\n\n    if (!options.skipDefaultProviders) {\n      for (const provider of createDefaultProviders()) {\n        this.registerProvider(provider);\n      }\n    }\n\n    for (const provider of options.providers ?? []) {\n      this.registerProvider(provider);\n    }\n\n    if (options.urls) {\n      this.add(options.urls);\n    }\n\n    if (options.resilience) {\n      this.resilienceManager = new ResilienceManager(options.resilience);\n    }\n\n    if (options.mode) {\n      this.mode = options.mode;\n    }\n\n    if (typeof options.strictPlatformProvider === 'boolean') {\n      this.strictPlatformProvider = options.strictPlatformProvider;\n    }\n\n    if (typeof options.platformTimeoutMs === 'number') {\n      this.platformTimeoutMs = options.platformTimeoutMs;\n    }\n\n    if (typeof options.platformMaxRetries === 'number') {\n      this.platformMaxRetries = Math.max(0, options.platformMaxRetries);\n    }\n\n    if (options.trackBatch) {\n      if (typeof options.trackBatch.enabled === 'boolean') {\n        this.trackBatchEnabled = options.trackBatch.enabled;\n      }\n      if (typeof options.trackBatch.flushIntervalMs === 'number') {\n        this.trackBatchFlushIntervalMs = Math.max(\n          100,\n          options.trackBatch.flushIntervalMs\n        );\n      }\n      if (typeof options.trackBatch.maxBatchSize === 'number') {\n        this.trackBatchMaxBatchSize = Math.max(\n          1,\n          options.trackBatch.maxBatchSize\n        );\n      }\n      if (typeof options.trackBatch.maxQueueSize === 'number') {\n        this.trackBatchMaxQueueSize = Math.max(\n          1,\n          options.trackBatch.maxQueueSize\n        );\n      }\n      if (typeof options.trackBatch.autoFlushOnExit === 'boolean') {\n        this.trackBatchAutoFlushOnExit = options.trackBatch.autoFlushOnExit;\n      }\n      if (typeof options.trackBatch.flushOnExitTimeoutMs === 'number') {\n        this.trackBatchFlushOnExitTimeoutMs = Math.max(\n          100,\n          options.trackBatch.flushOnExitTimeoutMs\n        );\n      }\n    }\n\n    if (this.trackBatchEnabled && this.trackBatchAutoFlushOnExit) {\n      this.registerTrackExitHandlers();\n    }\n  }\n\n  /**\n   * Registers a provider for its supported schemas.\n   */\n  registerProvider(provider: FSProvider): void {\n    for (const schema of provider.schemas) {\n      this.providers.set(schema.toLowerCase(), provider);\n      this.logger(\n        `Registered provider '${provider.id}' for schema '${schema}'`,\n        'debug'\n      );\n    }\n  }\n\n  /**\n   * Adds one or more URLs to send notifications to.\n   *\n   * @param urlOrUrls - URL string or array of URLs\n   * @param tags - Optional tags to associate with these URLs\n   */\n  add(urlOrUrls: string | string[], tags: string[] = []): void {\n    const urls = Array.isArray(urlOrUrls) ? urlOrUrls : [urlOrUrls];\n    for (const url of urls) {\n      if (url?.trim()) {\n        this.entries.push({ url: url.trim(), tags });\n        this.logger(`Added URL: ${url}`, 'debug');\n      }\n    }\n  }\n\n  /**\n   * Register a message template from a file.\n   *\n   * Template files support frontmatter for title:\n   * ```\n   * ---\n   * title: Hello {{name}}!\n   * ---\n   * Welcome to our service, {{name}}.\n   * ```\n   *\n   * @param name - Unique template identifier.\n   * @param filePath - Path to the template file.\n   */\n  async registerTemplate(name: string, filePath: string): Promise<void> {\n    await this.templateManager.register(name, filePath);\n    this.logger(`Registered template: ${name}`, 'debug');\n  }\n\n  /**\n   * Register a message template inline (no file).\n   *\n   * @param name - Unique template identifier.\n   * @param template - Object with title (optional) and body Handlebars templates.\n   */\n  registerTemplateInline(\n    name: string,\n    template: { title?: string; body: string }\n  ): void {\n    this.templateManager.registerInline(name, template);\n    this.logger(`Registered inline template: ${name}`, 'debug');\n  }\n\n  /**\n   * Send a message using a registered template.\n   *\n   * @param templateName - Name of the registered template.\n   * @param data - Data object for variable substitution.\n   * @param options - Send options (tags, params).\n   * @returns Array of results from each provider.\n   *\n   * @example\n   * ```typescript\n   * fire.registerTemplateInline('alert', {\n   *   title: 'Alert: {{severity}}',\n   *   body: 'Service {{service}} is {{status}}.',\n   * });\n   *\n   * await fire.sendTemplate('alert', {\n   *   severity: 'HIGH',\n   *   service: 'API Gateway',\n   *   status: 'DOWN',\n   * }, { tags: ['ops'] });\n   * ```\n   */\n  async sendTemplate(\n    templateName: string,\n    data: Record<string, unknown>,\n    options: SendOptions = {}\n  ): Promise<FSProviderResult[]> {\n    const message = this.templateManager.render(templateName, data);\n    return this.send(message, options);\n  }\n\n  private addFromConfig(entries: FSConfigEntry[]): void {\n    for (const entry of entries) {\n      this.entries.push({ url: entry.url, tags: entry.tags ?? [] });\n    }\n  }\n\n  /**\n   * Loads configuration from files and environment variables.\n   *\n   * @param path - Optional path to a specific config file. If provided, loads only that file.\n   *               If not provided, auto-detects environment config (fire-signal.{NODE_ENV}.yml).\n   */\n  async loadConfig(path?: string): Promise<void> {\n    if (this.configLoaded && !path) return;\n\n    this.logger('Loading configuration...', 'debug');\n\n    // If specific path provided, load only that file\n    if (path) {\n      const config = await loadFSConfig([path]);\n      if (config.entries.length > 0) {\n        this.logger(\n          `Loaded ${config.entries.length} URLs from ${path}`,\n          'debug'\n        );\n        this.addFromConfig(config.entries);\n      }\n      return;\n    }\n\n    const envUrls = loadUrlsFromEnv();\n    if (envUrls.length > 0) {\n      this.logger(`Found ${envUrls.length} URLs from environment`, 'debug');\n      this.add(envUrls);\n    }\n\n    const envConfigPaths = loadConfigPathsFromEnv();\n\n    // Auto-detect environment-specific config files\n    const nodeEnv = process.env.NODE_ENV;\n    const envSpecificPaths = nodeEnv\n      ? [`fire-signal.${nodeEnv}.yml`, `fire-signal.${nodeEnv}.yaml`]\n      : [];\n\n    const allConfigPaths = [\n      ...envSpecificPaths,\n      ...this.configPaths,\n      ...envConfigPaths,\n    ];\n    const config = await loadFSConfig(allConfigPaths);\n\n    if (config.entries.length > 0) {\n      this.logger(\n        `Loaded ${config.entries.length} URLs from config files`,\n        'debug'\n      );\n      this.addFromConfig(config.entries);\n    }\n\n    this.configLoaded = true;\n  }\n\n  /** Returns all registered URLs. */\n  getUrls(): string[] {\n    return this.entries.map((e) => e.url);\n  }\n\n  /** Returns all entries with tags. */\n  getEntries(): TaggedUrl[] {\n    return [...this.entries];\n  }\n\n  /** Gets a provider by schema. */\n  getProvider(schema: string): FSProvider | undefined {\n    return this.providers.get(schema.toLowerCase());\n  }\n\n  private extractSchema(url: string): string {\n    const match = url.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):/);\n    return match?.[1]?.toLowerCase() ?? '';\n  }\n\n  /**\n   * Sends a notification to all configured URLs.\n   *\n   * @param message - The message to send\n   * @param options - Send options (e.g., tag filtering)\n   * @returns Array of results from each provider\n   */\n  async send(\n    message: FSMessage,\n    options: SendOptions = {}\n  ): Promise<FSProviderResult[]> {\n    const results: FSProviderResult[] = [];\n\n    // Check mode\n    if (this.mode === 'disabled') {\n      return results;\n    }\n\n    const urls = filterByTags(this.entries, options.tags);\n\n    if (urls.length === 0) {\n      this.logger('No URLs to send to', 'warn');\n      return results;\n    }\n\n    // DryRun mode: log but don't send\n    if (this.mode === 'dryRun') {\n      this.logger(\n        `[DRY RUN] Would send to ${urls.length} URL(s): ${message.title || message.body.slice(0, 50)}`,\n        'info'\n      );\n      return urls.map(() => ({ success: true, providerId: 'dry-run' }));\n    }\n\n    this.logger(`Sending to ${urls.length} URL(s)`, 'info');\n\n    for (const rawUrl of urls) {\n      // Replace placeholders in URL with params\n      let processedUrl: string;\n      try {\n        processedUrl = replacePlaceholders(rawUrl, options.params);\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error(String(error));\n        results.push({ success: false, providerId: 'unknown', error: err });\n        this.logger(`URL placeholder error: ${err.message}`, 'error');\n        continue;\n      }\n\n      const schema = this.extractSchema(processedUrl);\n      const provider = this.providers.get(schema);\n\n      if (!provider) {\n        results.push({\n          success: false,\n          providerId: schema || 'unknown',\n          error: new FSProviderNotFoundError(schema),\n        });\n        this.logger(`No provider for schema: ${schema}`, 'warn');\n        continue;\n      }\n\n      try {\n        // Check resilience (rate limit / circuit breaker)\n        if (this.resilienceManager) {\n          try {\n            this.resilienceManager.checkAllowed(provider.id);\n          } catch (error) {\n            if (error instanceof ResilienceError) {\n              results.push({ success: false, providerId: provider.id, error });\n              this.logger(`[${provider.id}] BLOCKED: ${error.message}`, 'warn');\n              continue;\n            }\n            throw error;\n          }\n        }\n\n        const parsed = provider.parseUrl(processedUrl);\n        this.logger(`Sending via ${provider.id}...`, 'debug');\n\n        const result = await provider.send(message, {\n          url: processedUrl,\n          parsed,\n          tags: options.tags,\n          audience: options.audience,\n          segmentId: options.segmentId,\n          templateKey: options.templateKey,\n        });\n        results.push(result);\n\n        if (result.success) {\n          this.resilienceManager?.recordSuccess(provider.id);\n          this.logger(`[${provider.id}] OK`, 'info');\n        } else {\n          this.resilienceManager?.recordFailure(provider.id);\n          this.logger(\n            `[${provider.id}] FAILED: ${result.error?.message}`,\n            'error'\n          );\n          // Call error handler\n          await this.handleError(result.error ?? new Error('Unknown error'), {\n            providerId: provider.id,\n            url: processedUrl,\n            message,\n            tags: options.tags,\n          });\n        }\n      } catch (error) {\n        this.resilienceManager?.recordFailure(provider.id);\n        const err = error instanceof Error ? error : new Error(String(error));\n        results.push({ success: false, providerId: provider.id, error: err });\n        this.logger(`[${provider.id}] ERROR: ${err.message}`, 'error');\n        // Call error handler\n        await this.handleError(err, {\n          providerId: provider.id,\n          url: processedUrl,\n          message,\n          tags: options.tags,\n        });\n      }\n    }\n\n    return results;\n  }\n\n  async track(\n    eventName: string,\n    payload: TrackPayload = {},\n    options: PlatformCallOptions = {}\n  ): Promise<boolean> {\n    if (!eventName?.trim()) {\n      throw new FSPlatformError(\n        'eventName is required',\n        'validation',\n        422,\n        false\n      );\n    }\n\n    if (!this.trackBatchEnabled) {\n      const body = this.normalizeTrackPayload(eventName.trim(), payload);\n      await this.platformPost('/v1/events/track', body, options);\n      return true;\n    }\n\n    return this.enqueueTrack(eventName.trim(), payload, options);\n  }\n\n  async flush(): Promise<void> {\n    await this.flushTrackQueue();\n  }\n\n  async dispose(): Promise<void> {\n    await this.flush();\n    this.unregisterTrackExitHandlers();\n  }\n\n  private enqueueTrack(\n    eventName: string,\n    payload: TrackPayload,\n    options: PlatformCallOptions\n  ): Promise<boolean> {\n    if (this.trackQueue.length >= this.trackBatchMaxQueueSize) {\n      return Promise.reject(\n        new FSPlatformError(\n          'Track queue is full',\n          'configuration',\n          undefined,\n          false\n        )\n      );\n    }\n\n    return new Promise<boolean>((resolve, reject) => {\n      this.trackQueue.push({\n        eventName,\n        payload,\n        options,\n        resolve,\n        reject,\n      });\n\n      if (this.trackQueue.length >= this.trackBatchMaxBatchSize) {\n        void this.flushTrackQueue();\n        return;\n      }\n\n      if (!this.trackFlushTimer) {\n        this.trackFlushTimer = setTimeout(() => {\n          this.trackFlushTimer = null;\n          void this.flushTrackQueue();\n        }, this.trackBatchFlushIntervalMs);\n        if (typeof this.trackFlushTimer.unref === 'function') {\n          this.trackFlushTimer.unref();\n        }\n      }\n    });\n  }\n\n  private registerTrackExitHandlers(): void {\n    if (this.trackExitHandlersRegistered) return;\n    if (typeof process === 'undefined' || typeof process.on !== 'function')\n      return;\n\n    this.beforeExitHandler = () => {\n      void this.flushTrackQueueWithTimeout(this.trackBatchFlushOnExitTimeoutMs);\n    };\n\n    this.sigintHandler = () => {\n      void this.handleTrackSignalExit(130);\n    };\n\n    this.sigtermHandler = () => {\n      void this.handleTrackSignalExit(143);\n    };\n\n    process.on('beforeExit', this.beforeExitHandler);\n    process.on('SIGINT', this.sigintHandler);\n    process.on('SIGTERM', this.sigtermHandler);\n    this.trackExitHandlersRegistered = true;\n  }\n\n  private unregisterTrackExitHandlers(): void {\n    if (!this.trackExitHandlersRegistered) return;\n    if (typeof process === 'undefined' || typeof process.off !== 'function')\n      return;\n\n    if (this.beforeExitHandler)\n      process.off('beforeExit', this.beforeExitHandler);\n    if (this.sigintHandler) process.off('SIGINT', this.sigintHandler);\n    if (this.sigtermHandler) process.off('SIGTERM', this.sigtermHandler);\n\n    this.beforeExitHandler = undefined;\n    this.sigintHandler = undefined;\n    this.sigtermHandler = undefined;\n    this.trackExitHandlersRegistered = false;\n  }\n\n  private async handleTrackSignalExit(code: number): Promise<void> {\n    if (this.trackExitInProgress) return;\n    this.trackExitInProgress = true;\n\n    try {\n      await this.flushTrackQueueWithTimeout(\n        this.trackBatchFlushOnExitTimeoutMs\n      );\n    } finally {\n      process.exit(code);\n    }\n  }\n\n  private async flushTrackQueueWithTimeout(timeoutMs: number): Promise<void> {\n    const timeout = new Promise<void>((resolve) => {\n      const timer = setTimeout(() => resolve(), timeoutMs);\n      if (typeof timer.unref === 'function') {\n        timer.unref();\n      }\n    });\n\n    await Promise.race([this.flushTrackQueue(), timeout]);\n  }\n\n  private async flushTrackQueue(): Promise<void> {\n    if (this.trackQueue.length === 0) return;\n\n    if (this.trackFlushTimer) {\n      clearTimeout(this.trackFlushTimer);\n      this.trackFlushTimer = null;\n    }\n\n    const batch = this.trackQueue.splice(0, this.trackBatchMaxBatchSize);\n\n    for (const item of batch) {\n      try {\n        const body = this.normalizeTrackPayload(item.eventName, item.payload);\n        await this.platformPost('/v1/events/track', body, item.options);\n        item.resolve(true);\n      } catch (error) {\n        item.reject(error instanceof Error ? error : new Error(String(error)));\n      }\n    }\n\n    if (this.trackQueue.length > 0) {\n      await this.flushTrackQueue();\n    }\n  }\n\n  async identify(\n    externalId: string,\n    traits: IdentifyTraits = {},\n    options: PlatformCallOptions = {}\n  ): Promise<boolean> {\n    if (!externalId?.trim()) {\n      throw new FSPlatformError(\n        'externalId is required',\n        'validation',\n        422,\n        false\n      );\n    }\n\n    await this.platformPost(\n      '/v1/customers/identify',\n      {\n        externalId: externalId.trim(),\n        traits,\n      },\n      options\n    );\n\n    return true;\n  }\n\n  private async reportIncident(\n    payload: IncidentReportPayload,\n    options: PlatformCallOptions = {}\n  ): Promise<boolean> {\n    if (!payload?.code?.trim()) {\n      throw new FSPlatformError(\n        'incident.code is required',\n        'validation',\n        422,\n        false\n      );\n    }\n    if (!payload?.fingerprint?.trim()) {\n      throw new FSPlatformError(\n        'incident.fingerprint is required',\n        'validation',\n        422,\n        false\n      );\n    }\n\n    await this.platformPost('/v1/incidents/report', { ...payload }, options);\n\n    return true;\n  }\n\n  private async evaluateFlag<T = unknown>(\n    key: string,\n    context: FlagsContext = {},\n    options: PlatformCallOptions = {}\n  ): Promise<FlagDecision<T>> {\n    if (!key?.trim()) {\n      throw new FSPlatformError(\n        'flag key is required',\n        'validation',\n        422,\n        false\n      );\n    }\n\n    const response = await this.platformPost<{ results?: Record<string, any> }>(\n      '/v1/flags/evaluate',\n      {\n        flags: [key],\n        context,\n      },\n      options\n    );\n\n    const result = response?.results?.[key];\n    if (!result) {\n      return {\n        key,\n        enabled: false,\n        fetchedAt: new Date().toISOString(),\n        reason: 'missing_result',\n      };\n    }\n\n    return {\n      key,\n      enabled: !!result.enabled,\n      variantKey: result.variant,\n      value: (result.value ?? result.variant) as T | undefined,\n      reason: result.reason,\n      fetchedAt: new Date().toISOString(),\n    };\n  }\n\n  private normalizeTrackPayload(\n    eventName: string,\n    payload: TrackPayload\n  ): Record<string, unknown> {\n    const { occurredAt, user, company, properties, ...rest } = payload;\n\n    const hasExplicitProperties = typeof properties === 'object' && properties;\n    const hasTopLevelExtra = Object.keys(rest).length > 0;\n\n    return {\n      eventName,\n      ...(occurredAt ? { occurredAt } : {}),\n      ...(user ? { user } : {}),\n      ...(company ? { company } : {}),\n      ...(hasExplicitProperties\n        ? { properties }\n        : hasTopLevelExtra\n          ? { properties: rest }\n          : {}),\n    };\n  }\n\n  private resolvePlatformTarget(options: PlatformCallOptions): {\n    apiKey: string;\n    host: string;\n    protocol: 'http' | 'https';\n  } | null {\n    const urls = filterByTags(this.entries, options.tags);\n\n    for (const raw of urls) {\n      const processed = replacePlaceholders(raw, options.params ?? {});\n      if (!processed.toLowerCase().startsWith('fire://')) continue;\n\n      const fireProvider = this.providers.get('fire') as\n        | FireProvider\n        | undefined;\n      if (!fireProvider) continue;\n\n      const parsed = fireProvider.parseUrl(processed);\n      const apiKey = parsed.username;\n      const hostname = parsed.hostname;\n      const host = hostname\n        ? parsed.port\n          ? `${hostname}:${parsed.port}`\n          : hostname\n        : undefined;\n\n      if (!apiKey || !host) continue;\n\n      const isLocalHost =\n        parsed.hostname?.includes('localhost') ||\n        parsed.hostname === '127.0.0.1';\n      return {\n        apiKey,\n        host,\n        protocol: isLocalHost ? 'http' : 'https',\n      };\n    }\n\n    return null;\n  }\n\n  private async platformPost<T = unknown>(\n    endpoint: string,\n    body: Record<string, unknown>,\n    options: PlatformCallOptions = {}\n  ): Promise<T | undefined> {\n    const target = this.resolvePlatformTarget(options);\n\n    if (!target) {\n      const message =\n        'Fire Platform provider not configured. Add fire://<api_key> or fire://<api_key>@<host>.';\n      if (this.strictPlatformProvider) {\n        throw new FSPlatformError(message, 'configuration', undefined, false);\n      }\n      this.logger(message, 'warn');\n      return undefined;\n    }\n\n    const url = `${target.protocol}://${target.host}${endpoint}`;\n\n    let attempt = 0;\n    let lastError: Error | null = null;\n\n    while (attempt <= this.platformMaxRetries) {\n      attempt += 1;\n      const controller = new AbortController();\n      const timeout = setTimeout(\n        () => controller.abort(),\n        this.platformTimeoutMs\n      );\n\n      try {\n        const response = await fetch(url, {\n          method: 'POST',\n          headers: {\n            Authorization: `Bearer ${target.apiKey}`,\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify(body),\n          signal: controller.signal,\n        });\n\n        if (!response.ok) {\n          const text = await response.text().catch(() => '');\n          const category: FSPlatformError['category'] =\n            response.status === 401 || response.status === 403\n              ? 'auth'\n              : response.status >= 400 && response.status < 500\n                ? 'validation'\n                : 'transient';\n          const retryable = this.shouldRetryStatus(response.status);\n\n          const err = new FSPlatformError(\n            `Fire Platform request failed (${response.status} ${response.statusText})`,\n            category,\n            response.status,\n            retryable,\n            text\n          );\n\n          if (!retryable || attempt > this.platformMaxRetries) {\n            throw err;\n          }\n\n          lastError = err;\n          await this.sleepWithJitter(attempt);\n          continue;\n        }\n\n        const data = (await response.json().catch(() => ({}))) as T;\n        return data;\n      } catch (error) {\n        const rawError =\n          error instanceof Error ? error : new Error(String(error));\n        const abortError = rawError.name === 'AbortError';\n\n        const err = abortError\n          ? new FSPlatformError(\n              'Fire Platform request timeout',\n              'transient',\n              408,\n              true\n            )\n          : rawError instanceof FSPlatformError\n            ? rawError\n            : new FSPlatformError(\n                rawError.message,\n                this.isTransientError(rawError) ? 'network' : 'validation',\n                undefined,\n                this.isTransientError(rawError)\n              );\n\n        if (!err.retryable) {\n          throw err;\n        }\n\n        if (attempt > this.platformMaxRetries) {\n          throw err;\n        }\n\n        lastError = err;\n        await this.sleepWithJitter(attempt);\n      } finally {\n        clearTimeout(timeout);\n      }\n    }\n\n    throw (\n      lastError ??\n      new FSPlatformError(\n        'Unknown platform request error',\n        'transient',\n        undefined,\n        true\n      )\n    );\n  }\n\n  private shouldRetryStatus(status: number): boolean {\n    if (status === 408 || status === 429) return true;\n    if (status >= 500) return true;\n    return false;\n  }\n\n  private isTransientError(error: Error): boolean {\n    const message = error.message.toLowerCase();\n    return (\n      message.includes('fetch failed') ||\n      message.includes('network') ||\n      message.includes('timeout') ||\n      message.includes('socket') ||\n      message.includes('econn')\n    );\n  }\n\n  private async sleepWithJitter(attempt: number): Promise<void> {\n    const base = 150;\n    const backoff = base * 2 ** Math.max(0, attempt - 1);\n    const jitter = Math.floor(Math.random() * 120);\n    const delay = backoff + jitter;\n    await new Promise((resolve) => setTimeout(resolve, delay));\n  }\n\n  /**\n   * Handles errors by calling fallback notifications and/or external callback.\n   */\n  private async handleError(\n    error: Error,\n    context: FSErrorContext\n  ): Promise<void> {\n    if (!this.onErrorConfig) return;\n\n    const { fallbackTags, message: messageFn, callback } = this.onErrorConfig;\n\n    // Call external callback first\n    if (callback) {\n      try {\n        await callback(error, context);\n      } catch (callbackErr) {\n        this.logger(\n          `onError callback failed: ${callbackErr instanceof Error ? callbackErr.message : String(callbackErr)}`,\n          'error'\n        );\n      }\n    }\n\n    // Send to fallback tags (avoiding the same tags that caused the failure)\n    if (fallbackTags && fallbackTags.length > 0) {\n      const safeTags = fallbackTags.filter((t) => !context.tags?.includes(t));\n      this.logger(\n        `onError: fallbackTags=${JSON.stringify(fallbackTags)}, safeTags=${JSON.stringify(safeTags)}`,\n        'debug'\n      );\n\n      if (safeTags.length > 0) {\n        // Build descriptive fallback message\n        const originalTitle = context.message.title\n          ? `\\n📨 Original: \"${context.message.title}\"`\n          : '';\n\n        const fallbackMessage =\n          messageFn?.(error, context) ??\n          `🚨 Provider: ${context.providerId}\\n❌ Error: ${error.message}${originalTitle}`;\n\n        this.logger(\n          `onError: Sending fallback to tags: ${safeTags.join(', ')}`,\n          'debug'\n        );\n\n        try {\n          // Use internal send without triggering another error handler\n          const results = await this.sendInternal(\n            { title: '⚠️ Fire-Signal Error', body: fallbackMessage },\n            { tags: safeTags }\n          );\n          this.logger(\n            `onError: Fallback results: ${results.map((r) => `${r.providerId}=${r.success}`).join(', ')}`,\n            'debug'\n          );\n        } catch (fallbackErr) {\n          this.logger(\n            `Fallback notification failed: ${fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr)}`,\n            'error'\n          );\n        }\n      }\n    }\n  }\n\n  /**\n   * Internal send that doesn't trigger error handlers (to avoid infinite loops).\n   */\n  private async sendInternal(\n    message: FSMessage,\n    options: SendOptions = {}\n  ): Promise<FSProviderResult[]> {\n    const results: FSProviderResult[] = [];\n    const urls = filterByTags(this.entries, options.tags);\n\n    for (const rawUrl of urls) {\n      let processedUrl: string;\n      try {\n        processedUrl = replacePlaceholders(rawUrl, options.params);\n      } catch {\n        continue;\n      }\n\n      const schema = this.extractSchema(processedUrl);\n      const provider = this.providers.get(schema);\n      if (!provider) continue;\n\n      try {\n        const parsed = provider.parseUrl(processedUrl);\n        const result = await provider.send(message, {\n          url: processedUrl,\n          parsed,\n          tags: options.tags,\n          audience: options.audience,\n          segmentId: options.segmentId,\n          templateKey: options.templateKey,\n        });\n        results.push(result);\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error(String(error));\n        results.push({ success: false, providerId: provider.id, error: err });\n      }\n    }\n\n    return results;\n  }\n}\n","/**\n * Stdin reading utility for CLI.\n */\n\n/**\n * Reads body from stdin if not provided via arguments.\n * Returns immediately if body is already provided.\n *\n * @param body - Optional body from CLI arguments\n * @returns Body string (from argument or stdin)\n */\nexport async function readStdinIfEmpty(body?: string): Promise<string> {\n  // If body is provided, use it\n  if (body !== undefined && body !== null && body !== '') {\n    return body;\n  }\n\n  // Check if stdin is a TTY (interactive terminal)\n  // If it is, there's no piped input to read\n  if (process.stdin.isTTY) {\n    return '';\n  }\n\n  // Read from stdin\n  const chunks: Buffer[] = [];\n\n  for await (const chunk of process.stdin) {\n    chunks.push(Buffer.from(chunk as Buffer | string));\n  }\n\n  return Buffer.concat(chunks).toString('utf8').trim();\n}\n","import { FSParseError } from './errors';\n\n/**\n * Represents a parsed notification URL.\n */\nexport interface FSParsedUrl {\n  /**\n   * The URL schema/protocol (e.g., 'mailto', 'discord', 'slack').\n   */\n  schema: string;\n\n  /**\n   * Hostname portion of the URL.\n   */\n  hostname?: string;\n\n  /**\n   * Port number if specified.\n   */\n  port?: number;\n\n  /**\n   * Username for authentication.\n   */\n  username?: string;\n\n  /**\n   * Password for authentication.\n   */\n  password?: string;\n\n  /**\n   * Path portion of the URL (without leading slash).\n   */\n  path?: string;\n\n  /**\n   * Path split into segments.\n   */\n  segments: string[];\n\n  /**\n   * Query parameters parsed from the URL.\n   * Values can be strings or arrays for repeated params.\n   */\n  params: Record<string, string | string[]>;\n\n  /**\n   * The original raw URL string.\n   */\n  raw: string;\n}\n\n/**\n * Parses a fire-signal notification URL into its components.\n *\n * Supports various URL formats like:\n * - mailto://user:pass@smtp.example.com?to=email@example.com\n * - discord://webhookId/webhookToken\n * - slack://hook/token\n * - tgram://botToken/chatId\n * - json://hostname/path\n * - rocketchat://hostname/webhookToken?channel=#general\n *\n * @param raw - The raw URL string to parse\n * @returns Parsed URL components\n * @throws FSParseError if the URL is invalid\n */\nexport function parseFSUrl(raw: string): FSParsedUrl {\n  if (!raw || typeof raw !== 'string') {\n    throw new FSParseError('URL must be a non-empty string', raw);\n  }\n\n  const trimmed = raw.trim();\n\n  // Extract schema before trying to parse as URL\n  const schemaMatch = trimmed.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\//);\n  if (!schemaMatch) {\n    throw new FSParseError('Invalid URL format: missing schema', raw);\n  }\n\n  const schema = schemaMatch[1]!.toLowerCase();\n\n  // For custom schemas, convert to a parseable format\n  // Replace custom schema with https for URL parsing\n  const normalizedUrl = trimmed.replace(\n    /^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//,\n    'https://'\n  );\n\n  let parsed: URL | null = null;\n  let hostname: string | undefined;\n  let port: number | undefined;\n  let username: string | undefined;\n  let password: string | undefined;\n  let pathWithoutSlash: string = '';\n  const params: Record<string, string | string[]> = {};\n\n  try {\n    parsed = new URL(normalizedUrl);\n  } catch {\n    // Fallback: manual parsing for URLs with numeric hostnames (e.g., Discord webhooks)\n    // Pattern: schema://[user:pass@]host[:port][/path][?query]\n    const afterSchema = trimmed.slice(schemaMatch[0].length);\n\n    // Split by ? to get path and query\n    const [pathPart, queryPart] = afterSchema.split('?');\n\n    // Split path by /\n    const pathSegments = (pathPart ?? '').split('/');\n\n    // First segment might contain auth and host\n    const firstSegment = pathSegments[0] ?? '';\n\n    // Check for auth (user:pass@host)\n    if (firstSegment.includes('@')) {\n      const [authPart, hostPart] = firstSegment.split('@');\n      if (authPart?.includes(':')) {\n        const [user, pass] = authPart.split(':');\n        username = user ? decodeURIComponent(user) : undefined;\n        password = pass ? decodeURIComponent(pass) : undefined;\n      } else {\n        username = authPart ? decodeURIComponent(authPart) : undefined;\n      }\n\n      // Parse host:port\n      if (hostPart?.includes(':')) {\n        const [host, portStr] = hostPart.split(':');\n        hostname = host;\n        const parsedPort = parseInt(portStr ?? '', 10);\n        port = isNaN(parsedPort) ? undefined : parsedPort;\n      } else {\n        hostname = hostPart;\n      }\n    } else {\n      const colonIndex = firstSegment.lastIndexOf(':');\n      if (colonIndex !== -1) {\n        const potentialPort = firstSegment.slice(colonIndex + 1);\n        const parsedPort = parseInt(potentialPort, 10);\n        if (!isNaN(parsedPort) && /^\\d+$/.test(potentialPort)) {\n          hostname = firstSegment.slice(0, colonIndex);\n          port = parsedPort;\n        } else {\n          hostname = firstSegment;\n        }\n      } else {\n        hostname = firstSegment;\n      }\n    }\n\n    pathWithoutSlash = pathSegments.slice(1).join('/');\n\n    if (queryPart) {\n      const searchParams = new URLSearchParams(queryPart);\n      searchParams.forEach((value, key) => {\n        const existing = params[key];\n        if (existing !== undefined) {\n          if (Array.isArray(existing)) {\n            existing.push(value);\n          } else {\n            params[key] = [existing, value];\n          }\n        } else {\n          params[key] = value;\n        }\n      });\n    }\n  }\n\n  if (parsed) {\n    parsed.searchParams.forEach((value, key) => {\n      const existing = params[key];\n      if (existing !== undefined) {\n        if (Array.isArray(existing)) {\n          existing.push(value);\n        } else {\n          params[key] = [existing, value];\n        }\n      } else {\n        params[key] = value;\n      }\n    });\n\n    pathWithoutSlash = parsed.pathname.slice(1);\n    hostname = parsed.hostname || undefined;\n    username = parsed.username\n      ? decodeURIComponent(parsed.username)\n      : undefined;\n    password = parsed.password\n      ? decodeURIComponent(parsed.password)\n      : undefined;\n\n    if (parsed.port) {\n      const parsedPort = parseInt(parsed.port, 10);\n      port = isNaN(parsedPort) ? undefined : parsedPort;\n    }\n  }\n\n  const segments = pathWithoutSlash.split('/').filter(Boolean);\n\n  return {\n    schema,\n    hostname,\n    port,\n    username,\n    password,\n    path: pathWithoutSlash || undefined,\n    segments,\n    params,\n    raw: trimmed,\n  };\n}\n\n/**\n * Checks if a URL string looks like a valid fire-signal URL.\n *\n * @param url - URL string to check\n * @returns true if the URL appears valid\n */\nexport function isValidFSUrl(url: string): boolean {\n  try {\n    parseFSUrl(url);\n    return true;\n  } catch {\n    return false;\n  }\n}\n","/**\n * URL Validator for Fire-Signal.\n *\n * Provides surgical validation errors with specific field information\n * and suggestions for fixing common issues.\n */\n\nimport { parseFSUrl, type FSParsedUrl } from './UrlParser';\nimport { FSValidationError, FSCredentialsError, FSParseError } from './errors';\n\n/**\n * Validation error with contextual information.\n */\nexport interface ValidationError {\n  code: string;\n  message: string;\n  field?: string;\n  suggestion?: string;\n}\n\n/**\n * Validation warning (non-blocking).\n */\nexport interface ValidationWarning {\n  code: string;\n  message: string;\n  field?: string;\n}\n\n/**\n * Result of URL validation.\n */\nexport interface ValidationResult {\n  valid: boolean;\n  parsed?: FSParsedUrl;\n  errors: ValidationError[];\n  warnings: ValidationWarning[];\n}\n\n/**\n * Provider-specific validation rules.\n */\ninterface ProviderValidation {\n  schemas: string[];\n  validate: (parsed: FSParsedUrl) => {\n    errors: ValidationError[];\n    warnings: ValidationWarning[];\n  };\n}\n\n/**\n * SMTP/Email validation rules.\n */\nconst smtpValidation: ProviderValidation = {\n  schemas: ['mailto', 'mailtos'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    // Check for unescaped @ in username\n    if (\n      parsed.username &&\n      parsed.raw.includes('@') &&\n      !parsed.raw.includes('%40')\n    ) {\n      const beforeAt = parsed.raw.split('@')[0];\n      if (beforeAt && beforeAt.includes('@')) {\n        errors.push({\n          code: 'SMTP_UNESCAPED_AT',\n          message: 'Username contains unescaped @ symbol',\n          field: 'username',\n          suggestion:\n            'Encode @ as %40 in the username (e.g., user%40domain.com)',\n        });\n      }\n    }\n\n    // Check for missing 'to' parameter\n    if (!parsed.params.to) {\n      errors.push({\n        code: 'SMTP_MISSING_TO',\n        message: 'Missing required \"to\" parameter',\n        field: 'to',\n        suggestion: 'Add ?to=recipient@example.com to the URL',\n      });\n    }\n\n    // Check for missing credentials\n    if (!parsed.username || !parsed.password) {\n      errors.push({\n        code: 'SMTP_MISSING_CREDENTIALS',\n        message: 'SMTP requires username and password',\n        field: parsed.username ? 'password' : 'username',\n        suggestion: 'Format: mailto://username:password@smtp.example.com',\n      });\n    }\n\n    // Check for missing host\n    if (!parsed.hostname) {\n      errors.push({\n        code: 'SMTP_MISSING_HOST',\n        message: 'Missing SMTP server hostname',\n        field: 'hostname',\n        suggestion: 'Format: mailto://user:pass@smtp.gmail.com?to=...',\n      });\n    }\n\n    // Warn about non-standard ports on mailto (should use mailtos for 465)\n    if (parsed.schema === 'mailto' && parsed.port === 465) {\n      warnings.push({\n        code: 'SMTP_PORT_465_USE_TLS',\n        message: 'Port 465 typically requires TLS',\n        field: 'port',\n      });\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * Discord validation rules.\n */\nconst discordValidation: ProviderValidation = {\n  schemas: ['discord'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    // Discord URL format: discord://webhookId/webhookToken\n    const webhookId = parsed.hostname;\n    const webhookToken = parsed.segments[0];\n\n    if (!webhookId) {\n      errors.push({\n        code: 'DISCORD_MISSING_WEBHOOK_ID',\n        message: 'Missing webhook ID',\n        field: 'webhookId',\n        suggestion: 'Format: discord://WEBHOOK_ID/WEBHOOK_TOKEN',\n      });\n    } else if (!/^\\d+$/.test(webhookId)) {\n      warnings.push({\n        code: 'DISCORD_INVALID_WEBHOOK_ID',\n        message: 'Webhook ID should be numeric',\n        field: 'webhookId',\n      });\n    }\n\n    if (!webhookToken) {\n      errors.push({\n        code: 'DISCORD_MISSING_WEBHOOK_TOKEN',\n        message: 'Missing webhook token',\n        field: 'webhookToken',\n        suggestion: 'Format: discord://WEBHOOK_ID/WEBHOOK_TOKEN',\n      });\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * Telegram validation rules.\n */\nconst telegramValidation: ProviderValidation = {\n  schemas: ['tgram', 'telegram'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    // Telegram URL format: tgram://botToken/chatId\n    const botToken = parsed.hostname;\n    const chatId = parsed.segments[0];\n\n    if (!botToken) {\n      errors.push({\n        code: 'TELEGRAM_MISSING_BOT_TOKEN',\n        message: 'Missing bot token',\n        field: 'botToken',\n        suggestion: 'Get your bot token from @BotFather on Telegram',\n      });\n    }\n\n    if (!chatId) {\n      errors.push({\n        code: 'TELEGRAM_MISSING_CHAT_ID',\n        message: 'Missing chat ID',\n        field: 'chatId',\n        suggestion: 'Get your chat ID from @userinfobot on Telegram',\n      });\n    }\n\n    // Validate parse_mode if provided\n    const parseMode = parsed.params.parse_mode;\n    if (parseMode && typeof parseMode === 'string') {\n      const validModes = ['Markdown', 'MarkdownV2', 'HTML'];\n      if (!validModes.includes(parseMode)) {\n        warnings.push({\n          code: 'TELEGRAM_INVALID_PARSE_MODE',\n          message: `Invalid parse_mode: ${parseMode}`,\n          field: 'parse_mode',\n        });\n      }\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * Slack validation rules.\n */\nconst slackValidation: ProviderValidation = {\n  schemas: ['slack'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    // Slack URL format: slack://T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX\n    const teamId = parsed.hostname;\n    const botId = parsed.segments[0];\n    const token = parsed.segments[1];\n\n    if (!teamId || !teamId.toUpperCase().startsWith('T')) {\n      errors.push({\n        code: 'SLACK_INVALID_TEAM_ID',\n        message: 'Invalid or missing team ID (should start with T)',\n        field: 'teamId',\n        suggestion: 'Format: slack://TXXXXXXXX/BXXXXXXXX/TOKEN',\n      });\n    }\n\n    if (!botId || !botId.toUpperCase().startsWith('B')) {\n      errors.push({\n        code: 'SLACK_INVALID_BOT_ID',\n        message: 'Invalid or missing bot ID (should start with B)',\n        field: 'botId',\n        suggestion: 'Format: slack://TXXXXXXXX/BXXXXXXXX/TOKEN',\n      });\n    }\n\n    if (!token) {\n      errors.push({\n        code: 'SLACK_MISSING_TOKEN',\n        message: 'Missing webhook token',\n        field: 'token',\n        suggestion:\n          'Get the full webhook URL from Slack → Apps → Incoming Webhooks',\n      });\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * ntfy validation rules.\n */\nconst ntfyValidation: ProviderValidation = {\n  schemas: ['ntfy', 'ntfys'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    // ntfy URL format: ntfy://[user:pass@]host/topic\n    const topic = parsed.segments[0] || parsed.path;\n\n    if (!parsed.hostname) {\n      errors.push({\n        code: 'NTFY_MISSING_HOST',\n        message: 'Missing ntfy server hostname',\n        field: 'hostname',\n        suggestion:\n          'Use ntfy.sh for public or your own server: ntfy://ntfy.sh/topic',\n      });\n    }\n\n    if (!topic) {\n      errors.push({\n        code: 'NTFY_MISSING_TOPIC',\n        message: 'Missing topic name',\n        field: 'topic',\n        suggestion: 'Add a topic name: ntfy://ntfy.sh/my-topic',\n      });\n    }\n\n    // Validate priority if provided\n    const priority = parsed.params.priority;\n    if (priority && typeof priority === 'string') {\n      const validPriorities = [\n        'min',\n        'low',\n        'default',\n        'high',\n        'urgent',\n        '1',\n        '2',\n        '3',\n        '4',\n        '5',\n      ];\n      if (!validPriorities.includes(priority.toLowerCase())) {\n        warnings.push({\n          code: 'NTFY_INVALID_PRIORITY',\n          message: `Invalid priority: ${priority}`,\n          field: 'priority',\n        });\n      }\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * Rocket.Chat validation rules.\n */\nconst rocketChatValidation: ProviderValidation = {\n  schemas: ['rocketchat', 'rocket'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    if (!parsed.hostname) {\n      errors.push({\n        code: 'ROCKETCHAT_MISSING_HOST',\n        message: 'Missing Rocket.Chat server hostname',\n        field: 'hostname',\n        suggestion: 'Format: rocketchat://chat.example.com/webhookToken',\n      });\n    }\n\n    const webhookToken = parsed.segments[0];\n    if (!webhookToken) {\n      errors.push({\n        code: 'ROCKETCHAT_MISSING_TOKEN',\n        message: 'Missing webhook token',\n        field: 'webhookToken',\n        suggestion: 'Get the webhook token from Administration → Integrations',\n      });\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * Generic webhook validation rules.\n */\nconst webhookValidation: ProviderValidation = {\n  schemas: ['json', 'jsons'],\n  validate: (parsed) => {\n    const errors: ValidationError[] = [];\n    const warnings: ValidationWarning[] = [];\n\n    if (!parsed.hostname) {\n      errors.push({\n        code: 'WEBHOOK_MISSING_HOST',\n        message: 'Missing webhook hostname',\n        field: 'hostname',\n        suggestion: 'Format: json://api.example.com/webhook',\n      });\n    }\n\n    return { errors, warnings };\n  },\n};\n\n/**\n * All provider validations.\n */\nconst providerValidations: ProviderValidation[] = [\n  smtpValidation,\n  discordValidation,\n  telegramValidation,\n  slackValidation,\n  ntfyValidation,\n  rocketChatValidation,\n  webhookValidation,\n];\n\n/**\n * Validates a fire-signal URL with surgical error messages.\n *\n * @param url - The URL to validate\n * @returns Validation result with parsed URL, errors, and warnings\n */\nexport function validateFSUrl(url: string): ValidationResult {\n  const errors: ValidationError[] = [];\n  const warnings: ValidationWarning[] = [];\n\n  // Basic validation\n  if (!url || typeof url !== 'string') {\n    return {\n      valid: false,\n      errors: [\n        {\n          code: 'URL_EMPTY',\n          message: 'URL must be a non-empty string',\n          suggestion: 'Provide a valid notification URL',\n        },\n      ],\n      warnings: [],\n    };\n  }\n\n  const trimmed = url.trim();\n  if (!trimmed) {\n    return {\n      valid: false,\n      errors: [\n        {\n          code: 'URL_EMPTY',\n          message: 'URL is empty or whitespace only',\n        },\n      ],\n      warnings: [],\n    };\n  }\n\n  // Try to parse the URL\n  let parsed: FSParsedUrl;\n  try {\n    parsed = parseFSUrl(trimmed);\n  } catch (err) {\n    if (err instanceof FSParseError) {\n      return {\n        valid: false,\n        errors: [\n          {\n            code: 'URL_PARSE_ERROR',\n            message: err.message,\n            suggestion: 'Check the URL format: schema://[user:pass@]host/path',\n          },\n        ],\n        warnings: [],\n      };\n    }\n    throw err;\n  }\n\n  // Find provider-specific validation\n  const providerValidation = providerValidations.find((pv) =>\n    pv.schemas.includes(parsed.schema.toLowerCase())\n  );\n\n  if (providerValidation) {\n    const result = providerValidation.validate(parsed);\n    errors.push(...result.errors);\n    warnings.push(...result.warnings);\n  } else {\n    // Unknown schema - just warn\n    warnings.push({\n      code: 'UNKNOWN_SCHEMA',\n      message: `Unknown schema: ${parsed.schema}`,\n      field: 'schema',\n    });\n  }\n\n  return {\n    valid: errors.length === 0,\n    parsed,\n    errors,\n    warnings,\n  };\n}\n\n/**\n * Throws appropriate error if URL validation fails.\n *\n * @param url - The URL to validate\n * @returns Parsed URL if valid\n * @throws FSValidationError or FSCredentialsError if invalid\n */\nexport function validateAndParseFSUrl(url: string): FSParsedUrl {\n  const result = validateFSUrl(url);\n\n  if (!result.valid) {\n    const firstError = result.errors[0]!;\n\n    // Throw specific error types based on error code\n    if (\n      firstError.code.includes('MISSING_CREDENTIALS') ||\n      firstError.code.includes('MISSING_TOKEN')\n    ) {\n      const schema = result.parsed?.schema ?? 'unknown';\n      throw new FSCredentialsError(firstError.message, schema, [\n        firstError.field ?? 'credentials',\n      ]);\n    }\n\n    throw new FSValidationError(\n      firstError.message,\n      firstError.field ?? 'url',\n      url,\n      firstError.suggestion\n    );\n  }\n\n  return result.parsed!;\n}\n\n/**\n * Checks if URL is valid without throwing.\n */\nexport function isValidUrl(url: string): boolean {\n  return validateFSUrl(url).valid;\n}\n","#!/usr/bin/env node\n/**\n * Fire-Signal CLI - Unified notification command-line interface.\n *\n * Usage:\n *   fire-signal -t \"Title\" -b \"Body\" <urls...>\n *   fire-signal -u ntfy://topic -u fire://key@api.fire-signal.com -t \"Title\" -b \"Body\"\n *   fire-signal -g tag1,tag2 -c /path/config.yml\n *   echo \"Body\" | fire-signal -t \"Title\"\n *   fire-signal --dry-run -t \"Test\" -b \"Message\" ntfy://...\n */\n\nimport { Command } from 'commander';\nimport { FireSignal } from '../core/FireSignal';\nimport { FSMessage } from '../core/Message';\nimport { loadFSConfig } from '../config/ConfigLoader';\nimport { loadUrlsFromEnv, loadConfigPathsFromEnv } from '../config/env';\nimport { createConsoleLogger, LogLevel, silentLogger } from '../utils/logger';\nimport { readStdinIfEmpty } from '../utils/stdin';\nimport { validateFSUrl } from '../core/UrlValidator';\nimport { FSProviderResult } from '../providers/base/Provider';\n\nconst program = new Command();\n\nprogram\n  .name('fire-signal')\n  .description('Unified notification CLI for Node/TypeScript')\n  .version('0.2.0')\n  .option('-t, --title <title>', 'Notification title/subject')\n  .option('-b, --body <body>', 'Notification body; if absent, reads from stdin')\n  .option(\n    '-g, --tag <tags...>',\n    'Tags to filter URLs (comma or space separated)'\n  )\n  .option('--tags <tags>', 'Alias for -g/--tag')\n  .option(\n    '-a, --audience <labels>',\n    'Audience labels for fire:// provider (comma or space separated)',\n    (value: string, previous: string[] = []) =>\n      previous.concat(value.split(/[\\s,]+/).filter(Boolean)),\n    []\n  )\n  .option(\n    '-u, --url <url>',\n    'Provider URL (repeatable). Example: -u fire://... -u ntfy://...',\n    (value: string, previous: string[] = []) => previous.concat(value),\n    []\n  )\n  .option('--segment-id <id>', 'Fire Platform segment ID for fire:// provider')\n  .option(\n    '--template-key <key>',\n    'Fire Platform template key for fire:// provider'\n  )\n  .option('-c, --config <paths...>', 'Additional config file paths')\n  .option(\n    '-l, --log-level <level>',\n    'Log level: silent, error, warn, info, debug',\n    'info'\n  )\n  .option('-v, --verbose', 'Enable verbose logging (same as --log-level debug)')\n  .option('-q, --quiet', 'Suppress output (same as --log-level silent)')\n  .option('--dry-run', 'Show what would be sent without actually sending')\n  .option('--json', 'Output results as JSON (machine-parseable)')\n  .option('--timeout <ms>', 'Request timeout in milliseconds', '30000')\n  .option('--retries <count>', 'Number of retry attempts on failure', '0')\n  .option('--validate', 'Validate URLs without sending')\n  .argument('[urls...]', 'Notification URLs to send to')\n  .action(async (urls: string[], options: CLIOptions) => {\n    try {\n      await runCLI(urls, options);\n    } catch (error) {\n      if (options.json) {\n        console.log(\n          JSON.stringify({\n            error: error instanceof Error ? error.message : String(error),\n          })\n        );\n      } else {\n        console.error(\n          'Error:',\n          error instanceof Error ? error.message : String(error)\n        );\n      }\n      process.exit(1);\n    }\n  });\n\ninterface CLIOptions {\n  title?: string;\n  body?: string;\n  url?: string[];\n  tag?: string[];\n  tags?: string;\n  audience?: string[];\n  segmentId?: string;\n  templateKey?: string;\n  config?: string[];\n  logLevel?: string;\n  verbose?: boolean;\n  quiet?: boolean;\n  dryRun?: boolean;\n  json?: boolean;\n  timeout?: string;\n  retries?: string;\n  validate?: boolean;\n}\n\ninterface DryRunPayload {\n  provider: string;\n  url: string;\n  title?: string;\n  body: string;\n  wouldSendTo?: string;\n}\n\ninterface JSONOutput {\n  results: Array<{\n    providerId: string;\n    url: string;\n    success: boolean;\n    attempts?: number;\n    durationMs?: number;\n    error?: string;\n  }>;\n  summary: {\n    total: number;\n    success: number;\n    failed: number;\n  };\n  dryRun?: boolean;\n  validation?: {\n    valid: boolean;\n    errors: Array<{\n      url: string;\n      code: string;\n      message: string;\n      suggestion?: string;\n    }>;\n  };\n}\n\nasync function runCLI(urls: string[], options: CLIOptions): Promise<void> {\n  // Determine log level: quiet > verbose > logLevel\n  let logLevel: LogLevel = 'info';\n  if (options.quiet || options.json) {\n    logLevel = 'silent';\n  } else if (options.verbose) {\n    logLevel = 'debug';\n  } else if (options.logLevel) {\n    logLevel = options.logLevel as LogLevel;\n  }\n\n  // Create logger based on options\n  const logger =\n    logLevel === 'silent' ? silentLogger : createConsoleLogger(logLevel);\n\n  // Load config from files\n  const envConfigPaths = loadConfigPathsFromEnv();\n  const allConfigPaths = [...(options.config ?? []), ...envConfigPaths];\n  const config = await loadFSConfig(allConfigPaths);\n\n  // Load URLs from environment\n  const envUrls = loadUrlsFromEnv();\n\n  // Combine all URLs: CLI args > ENV > config\n  const allUrls = [\n    ...(options.url ?? []),\n    ...urls,\n    ...envUrls,\n    ...config.entries.map((e) => e.url),\n  ];\n\n  // Parse tags (combine -g/--tag and --tags)\n  const tagList = [\n    ...(options.tag?.flatMap((t) => t.split(/[,\\s]+/).filter(Boolean)) ?? []),\n    ...(options.tags?.split(/[,\\s]+/).filter(Boolean) ?? []),\n  ];\n\n  const audienceList = options.audience ?? [];\n\n  // Handle --validate option\n  if (options.validate) {\n    return handleValidation(allUrls, options);\n  }\n\n  // Read body from stdin if not provided\n  const body = await readStdinIfEmpty(options.body);\n\n  if (!body && !options.dryRun) {\n    if (options.json) {\n      console.log(JSON.stringify({ error: 'No message body provided' }));\n    } else {\n      console.error(\n        'Error: No message body provided. Use -b or pipe to stdin.'\n      );\n    }\n    process.exit(1);\n  }\n\n  if (allUrls.length === 0) {\n    if (options.json) {\n      console.log(JSON.stringify({ error: 'No notification URLs provided' }));\n    } else {\n      console.error('Error: No notification URLs provided.');\n      console.error(\n        'Provide URLs as arguments, via FIRE_SIGNAL_URLS env, or in config files.'\n      );\n    }\n    process.exit(1);\n  }\n\n  // Build message\n  const message: FSMessage = {\n    title: options.title,\n    body: body || '(dry-run: no body)',\n  };\n\n  // Handle --dry-run option\n  if (options.dryRun) {\n    return handleDryRun(allUrls, message, tagList, options);\n  }\n\n  // Create FireSignal instance\n  const fsignal = new FireSignal({\n    urls: allUrls,\n    logger,\n  });\n\n  // Parse timeout and retries\n  const timeout = parseInt(options.timeout ?? '30000', 10);\n  const retries = parseInt(options.retries ?? '0', 10);\n\n  // Log config if verbose\n  if (options.verbose) {\n    logger(`Timeout: ${timeout}ms, Retries: ${retries}`, 'debug');\n  }\n\n  // Send notifications\n  const startTime = Date.now();\n  const results = await fsignal.send(message, {\n    tags: tagList.length > 0 ? tagList : undefined,\n    audience: audienceList.length > 0 ? audienceList : undefined,\n    segmentId: options.segmentId,\n    templateKey: options.templateKey,\n  });\n  const totalDuration = Date.now() - startTime;\n\n  // Output results\n  if (options.json) {\n    outputJSON(results, totalDuration);\n  } else {\n    outputText(results, options.quiet);\n  }\n}\n\nfunction handleValidation(urls: string[], options: CLIOptions): void {\n  const validationErrors: Array<{\n    url: string;\n    code: string;\n    message: string;\n    suggestion?: string;\n  }> = [];\n\n  let allValid = true;\n\n  for (const url of urls) {\n    const result = validateFSUrl(url);\n    if (!result.valid) {\n      allValid = false;\n      for (const err of result.errors) {\n        validationErrors.push({\n          url,\n          code: err.code,\n          message: err.message,\n          suggestion: err.suggestion,\n        });\n      }\n    }\n  }\n\n  if (options.json) {\n    const output: JSONOutput = {\n      results: [],\n      summary: { total: urls.length, success: 0, failed: 0 },\n      validation: {\n        valid: allValid,\n        errors: validationErrors,\n      },\n    };\n    console.log(JSON.stringify(output, null, 2));\n  } else {\n    if (allValid) {\n      console.log(`✓ All ${urls.length} URL(s) are valid`);\n    } else {\n      console.error(`✗ Validation failed:`);\n      for (const err of validationErrors) {\n        console.error(`  [${err.code}] ${err.message}`);\n        if (err.suggestion) {\n          console.error(`    → ${err.suggestion}`);\n        }\n        console.error(`    URL: ${err.url}`);\n      }\n    }\n  }\n\n  process.exit(allValid ? 0 : 1);\n}\n\nfunction handleDryRun(\n  urls: string[],\n  message: FSMessage,\n  tags: string[],\n  options: CLIOptions\n): void {\n  const payloads: DryRunPayload[] = [];\n\n  for (const url of urls) {\n    const result = validateFSUrl(url);\n    if (!result.valid || !result.parsed) continue;\n\n    const schema = result.parsed.schema;\n    const payload: DryRunPayload = {\n      provider: schema,\n      url: url,\n      title: message.title,\n      body: message.body,\n    };\n\n    // Add provider-specific endpoint info\n    switch (schema) {\n      case 'discord':\n        payload.wouldSendTo = `https://discord.com/api/webhooks/${result.parsed.hostname}/${result.parsed.segments[0]}`;\n        break;\n      case 'tgram':\n      case 'telegram':\n        payload.wouldSendTo = `https://api.telegram.org/bot${result.parsed.hostname}/sendMessage`;\n        break;\n      case 'slack':\n        payload.wouldSendTo = `https://hooks.slack.com/services/${result.parsed.hostname}/${result.parsed.segments.join('/')}`;\n        break;\n      case 'ntfy':\n      case 'ntfys':\n        payload.wouldSendTo = `https://${result.parsed.hostname}/${result.parsed.segments[0] || result.parsed.path}`;\n        break;\n      case 'rocketchat':\n      case 'rocket':\n        payload.wouldSendTo = `https://${result.parsed.hostname}/hooks/${result.parsed.segments[0]}`;\n        break;\n      case 'mailto':\n      case 'mailtos':\n        payload.wouldSendTo = `SMTP: ${result.parsed.hostname} → ${result.parsed.params.to}`;\n        break;\n      default:\n        payload.wouldSendTo = `${schema}://${result.parsed.hostname}${result.parsed.path ? '/' + result.parsed.path : ''}`;\n    }\n\n    payloads.push(payload);\n  }\n\n  if (options.json) {\n    const output: JSONOutput = {\n      results: payloads.map((p) => ({\n        providerId: p.provider,\n        url: p.url,\n        success: true, // dry-run always \"succeeds\"\n      })),\n      summary: {\n        total: payloads.length,\n        success: payloads.length,\n        failed: 0,\n      },\n      dryRun: true,\n    };\n    console.log(JSON.stringify(output, null, 2));\n  } else {\n    console.log('🔥 DRY-RUN MODE - No notifications will be sent\\n');\n    console.log(`Message:`);\n    if (message.title) {\n      console.log(`  Title: ${message.title}`);\n    }\n    console.log(`  Body: ${message.body}`);\n    if (tags.length > 0) {\n      console.log(`  Tags: ${tags.join(', ')}`);\n    }\n    console.log();\n\n    for (const payload of payloads) {\n      console.log(`---`);\n      console.log(`Provider: ${payload.provider}`);\n      console.log(`URL: ${payload.url}`);\n      if (payload.wouldSendTo) {\n        console.log(`Would send to: ${payload.wouldSendTo}`);\n      }\n    }\n    console.log(`---`);\n    console.log(`\\nTotal: ${payloads.length} provider(s) would be notified`);\n  }\n\n  process.exit(0);\n}\n\nfunction outputJSON(\n  results: FSProviderResult[],\n  totalDurationMs: number\n): void {\n  const successCount = results.filter((r) => r.success).length;\n  const output: JSONOutput & { totalDurationMs: number } = {\n    results: results.map((r) => ({\n      providerId: r.providerId,\n      url: '', // URL is not available in FSProviderResult\n      success: r.success,\n      attempts: r.attempts,\n      durationMs: r.durationMs,\n      error: r.error?.message,\n    })),\n    summary: {\n      total: results.length,\n      success: successCount,\n      failed: results.length - successCount,\n    },\n    totalDurationMs,\n  };\n  console.log(JSON.stringify(output, null, 2));\n}\n\nfunction outputText(results: FSProviderResult[], quiet?: boolean): void {\n  let hasError = false;\n\n  for (const result of results) {\n    if (!result.success) {\n      hasError = true;\n      if (!quiet) {\n        console.error(`[${result.providerId}] FAIL: ${result.error?.message}`);\n      }\n    } else if (!quiet) {\n      const extra =\n        result.attempts && result.attempts > 1\n          ? ` (${result.attempts} attempts)`\n          : '';\n      console.log(`[${result.providerId}] OK${extra}`);\n    }\n  }\n\n  process.exit(hasError ? 1 : 0);\n}\n\n// Parse and execute\nprogram.parseAsync(process.argv).catch((error) => {\n  console.error(\n    'Error:',\n    error instanceof Error ? error.message : String(error)\n  );\n  process.exit(1);\n});\n"]}