← API documentation

Silver Action Flow YAML Specification

This document defines the YAML format accepted and generated by ActionFlowCompiler. It describes specification version 1, the graph shape, variables, parameters, conditions, and every currently supported typed action configuration.

The YAML format is a semantic representation of an IAction graph. Runtime identifiers such as action IDs, parameter IDs, graph positions, and incoming variable metadata are generated by the compiler and are deliberately excluded from YAML.

1. Serialization rules

For example, false, 0, an empty list, and an enum's first value may be absent from generated YAML even though they remain valid when written explicitly.

2. Document structure

version: 1
scope: solution
root:
  type: user
  name: Example
  description: Optional description
  outputs: []
  user: {}
  branches: {}
  next: null
Property Required Meaning
version Yes Specification format version. The current and only supported value is 1.
scope Yes Ownership scope: solution, shared, platform, or system. unknown is invalid.
root Yes First action node in the graph.

scope describes ownership and portability. It does not itself alter runtime execution.

3. Action node

Every node has this common shape:

type: alert
name: ShowResult
description: Show the result to the user.
outputs:
- source: success
  alias: WasSuccessful
  type: boolean
  scope: cascaded
alert:
  message:
    value: Done
next:
  type: refresh
  name: RefreshPage
  refresh: {}
branches:
  cancel:
    type: alert
    name: Cancelled
    alert: {}
Property Required Meaning
type Yes Selects the converter and matching configuration block.
name Yes Human-readable action name. The compiler removes spaces. Distinct names are strongly recommended, although the current normalizer does not reject duplicates.
description No Optional explanation shown in tooling.
outputs No Variables published by this node for downstream nodes.
Typed configuration Yes Exactly one block whose name matches type, such as user, input, or webService.
next No Normal/main continuation.
branches No Named alternate continuations supported by this action type.

Supported typed node types are:

user, input, setVariable, if, alert, methodCaller, updateEntity, createEntityForm, refresh, and webService.

runtime is also supported as a compatibility representation for the remaining allow-listed ActionHandler action types.

3.1 Continuations and branches

next becomes IAction.Action, the normal exit. Named branches become an action-specific secondary exit:

Node type Supported branch Meaning
input cancel User discarded/cancelled the input dialog.
if false Condition result was false. next is the true exit.
createEntityForm cancel User cancelled the form. next is submit/confirm.
runtime second Generic secondary exit, only when the underlying action implements IDoubleExitAction.

Unsupported branch names cause compilation to fail. A missing continuation ends that path.

4. Outputs, aliases, and variable scope

outputs:
- source: result
  alias: CreatedCustomer
  type: businessEntity
  scope: cascaded
Property Required Meaning
source Yes Semantic local output exposed by the action converter.
alias Defaults to source Stable YAML name used by later nodes. Must be unique in its scope.
type Usually inferred Silver value type. If supplied, it must exactly match the source type.
scope Defaults to cascaded cascaded remains available to all downstream descendants; parameter is available only to the immediate next node.

Supported output types are text, textArray, number, numberArray, data, file, oledbImage, fileCollection, dataRow, dataTable, json, jsonArray, xml, xmlArray, boolean, dateTime, html, csv, excel, word, businessEntity, businessEntityList, and businessEntityProperty.

All actions may expose common semantic sources such as name, description, success, and error when those locals exist. Important action-specific sources include:

Node Source
user businessEntity
input Field name, for example Email
setVariable Item/input name
if result
methodCaller Declared return name; return is supported for the aggregate return local
updateEntity result
createEntityForm result
webService response, responseCode, exceptionMessage, dataType

The source must map to a real local variable on that action. Changing type does not convert the value. For example, a businessEntity source cannot be declared as oledbImage to extract an image.

4.1 Consuming an alias

Parameters can consume an output without embedding generated IDs:

value:
  alias: CreatedCustomer

During compilation the alias is resolved to the appropriate runtime variable ID or token. An alias must have been published by an earlier reachable action.

5. Silver parameter

The following reusable structure represents a SilverParameter:

