Portal Community

INodeCapability Interface

// ProcessEngine/Capabilities/INodeCapability.cs
public interface INodeCapability
{
    CapabilityType Type { get; }
    CapabilityMetadata Metadata { get; }
    void ConfigureServices(IServiceCollection services);
}

public record CapabilityMetadata
{
    public string DisplayName { get; init; }
    public string Description { get; init; }
    public string IconClass { get; init; }    // Font Awesome class
    public string PaletteCategory { get; init; }
    public bool RequiresCredential { get; init; }
}

CapabilityType Enum

// ProcessEngine/Capabilities/CapabilityType.cs
public enum CapabilityType
{
    Webhook          = 1,
    BusinessService  = 2,
    Form             = 3,
    Widget           = 4,
    Messaging        = 5,
    Identity         = 6,
    Entity           = 7,
    Datasource       = 8,
    Rule             = 9,
    Process          = 10,
    DIDComm          = 11,
    MCP              = 12
}

NodeCapabilityAttribute

// ProcessEngine/Capabilities/NodeCapabilityAttribute.cs
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class NodeCapabilityAttribute : Attribute
{
    public CapabilityType Type { get; }
    public NodeCapabilityAttribute(CapabilityType type) => Type = type;
}

Example: A Messaging Capability Implementation

// ProcessEngine/Capabilities/Implementations/MessagingCapability.cs
public class MessagingCapability : INodeCapability
{
    public CapabilityType Type => CapabilityType.Messaging;

    public CapabilityMetadata Metadata => new()
    {
        DisplayName = "Messaging",
        Description = "Send messages via Slack, Email, SMS, and Push",
        IconClass = "fa-solid fa-envelope",
        PaletteCategory = "Communication",
        RequiresCredential = true
    };

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMessagingChannelRegistry, MessagingChannelRegistry>();
        services.AddScoped<SlackChannelAdapter>();
        services.AddScoped<EmailChannelAdapter>();
        services.AddScoped<SMSChannelAdapter>();
        services.AddScoped<PushChannelAdapter>();
    }
}

Registration Pattern

Each capability implementation is registered in DI as INodeCapability. The engine collects all registrations at startup:

// Program.cs / Startup extension
services.AddSingleton<INodeCapability, WebhookCapability>();
services.AddSingleton<INodeCapability, BusinessServiceCapability>();
services.AddSingleton<INodeCapability, MessagingCapability>();
// ... all 12 capabilities

// Engine calls ConfigureServices on each capability during startup
foreach (var capability in capabilities)
{
    capability.ConfigureServices(services);
}