Flow Studio
The Capability Model
The INodeCapability interface, CapabilityType enum definition, and CapabilityMetadata — the full type system behind node capabilities.
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);
}