name: Authorization
value: Bearer $$Secret:ApiToken$$
alias: ExistingOutput
parameterType: dynamicVariable
intValue: 10
doubleValue: 10.5
dateTimeValue: 2026-08-06T12:00:00Z
Property Required Meaning
name Contextual Destination or field name. Required for named collections such as headers and entity properties.
value No Literal text or Silver expression.
alias No Semantic reference to a previously published YAML output. When present, it takes precedence over value and compiles to a dynamic variable reference.
parameterType No How Silver resolves the value. Default: dynamicVariable.
intValue No Typed integer value used by numeric controls/parameters.
doubleValue No Typed floating-point value.
dateTimeValue No Typed ISO date/time value.

Supported parameterType values are incomingVariables, businessEntityList, sbelList, businessEntity, security, constant, basementCall, dynamicVariable, path, and entryParameter.

Do not specify both alias and a meaningful value. Use alias for generated runtime references and value for literal values or expressions.

5.1 Dynamic expressions

Dynamic values may contain placeholders:

$$Local:Result$$
$$Parameter:InvoiceId$$
$$Cascaded:CustomerId$$
$$Index:Index$$
$$Security:<name>$$
$$Roles:<name>$$
$$Env:<name>$$
$$AppEnv:<name>$$
$$Secret:<name>$$
$$System:NewGuid$$

Local, Parameter, Cascaded, and Index refer to action variables. Security and Roles use the current user/security context. Env, AppEnv, and Secret resolve configured values. System invokes a built-in expression. Secrets should always be references; never store secret values in YAML.

6. Buttons

button:
  text: Save
  icon: fas fa-save
  iconFirst: true
  iconOnly: false
  cssClass: btn btn-primary
Property Meaning
text Visible button text.
icon Icon/CSS identifier.
iconFirst Places the icon before the text.
iconOnly Hides text and renders only the icon.
cssClass Host CSS classes.

The same structure is used by user, input, alert, confirm, and cancel buttons.

7. Conditions

A condition compares left and right. An all collection is logical AND; an any collection of groups is logical OR.

any:
- all:
  - name: IsAdministrator
    left:
      value: $$Roles:UserRole$$
    operator: contains
    right:
      value: Admin
      parameterType: constant
    dataType: text
Property Required Meaning
name No Stable condition name. If omitted, the compiler derives one.
left Yes Left Silver parameter.
operator Yes Comparison operator.
right Yes Right Silver parameter.
dataType Yes Conversion/comparison type.
basementDomain No Optional basement-domain context.
basementDomainIdentifier No Optional identifier within that domain.

Operators: equal, notEqual, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual, contains, notContains, and startsWith.

Data types: text, integer, boolean, float, dateTime, date, time, guid, and oledbImage.

Both sides must be present. A parameter object with no value is still an empty value; it is not a wildcard.

8. Typed action configurations

8.1 user

User-triggered entry point exposed on a controller.

type: user
name: CreateCustomer
user:
  target: Customer
  published: true
  group: Administration
  displayLabel:
    value: Create customer
  button:
    text: Create
  visibility: always
  enabled: always
  visibleWhen:
    all: []
  enabledWhen:
    all: []
  allowBulk: false
  singleRun: true
  allowCancel: false
  cancelOnError: false
  runType: single
Property Required/default Meaning
target Required Controller on which the action is exposed.
published Default true Makes the action available to the host.
group Optional UI/catalog group.
displayLabel Optional parameter Evaluated action label.
button Optional Button appearance.
visibility Must be always Availability mode. Conditional behavior belongs in visibleWhen.
enabled Must be always Enabled mode. Conditional behavior belongs in enabledWhen.
visibleWhen Optional AND group Conditions controlling whether the action is shown. An explicitly present group must contain a condition.
enabledWhen Optional AND group Conditions controlling whether the action is enabled. An explicitly present group must contain a condition.
allowBulk Default false Advertises bulk UI capability.
singleRun Default true Single-run/disconnect behavior used by the host.
allowCancel Default false Allows user cancellation.
cancelOnError Default false Requests graph cancellation on action error.
runType Default single single, singleTask, or multiTask. Host behavior is authoritative.

Method-based visibility/enabling from legacy UserAction cannot be represented by the typed converter.

8.2 input

Displays an input dialog. next is confirm; branches.cancel is discard.

