Skip to content

🔌 Plugins: Proveedores de Capacidades

Los Plugins son los proveedores de capacidades y servicios en Firefly JS. Su misión es alimentar al sistema con datos procesados del entorno o exponer conexiones externas a través del Bus de Eventos.

🏗️ Naturaleza de un Plugin

Un plugin es una clase que implementa la interfaz Plugin. Dependiendo de cómo interactúen con el sistema, se dividen en dos tipos:

1. Plugins de Ejecución (Procesos) 🧩

Responden a una llamada directa a través de su método process(). Son ideales para tareas que devuelven un resultado concreto y predecible.

  • Ejemplo: FileReaderPlugin escanea el disco y devuelve un árbol de archivos. ContractReaderPlugin procesa ese árbol y devuelve reglas arquitectónicas.

2. Plugins de Mensajería (Drivers) 📡

Actúan como sensores activos. Se conectan a fuentes externas (IA, Sockets, Bus de eventos externo) y emiten eventos al Kernel de forma asíncrona.

  • Implementación: Su método initialize arranca el listener y resuelve rápido para no bloquear el bootstrap, pero mantiene el canal abierto.

🛠️ Anatomía del Código

ts
import { Plugin, PluginContext } from '@fireflyjs/core'

export class MiPlugin implements Plugin<TOutput, TInput> {
  readonly name = "mi-plugin-identificador"

  // Opcional: Para configuración inicial y suscripción a eventos (Drivers)
  initialize({ events }: PluginContext): void | Promise<void> {
    // Escuchar eventos externos o internos
  }

  // Opcional: Contrato explícito para solicitar datos (Procesos)
  async process(data?: TInput): Promise<TOutput> {
    // Lógica de transformación o consulta
  }
}

🌍 Interacción con el Mundo Exterior

Firefly JS permite que los plugins interactúen con cualquier proveedor (APIs, IA, Bases de datos):

  • Promesas y Timeouts: El método process es asíncrono por definición. Es responsabilidad del plugin manejar sus propios reintentos y límites de tiempo.
  • Agnosticismo: Los plugins no deben conocer a las Tools que los consumen. Su única responsabilidad es entregar datos de calidad.

💡 ¿Qué deberías construir como Plugin?

  • Lectores de Archivos: Extender el FileReader para parsear formatos específicos (YAML, JSON, AST).
  • Conectores: Adaptadores para herramientas como Jira, GitHub Actions o modelos LLM.
  • Proveedores de Reglas: Sistemas que extraigan contratos de bases de datos o servicios de gobernanza.