{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://pms.stayrank.ai/workflow-examples/workflow.schema.json",
  "title": "Keyful portable workflow v1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "format",
    "version",
    "name",
    "trigger",
    "actions"
  ],
  "properties": {
    "format": {
      "const": "keyful.workflow"
    },
    "version": {
      "const": 1
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "trigger": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "event"
      ],
      "properties": {
        "event": {
          "enum": [
            "schedule.due",
            "integration.received",
            "webhook.received",
            "reservation.updated",
            "reservation.created",
            "reservation.checked_in",
            "reservation.checked_out",
            "reservation.cancelled",
            "incident.created",
            "message.received",
            "task.completed",
            "task.overdue",
            "lead.created",
            "lead.no_reply",
            "lead.replied",
            "lead.status_changed",
            "automation.triggered"
          ]
        },
        "toolkit": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9_]{1,80}$"
        },
        "slug": {
          "type": "string"
        },
        "config": {
          "type": "object"
        }
      }
    },
    "schedule": {
      "oneOf": [
        {
          "type": "null"
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "frequency",
            "time",
            "days",
            "timezone",
            "intervalMinutes"
          ],
          "properties": {
            "frequency": {
              "enum": [
                "daily",
                "weekly",
                "interval"
              ]
            },
            "time": {
              "type": "string",
              "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$"
            },
            "days": {
              "type": "array",
              "minItems": 1,
              "maxItems": 7,
              "uniqueItems": true,
              "items": {
                "type": "integer",
                "minimum": 1,
                "maximum": 7
              }
            },
            "timezone": {
              "type": "string",
              "maxLength": 80
            },
            "intervalMinutes": {
              "type": "integer",
              "minimum": 15,
              "maximum": 1440
            }
          }
        }
      ]
    },
    "actions": {
      "type": "array",
      "maxItems": 60,
      "items": {
        "$ref": "#/$defs/node"
      }
    },
    "canvas": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "positions": {
          "type": "object",
          "maxProperties": 61,
          "additionalProperties": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "x",
              "y"
            ],
            "properties": {
              "x": {
                "type": "number",
                "minimum": -100000,
                "maximum": 100000
              },
              "y": {
                "type": "number",
                "minimum": -100000,
                "maximum": 100000
              }
            }
          }
        }
      }
    }
  },
  "$defs": {
    "node": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "config"
          ],
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,80}$",
              "not": {
                "const": "__trigger"
              }
            },
            "kind": {
              "enum": [
                "create_task",
                "notify_team",
                "tag_conversation",
                "send_message_draft",
                "http_request",
                "connected_mail",
                "composio_action",
                "zernio_action",
                "send_template_message",
                "propose_meeting_slots",
                "schedule_meeting",
                "set_lead_status"
              ]
            },
            "config": {
              "type": "object",
              "propertyNames": {
                "not": {
                  "enum": [
                    "connectionId",
                    "tenantId",
                    "userId",
                    "approval",
                    "approvedBy",
                    "ruleId",
                    "nodeId",
                    "scheduleHash",
                    "accessToken",
                    "refreshToken",
                    "password",
                    "apiKey"
                  ]
                }
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "condition"
          ],
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,80}$",
              "not": {
                "const": "__trigger"
              }
            },
            "kind": {
              "const": "filter"
            },
            "condition": {
              "type": "object",
              "required": [
                "combinator",
                "rules"
              ],
              "additionalProperties": false,
              "properties": {
                "combinator": {
                  "enum": [
                    "and",
                    "or"
                  ]
                },
                "rules": {
                  "type": "array",
                  "maxItems": 25,
                  "items": {
                    "type": "object",
                    "required": [
                      "field",
                      "operator",
                      "value"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "field": {
                        "type": "string",
                        "maxLength": 200
                      },
                      "operator": {
                        "enum": [
                          "equals",
                          "not_equals",
                          "contains",
                          "not_contains",
                          "is_empty",
                          "is_not_empty",
                          "greater_than",
                          "less_than"
                        ]
                      },
                      "value": {
                        "type": "string",
                        "maxLength": 4000
                      }
                    }
                  }
                }
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "condition",
            "then",
            "else"
          ],
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,80}$",
              "not": {
                "const": "__trigger"
              }
            },
            "kind": {
              "const": "branch"
            },
            "condition": {
              "type": "object",
              "required": [
                "combinator",
                "rules"
              ],
              "additionalProperties": false,
              "properties": {
                "combinator": {
                  "enum": [
                    "and",
                    "or"
                  ]
                },
                "rules": {
                  "type": "array",
                  "maxItems": 25,
                  "items": {
                    "type": "object",
                    "required": [
                      "field",
                      "operator",
                      "value"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "field": {
                        "type": "string",
                        "maxLength": 200
                      },
                      "operator": {
                        "enum": [
                          "equals",
                          "not_equals",
                          "contains",
                          "not_contains",
                          "is_empty",
                          "is_not_empty",
                          "greater_than",
                          "less_than"
                        ]
                      },
                      "value": {
                        "type": "string",
                        "maxLength": 4000
                      }
                    }
                  }
                }
              }
            },
            "then": {
              "type": "array",
              "maxItems": 60,
              "items": {
                "$ref": "#/$defs/node"
              }
            },
            "else": {
              "type": "array",
              "maxItems": 60,
              "items": {
                "$ref": "#/$defs/node"
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "source",
            "maxIterations",
            "body"
          ],
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,80}$",
              "not": {
                "const": "__trigger"
              }
            },
            "kind": {
              "const": "loop"
            },
            "source": {
              "enum": [
                "reservation_tasks",
                "property_tasks",
                "property_incidents",
                "owner_properties"
              ]
            },
            "maxIterations": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25
            },
            "body": {
              "type": "array",
              "maxItems": 60,
              "items": {
                "$ref": "#/$defs/node"
              }
            }
          }
        }
      ]
    }
  }
}