input:
  label: { value: Details }
  cssClass: row
  title: { value: Create customer }
  message: { value: Enter the details. }
  confirmButton: { text: Save }
  cancelButton: { text: Cancel }
  confirmLabel: On Confirm
  cancelLabel: On Discard
  cancelOnError: false
  fields: []
Property Meaning
label Evaluated form heading parameter.
cssClass Dialog/container CSS classes.
title Evaluated dialog title.
message Evaluated dialog message.
confirmButton Confirm button style.
cancelButton Cancel button style.
confirmLabel Main-exit label; default On Confirm.
cancelLabel Cancel-exit label; default On Discard.
cancelOnError Requests cancellation on error.
fields Ordered list of controls.

Each field supports:

Property Meaning
name Required unique field/output name.
cssClass Layout CSS; default col.
required Requires a value.
placeholder Evaluated placeholder parameter.
placeholderDisplay Optional host display hint.
label Evaluated label parameter.
labelDisplay Optional host display hint.
type Required input control type.
range Produces/accepts a range where supported.
readOnly Prevents editing.
default Predefined/evaluated value.
numeric Settings for integer and decimal.
text Settings for text-family controls.
date Settings for dateTime.
source Settings for tags/dropdown/combobox.
file Settings for file upload.

Input types are label, text, email, maskedText, password, integer, decimal, dateTime, checkbox, switch, file, radioButton, tags, dropdown, combobox, richText, colorPicker, colorPickerTextBox, iconPicker, and iconPickerTextBox.

Numeric settings:

Property Meaning
dynamicMinimum / dynamicMaximum Evaluate min/max dynamically.
minimum / maximum Limit parameters.
format Numeric display format.
showSpinner Shows increment controls.
decimalPlaces Decimal precision.
increment Spinner step; default 1.
currency Currency display hint.

Text settings:

Property Meaning
mask Input mask.
maximumLength Maximum character count; 0 means no configured maximum.
toolbar Rich-text toolbar item names.
validations Expression validations, each with expression and message.

Date settings contain dynamicMinimum, minimum, dynamicMaximum, maximum, allowEdit, and showWeekNumber.

Source settings:

Property Meaning
options Sorted key/value custom options.
targetAlias Existing variable used as the source.
dataTableIdColumn / dataTableTextColumn Value/text columns for a DataTable source.
lookup Lookup name.
sourceType custom or incomingVariable.
multiSelect Produces multiple values.
virtualization Enables host virtualization.
filtering Enables filtering.
customValue Allows values outside the source.
incomingType Expected Silver variable type.

File settings contain extensions, size, and multiple.

8.3 setVariable

Creates or updates typed variables.

setVariable:
  cancelOnError: false
  items:
  - type: text
    name: FullName
    input:
      value: $$Cascaded:FirstName$$ $$Cascaded:LastName$$
    update: false
    targetAlias: null
    booleanValue: null
    dateTimeInputType: incomingVariable
    operations:
    - operation: Trim
      arguments: []
Property Meaning
cancelOnError Requests graph cancellation when this action fails.
items Ordered unique-name assignments.

Item properties:

Property Meaning
type Required: text, number, dateTime, or boolean.
name Required unique output/input name.
input Source parameter.
update If true, updates an existing variable instead of creating one.
targetAlias Required when update is true and forbidden otherwise.
booleanValue Constant used by boolean items; default false.
dateTimeInputType incomingVariable, dateTimePicker, or now.
operations Ordered transformations. Each has operation and parameter arguments.

Text operations: Replace, ToLower, ToUpper, Trim, TrimStart, TrimEnd. Number operations: RoundUp, RoundDown, Decimal. Date/time operations: AddSecond, AddMinute, AddHour, AddDay, AddMonth, AddYear, Date, Hour, Day, Week, Month, Year. Operation names are parsed case-insensitively.

8.4 if

Evaluates OR groups of AND conditions. next is true and branches.false is false.

if:
  trueLabel: "True"
  falseLabel: "False"
  any:
  - all:
    - left: { alias: Total }
      operator: greaterThan
      right: { intValue: 0, parameterType: constant }
      dataType: integer
Property Meaning
trueLabel Main-exit display label; default True.
falseLabel False-exit display label; default False.
any Required non-empty OR list. Every group requires a non-empty all condition list.

The legacy third IfAction branch is not supported.

8.5 alert

Displays a message and then follows next.

