Portal Community

ApprovalNode

PropertyValue
TypeCodeApproval
ExecutorApprovalExecutor (single) or MultiPartyApprovalExecutor
Output portsapproved, rejected, timeout
Config fieldstitle, instruction, approvers, strategy, quorumCount, timeoutDuration, timeoutBehavior, escalationActorId
Resume data{ decision: "Approved"|"Rejected", comment: string }

UserFormNode

PropertyValue
TypeCodeUserForm
ExecutorUserFormExecutor
Output portssubmitted, timeout
Config fieldstitle, instruction, atlasFormId, actorId, actorType, timeoutDuration, timeoutBehavior
Resume dataThe submitted Atlas Form field values as a JSON object

ReviewNode

PropertyValue
TypeCodeReview
ExecutorReviewExecutor
Output portsacknowledged, timeout
Config fieldstitle, contentToReview, actorId, actorType, requireComment, timeoutDuration, timeoutBehavior
Resume data{ acknowledged: true, comment: string }

BaseHILExecutor

All three executors extend BaseHILExecutor, which handles the common suspension logic:

public abstract class BaseHILExecutor<TInput, TOutput>
    : BaseNodeExecutor<TInput, TOutput>
{
    protected abstract SuspendPayload BuildSuspendPayload(
        NodeExecutionContext ctx, TInput input);

    protected override async Task<NodeExecutionResult> ExecuteInternalAsync(
        NodeExecutionContext ctx, CancellationToken ct)
    {
        var payload = BuildSuspendPayload(ctx, ctx.GetInput<TInput>());
        return NodeExecutionResult.Suspend(payload);
        // Engine catches Suspend result and persists state
    }
}