{
  "document": {
    "dsl": "1.0.0",
    "name": "Workflow",
    "version": "0.0.1",
    "namespace": "default",
    "metadata": {
      "variables": {
        "schema": {
          "format": "json",
          "document": {
            "type": "object",
            "properties": {
              "completed": { "type": "number", "default": 0 },
              "failed": { "type": "number", "default": 0 },
              "attempts": { "type": "number", "default": 0 },
              "success": { "type": "boolean", "default": false },
              "lastError": { "type": "string", "default": "" },
              "result": { "type": "number", "default": 0 }
            },
            "title": "Variables"
          }
        }
      }
    }
  },
  "input": {
    "schema": {
      "format": "json",
      "document": {
        "type": "object",
        "properties": {
          "tasks": { "type": "array" }
        },
        "title": "Inputs"
      }
    }
  },
  "output": {
    "schema": {
      "format": "json",
      "document": {
        "type": "object",
        "properties": {
          "completed": { "type": "number" },
          "failed": { "type": "number" }
        },
        "title": "Outputs"
      }
    }
  },
  "do": [
    {
      "Sequence_1": {
        "do": [
          {
            "WorkflowStart": {
              "set": "${Object.entries($workflow.definition?.document?.metadata?.variables?.schema?.document?.properties || {}).reduce((acc, [name, def]) => ({ ...acc, [name]: def?.default }), {}) }",
              "output": { "as": "${$input}" },
              "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
              "metadata": { "activityType": "Assign", "displayName": "Workflow start", "fullName": "Assign", "isTransparent": true }
            }
          },
          {
            "For_Each_1": {
              "for": {
                "each": "currentTask",
                "in": "${$workflow.input.tasks}",
                "at": "taskIndex"
              },
              "do": [
                {
                  "For_Each_1#Body": {
                    "do": [
                      {
                        "Assign_ResetAttempts": {
                          "set": { "attempts": 0 },
                          "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                          "metadata": { "activityType": "Assign", "displayName": "Reset Attempts", "fullName": "Assign", "isTransparent": false }
                        }
                      },
                      {
                        "Assign_ResetSuccess": {
                          "set": { "success": false },
                          "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                          "metadata": { "activityType": "Assign", "displayName": "Reset Success", "fullName": "Assign", "isTransparent": false }
                        }
                      },
                      {
                        "Assign_ResetLastError": {
                          "set": { "lastError": "${''}" },
                          "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                          "metadata": { "activityType": "Assign", "displayName": "Reset Last Error", "fullName": "Assign", "isTransparent": false }
                        }
                      },
                      {
                        "Assign_ResetResult": {
                          "set": { "result": 0 },
                          "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                          "metadata": { "activityType": "Assign", "displayName": "Reset Result", "fullName": "Assign", "isTransparent": false }
                        }
                      },
                      {
                        "Do_While_1": {
                          "for": { "in": "${ [1] }" },
                          "doWhile": "${!$context.variables.success && $context.variables.attempts < $currentTask.maxRetries}",
                          "do": [
                            {
                              "Do_While_1#Body": {
                                "do": [
                                  {
                                    "Try_Catch_1": {
                                      "try": [
                                        {
                                          "Javascript_1": {
                                            "run": {
                                              "script": {
                                                "language": "javascript",
                                                "code": "if ($context.variables.attempts < ($currentTask.failsBeforeSuccess ?? 0)) { throw new Error('flaky on attempt ' + $context.variables.attempts); } return $currentTask.target * 2;",
                                                "arguments": "${{ \"$context\": $context, \"$workflow\": $workflow, \"$input\": $input }}"
                                              }
                                            },
                                            "export": { "as": "{ ...$context, outputs: { ...$context?.outputs, \"Javascript_1\": $output } }" },
                                            "metadata": { "activityType": "JsInvoke", "displayName": "Attempt Operation", "fullName": "JsInvoke" }
                                          }
                                        },
                                        {
                                          "Assign_MarkSuccess": {
                                            "set": { "success": true },
                                            "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                            "metadata": { "activityType": "Assign", "displayName": "Mark Success", "fullName": "Assign", "isTransparent": false }
                                          }
                                        },
                                        {
                                          "Assign_StoreResult": {
                                            "set": { "result": "${$context.outputs.Javascript_1}" },
                                            "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                            "metadata": { "activityType": "Assign", "displayName": "Store Result", "fullName": "Assign", "isTransparent": false }
                                          }
                                        },
                                        {
                                          "Assign_BumpAttemptsOk": {
                                            "set": { "attempts": "${$context.variables.attempts + 1}" },
                                            "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                            "metadata": { "activityType": "Assign", "displayName": "Bump Attempts (success)", "fullName": "Assign", "isTransparent": false }
                                          }
                                        }
                                      ],
                                      "catch": {
                                        "as": "error",
                                        "do": [
                                          {
                                            "Assign_BumpAttemptsErr": {
                                              "set": { "attempts": "${$context.variables.attempts + 1}" },
                                              "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                              "metadata": { "activityType": "Assign", "displayName": "Bump Attempts (failure)", "fullName": "Assign", "isTransparent": false }
                                            }
                                          },
                                          {
                                            "Assign_RecordError": {
                                              "set": { "lastError": "${$error.title}" },
                                              "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                              "metadata": { "activityType": "Assign", "displayName": "Record Error", "fullName": "Assign", "isTransparent": false }
                                            }
                                          },
                                          {
                                            "If_1#Wrapper": {
                                              "do": [
                                                {
                                                  "If_1": {
                                                    "switch": [
                                                      { "case": { "when": "${$context.variables.attempts >= $currentTask.maxRetries}", "then": "If_1#Then" } },
                                                      { "default": { "then": "If_1#Else" } }
                                                    ],
                                                    "metadata": { "displayName": "If" }
                                                  }
                                                },
                                                {
                                                  "If_1#Then": {
                                                    "do": [
                                                      {
                                                        "Break_1": {
                                                          "break": "true",
                                                          "then": "exit",
                                                          "metadata": { "activityType": "Break", "displayName": "Out Of Retries", "fullName": "Break" }
                                                        }
                                                      }
                                                    ],
                                                    "then": "exit"
                                                  }
                                                },
                                                {
                                                  "If_1#Else": {
                                                    "do": [],
                                                    "then": "exit"
                                                  }
                                                }
                                              ],
                                              "export": { "as": "{ ...$context, outputs: { ...$context?.outputs, \"If_1\": $output } }" },
                                              "metadata": { "activityType": "If", "displayName": "If", "fullName": "If" }
                                            }
                                          }
                                        ]
                                      },
                                      "export": { "as": "{ ...$context, outputs: { ...$context?.outputs, \"Try_Catch_1\": $output } }" },
                                      "metadata": { "activityType": "TryCatch", "displayName": "Try Operation", "fullName": "TryCatch" }
                                    }
                                  }
                                ],
                                "export": {
                                  "as": "{ ...$context, outputs: { ...$context?.outputs, \"Do_While_1\": { ...$context?.outputs?.Do_While_1, results: [ ...($context?.outputs?.Do_While_1?.results ?? []), ...([$output] ?? []) ] } } }"
                                }
                              }
                            }
                          ],
                          "output": { "as": "${$context.outputs.Do_While_1}" },
                          "metadata": { "activityType": "DoWhile", "displayName": "Retry Loop", "fullName": "DoWhile" }
                        }
                      },
                      {
                        "If_2#Wrapper": {
                          "do": [
                            {
                              "If_2": {
                                "switch": [
                                  { "case": { "when": "${$context.variables.success}", "then": "If_2#Then" } },
                                  { "default": { "then": "If_2#Else" } }
                                ],
                                "metadata": { "displayName": "If" }
                              }
                            },
                            {
                              "If_2#Then": {
                                "do": [
                                  {
                                    "Assign_IncCompleted": {
                                      "set": { "completed": "${$context.variables.completed + 1}" },
                                      "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                      "metadata": { "activityType": "Assign", "displayName": "Increment Completed", "fullName": "Assign", "isTransparent": false }
                                    }
                                  }
                                ],
                                "then": "exit"
                              }
                            },
                            {
                              "If_2#Else": {
                                "do": [
                                  {
                                    "Assign_IncFailed": {
                                      "set": { "failed": "${$context.variables.failed + 1}" },
                                      "export": { "as": "{ ...$context, variables: { ...$context.variables, ...$output } }" },
                                      "metadata": { "activityType": "Assign", "displayName": "Increment Failed", "fullName": "Assign", "isTransparent": false }
                                    }
                                  }
                                ],
                                "then": "exit"
                              }
                            }
                          ],
                          "export": { "as": "{ ...$context, outputs: { ...$context?.outputs, \"If_2\": $output } }" },
                          "metadata": { "activityType": "If", "displayName": "If", "fullName": "If" }
                        }
                      }
                    ],
                    "export": {
                      "as": "{ ...$context, outputs: { ...$context?.outputs, \"For_Each_1\": { ...$context?.outputs?.For_Each_1, results: [ ...($taskIndex == 0 ? [] : ($context?.outputs?.For_Each_1?.results ?? [])), ...([$output] ?? []) ] } } }"
                    }
                  }
                }
              ],
              "output": { "as": "${$context.outputs.For_Each_1}" },
              "metadata": { "activityType": "ForEach", "displayName": "Process Each Task", "fullName": "ForEach" }
            }
          },
          {
            "Response_1": {
              "response": "${{ completed: $context.variables.completed, failed: $context.variables.failed }}",
              "markJobAsFailed": false,
              "then": "end",
              "export": { "as": "{ ...$context, outputs: { ...$context?.outputs, \"Response_1\": $output } }" },
              "metadata": { "activityType": "Response", "displayName": "Response", "fullName": "Response" }
            }
          }
        ],
        "metadata": { "activityType": "Sequence", "displayName": "Sequence", "fullName": "Sequence" }
      }
    }
  ],
  "evaluate": { "mode": "strict", "language": "javascript" }
}
