npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@decido/core

v4.1.0

Published

> Módulo central de ejecución secuencial, orquestación de sub-grafos y máquina de estados reactiva de **Decido OS**.

Downloads

221

Readme

@decido/core

Módulo central de ejecución secuencial, orquestación de sub-grafos y máquina de estados reactiva de Decido OS.

@decido/core es el núcleo computacional (Kernel) responsable de interpretar y ejecutar blueprints modulares. Utiliza un patrón de Inversión de Control (IoC) mediante plugins extensibles, posee aislamiento de memoria local para subflujos en una pila de llamadas (Call Stack) y proporciona persistencia reactiva atómica e inmune a leaks de memoria apoyada sobre IndexedDB.


📦 Instalación y Setup

Aprovisiona este paquete dentro del monorepo o consumelo como dependencia interna:

pnpm add @decido/core

⚙️ Arquitectura y Modelo de Ejecución

El motor DecidoEngine procesa la lógica paso a paso delegando la resolución de nodos a los componentes registrados de tipo NodePlugin. A continuación se detalla su flujo de eventos, soporte a suspensiones reactivas y apilamiento de marcos de ejecución para subflujos:

sequenceDiagram
    participant Host as Aplicación Host
    participant Engine as DecidoEngine
    participant Reg as PluginRegistry
    participant Plugin as NodePlugin

    Host->>Engine: start(blueprintId, initialInputs)
    Note over Engine: Estado: RUNNING<br/>Inicia primer CallFrame
    Engine-->>Host: Evento 'graph:start'
    
    Host->>Engine: executeNode(node)
    Engine->>Reg: get(node.type)
    Reg-->>Engine: Plugin
    Engine->>Plugin: execute(node.payload, context)
    
    alt Completado Simple
        Plugin->>Engine: context.dispatchCompletion(handle, outputs)
        Note over Engine: Inyecta outputs en memory.session
        Engine-->>Host: Evento 'node:complete'
    else Suspensión Reactiva
        Plugin->>Engine: context.dispatchSuspend(reason)
        Note over Engine: Estado: SUSPENDED
        Engine-->>Host: Evento 'engine:suspend'
        Host->>Engine: resume(injectedVariables)
        Note over Engine: Estado: RUNNING
        Engine-->>Host: Evento 'engine:resume'
    else Orquestación de Subflujo (Call Stack)
        Plugin->>Engine: context.pushCallFrame(targetBlueprintId, startNodeId)
        Note over Engine: Respalda memory.local del padre<br/>Limpia memory.local del hijo
        Engine-->>Host: Evento 'engine:callframe_push'
        
        Note over Engine: Ejecución del subflujo...
        
        Plugin->>Engine: context.popCallFrame(outputs, handle)
        Note over Engine: Restaura la memory.local del padre
        Engine-->>Host: Evento 'engine:callframe_pop'
        Engine-->>Host: Evento 'node:complete' (nodo padre)
    end

🛠️ APIs y Contratos Clave

| Símbolo | Tipo | Descripción | | :--- | :--- | :--- | | DecidoEngine | Clase | Implementación del motor central (DecidoKernel) con pila de llamadas y memoria de 3 niveles. | | PluginRegistry | Objeto | Catálogo único (Singleton) para registrar y recuperar plugins contractuales de nodos. | | DecidoKernel | Interfaz | Contrato que define la API operacional y eventos de ciclo de vida del motor. | | DecidoPluginContext | Interfaz | Contexto IoC provisto a los plugins para despachar flujos (completion, suspend, callstack). | | NodePlugin | Interfaz | Contrato para definir e implementar la lógica ejecutable asociada a un tipo de nodo. | | EngineMemory | Interfaz | Estructura de almacenamiento reactivo dividida en ámbitos: global, session y local. | | get, set, del, clear | Funciones | Capa de persistencia síncrona/asíncrona atómica optimizada mediante conexión Cached Singleton en IndexedDB. |


🚀 Ejemplos de Consumo Práctico

1. Definición y Registro de un Plugin de Conversación

Los plugins permiten encapsular lógica extendida e interactuar de forma segura con la pila y memoria del motor:

import { NodePlugin, DecidoPluginContext, PluginRegistry } from '@decido/core';

interface DialoguePayload {
  prompt: string;
  role: string;
}

// Implementación de un plugin interactivo con suspensión
export const DialoguePlugin: NodePlugin = {
  type: 'ai:dialogue',
  async execute(payload: unknown, context: DecidoPluginContext) {
    const { prompt, role } = payload as DialoguePayload;
    
    console.log(`[DialoguePlugin] Procesando prompt para rol ${role}: "${prompt}"`);
    
    // Suspendemos la ejecución esperando interacción del usuario externo
    context.dispatchSuspend('WAITING_USER');
  }
};

// Registro del plugin en el catálogo global
PluginRegistry.register(DialoguePlugin);

2. Orquestación e Invocación del Motor (DecidoEngine)

import { DecidoEngine } from '@decido/core';

const engine = new DecidoEngine();

// Suscripción reactiva a eventos del ciclo de vida
engine.on('graph:start', (payload) => {
  console.log(`[Kernel] Flujo iniciado: ${payload.blueprintId}`);
});

engine.on('engine:suspend', (payload) => {
  console.log(`[Kernel] Motor en Suspensión. Razón: ${payload.reason}`);
});

engine.on('node:complete', (payload) => {
  console.log(`[Kernel] Nodo completado: ${payload.nodeId} con handle: ${payload.handle}`);
});

// Iniciamos la ejecución del blueprint
engine.start('chat-flow-root', { userId: 'user_9988' });

// Al recibir respuesta externa, reanudamos el motor con las nuevas variables
setTimeout(() => {
  if (engine.state === 'SUSPENDED') {
    engine.resume({ userResponse: '¡Hola! Quiero iniciar mi onboarding.' });
  }
}, 1000);

🧪 Robustez y Suite de Pruebas (Test Shield 100%)

El paquete @decido/core cuenta con un estricto blindaje de pruebas unitarias (Unit Test Shield) implementado con Vitest y V8, garantizando un 100% absoluto de cobertura en ramas lógicas, sentencias, funciones y líneas de código.

Para correr localmente las pruebas unitarias y verificar el estricto cumplimiento del Test Shield:

# Ejecutar todas las pruebas unitarias
pnpm --filter @decido/core test

# Generar y auditar la tabla de cobertura 100%
pnpm --filter @decido/core test:coverage

🔐 Licencia y Privacidad

El código fuente de este paquete se encuentra protegido y auditado de forma corporativa.
Distribuido estrictamente bajo licencia UNLICENSED para uso exclusivo en el ecosistema de Decido OS.