alert:
  title: { value: Completed }
  message: { value: The operation completed. }
  confirmButton: { text: OK }

title and message are evaluated parameters. confirmButton uses the common button structure.

8.6 methodCaller

Calls a published MethodAction.

methodCaller:
  methodId: method-id
  methodName: CalculateTotal
  isActive: true
  preSetupBreakpoint: false
  postSetupBreakpoint: false
  cancelOnError: false
  requiredParameters: []
  returnParameters: []
Property Required/default Meaning
methodId Required Runtime method action identifier.
methodName Optional Display/reference name.
isActive Default false Preserved legacy setting; the current handler does not enforce it.
preSetupBreakpoint Default false Debugger break before setup.
postSetupBreakpoint Default false Debugger break after setup.
cancelOnError Default false Requests cancellation on error.
requiredParameters Optional Method arguments.
returnParameters Optional Expected returned variables.

Required parameter properties are name, type (default text), isRequired, businessEntityName, and parameter. Return parameter properties are name, type (default text), isRequired, localName, and businessEntityName.

8.7 updateEntity

Updates one business entity and follows next.

updateEntity:
  target: Customer
  identifier: { alias: CustomerId }
  parameters:
  - name: Status
    value: Active
    parameterType: constant
  suppressNotification: false
  suppressError: false
  postSetupBreakpoint: false
  cancelOnError: false
Property Meaning
target Required controller/entity target name.
identifier Required parameter selecting the entity.
parameters Named property values to update.
suppressNotification Suppresses normal success notification.
suppressError Suppresses normal error presentation.
postSetupBreakpoint Debugger break after setup.
cancelOnError Requests graph cancellation on error.

The entity result can be exported with source result.

8.8 createEntityForm

Opens a create form. next is submit and branches.cancel is cancel.

createEntityForm:
  target: Customer
  parameters: []
  upsertOnConfirm: true
  submitLabel: On Submit
  cancelLabel: On Cancel
  suppressNotification: false
  suppressError: false
  cancelOnError: false
Property Meaning
target Required controller/entity target.
parameters Named initial form values.
upsertOnConfirm Upserts when confirmed; default true.
submitLabel Main-exit label; default On Submit.
cancelLabel Cancel-exit label; default On Cancel.
suppressNotification Suppresses normal notification.
suppressError Suppresses normal error presentation.
cancelOnError Requests graph cancellation on error.

The submitted entity can be exported with source result.

8.9 refresh

Requests a host UI refresh and follows next. It has no action-specific properties:

type: refresh
name: RefreshPage
refresh: {}

8.10 webService

Evaluates and submits an HTTP request.

webService:
  method: post
  navigation:
    value: /api/customers
    parameterType: constant
  headers:
  - name: Authorization
    value: Bearer $$Secret:ApiToken$$
  requestContentType: applicationJson
  responseContentType: applicationJson
  body:
  - name: payload
    value: '{"name":"$$Cascaded:CustomerName$$"}'
  timeoutDelay: 30
  numberOfRetryOnFail: 2
  postSetupBreakpoint: false
  cancelOnError: true
Property Required/default Meaning
method Default get get, post, put, patch, or delete.
navigation Required Evaluated endpoint parameter. Relative URLs target the local host.
headers Optional Named evaluated HTTP header parameters.
requestContentType Default applicationJson Request MIME mode.
responseContentType Default applicationJson Expected response conversion mode.
body Optional by schema Request body parameters. See body rules below.
timeoutDelay Default 0 Advertised timeout setting; currently unused by ActionHandler.
numberOfRetryOnFail Default 1 Advertised retry count; currently unused by ActionHandler.
postSetupBreakpoint Default false Debugger break after setup.
cancelOnError Default false Requests graph cancellation after an exception.

Request content types: applicationJson, applicationXml, textXml, applicationXWwwFormUrlEncoded, multipartFormData, applicationOctetStream, applicationGraphql, and applicationNdJson.

Response content types: textPlain, textHtml, textCss, textJavascript, applicationJson, applicationXml, textXml, applicationYaml, applicationGraphql, applicationOctetStream, imagePng, imageJpeg, imageGif, applicationPdf, applicationZip, videoMp4, audioMpeg, applicationJavascript, applicationVndApiJson, and applicationNdJson.

