Skip to content

🛠️ ¿Cómo creo mis propias piezas?

Firefly JS es extensible por diseño. Puedes crear tus propios Plugins y Tools para adaptar la gobernanza a las necesidades específicas de tu equipo.

🔌 Crear un Plugin (Capacidades)

Los plugins proveen datos o servicios. Se dividen en dos tipos según su interacción:

🧩 Plugin de Ejecución (Proceso)

Es el más común. Implementa process() para devolver datos cuando se le solicita.

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

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

  async process(input?: TInput): Promise<TOutput> {
    // Lógica para procesar o extraer datos
    return { data: "resultado" }
  }
}

📡 Plugin de Mensajería (Driver)

Actúa como un sensor activo. Usa initialize() para levantar un listener y emitir eventos.

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

export class MiPluginDriver implements Plugin {
  readonly name = "mi-driver-plugin"

  initialize({ events }: PluginContext) {
    // Conectar a un socket, API o file watcher
    miServicioExterno.on('update', (data) => {
      events.emit('plugin:update', data)
    })
  }
}

🛠️ Crear una Tool (Orquestación)

Las herramientas son las que realmente "hacen" algo, consumiendo los plugins registrados en el Kernel.

ts
import { FireflyTool, Kernel } from '@fireflyjs/core'

export class MiAnalizadorTool implements FireflyTool {
  readonly name = "mi-analizador"
  readonly mode = "run" // O "watch"

  async run(kernel: Kernel) {
    // 1. Obtener la capacidad del plugin
    const reader = kernel.getPlugin<MiPluginReader>("mi-reader-plugin")
    
    // 2. Usar la capacidad
    const data = await reader.process()
    
    // 3. Ejecutar lógica y dar feedback
    if (data.error) {
       console.log("❌ Error detectado")
    }
  }
}

🧩 Patrón de Sincronización Reactiva

En modo watch, tus herramientas pueden suscribirse a eventos de los drivers para re-procesar la información.

ts
async run(kernel: Kernel) {
  // Suscribirse a un driver de IA o cambios de archivos
  kernel.on('plugin:update', (newData) => {
    this.reanalizar(newData)
  })
}

💡 Mejores Prácticas

  1. Agnosticismo: Un plugin no sabe quién lo usa. Solo entrega datos.
  2. Inyección: Configura tus piezas a través del constructor.
  3. Simplicidad: El Kernel debe ser estable; la complejidad vive en tus plugins y herramientas.