Runtime body behavior:

Current response conversion is implemented for JSON/plain/XML text and for octet-stream/PNG/JPEG/GIF/PDF/ZIP bytes. Other advertised response types may produce no response value. HTTP 4xx/5xx status codes are not automatically turned into exceptions by the current handler.

Web-service outputs can use response, responseCode, exceptionMessage, and dataType.

9. Runtime compatibility nodes

Actions without a curated typed converter use:

type: runtime
name: Delay
runtime:
  actionType: DelayAction
  configurationJson: '{"Seconds":2}'
Property Required Meaning
actionType Yes Exact allow-listed CLR action type name.
configurationJson Yes Compact JSON containing action-specific configuration. Graph links and runtime IDs/state are excluded.

Currently allow-listed runtime types are:

EventAction, MethodAction, BackgroundAction, GetEntityAction, GetEntityListAction, GetLookupAction, UpdateEntityListAction, DeleteEntityListAction, LoadFileAction, DataParserAction, ConvertorAction, ExportAction, ToastAction, NavigationAction, DelayAction, ReloadAction, CreateEntityAction, UpdateEntityFormAction, DeleteEntityAction, WhileLoopAction, LoopAction, BreakLoop, ContinueLoop, DownloadAction, SendMailAction, LoadingAction, SaveFileAction, ReturnAction, and ConfirmAction.

The JSON schema is the corresponding action model's serializable properties. Runtime nodes are safe only for known allow-listed types; arbitrary CLR type activation and JSON type-name handling are disabled.

10. Compilation and validation

Compilation performs these stages:

  1. Parse YAML into the compact specification.
  2. Validate document version, scope, root, node names, and graph shape.
  3. Select exactly one converter for every node type.
  4. Generate action IDs and graph positions.
  5. Resolve parameters and semantic aliases.
  6. Create local/outgoing variable metadata.
  7. Connect next and named branches.
  8. Run the action model's recursive validation.
  9. Produce the compiled IAction graph and canonical YAML/hash metadata.

A graph may contain at most 512 nodes and have a maximum nesting depth of 64. Cycles and reuse of the same YAML node object are rejected.

Decompilation performs the reverse operation. It rejects runtime graphs that cannot be represented semantically, for example an incoming variable ID with no available alias or a legacy action feature unsupported by its typed converter.

Compiler failures are written as one JSON file per failure under ActionFlowLogs, named:

ActionCompilerErrorLog-yyyyMMdd-HHmmss-fffffff.json

The log contains the serialized action where available, error details, compiler operation, timestamp, and diagnostic context.

11. Complete example

version: 1
scope: solution
root:
  type: user
  name: AskForEmail
  outputs:
  - source: businessEntity
    alias: BusinessEntity:Customer
    type: businessEntity
    scope: cascaded
  user:
    target: Customer
    published: true
    displayLabel:
      value: Update email
    button:
      text: Update email
    visibility: always
    enabled: always
    singleRun: true
  next:
    type: input
    name: ReadEmail
    outputs:
    - source: Email
      alias: Email
      type: text
      scope: cascaded
    input:
      title:
        value: Email address
      fields:
      - name: Email
        required: true
        type: email
    branches:
      cancel:
        type: alert
        name: Cancelled
        alert:
          message:
            value: No changes were made.
    next:
      type: updateEntity
      name: SaveEmail
      updateEntity:
        target: Customer
        identifier:
          value: $$Cascaded:BusinessEntity:Customer.PrimaryKey$$
        parameters:
        - name: Email
          alias: Email
      next:
        type: refresh
        name: RefreshCustomer
        refresh: {}

12. Authoring checklist

Before saving or publishing YAML:

  1. Use version: 1 and a non-unknown scope.
  2. Give every node a non-empty and preferably unique name without spaces.
  3. Match type with exactly one configuration block.
  4. Publish only real semantic sources and assign compatible types.
  5. Declare an alias before consuming it; keep aliases unique in scope.
  6. Use parameterType: constant for literal values when evaluation is not wanted.
  7. Keep credentials as $$Secret:<name>$$ references.
  8. Use only branch names supported by that node type.
  9. Account explicitly for cancel and error paths.
  10. Compile and perform a semantic YAML round trip before publication.