openapi: 3.0.0

info:
  title: ZenBPM OpenAPI
  description: REST API for ZenBPM
  version: 0.1.0
  contact:
    name: API Support
    email: info@pbinitiative.org
  license:
    name: AGPL
    url: https://www.gnu.org/licenses/agpl-3.0.en.html

servers:
  - url: http://localhost:8080/v1

tags:
  - name: process-definition
  - name: process-instance
  - name: dmn-resource-definition
  - name: decision-definition
  - name: decision-instance
  - name: job
  - name: message
  - name: incident
  - name: test

paths:
  /dmn-resource-definitions:
    post:
      operationId: createDmnResourceDefinition
      summary: Deploy a new dmn resource definition
      tags:
        - dmn-resource-definition
      requestBody:
        required: true
        content:
          application/xml:
            schema:
              type: string
              format: xml
            example: |
              <?xml version="1.0" encoding="UTF-8"?>
              <definitions>
                <decision id="loan-approval" name="Loan Approval">
                  ...
                </decision>
              </definitions>
      responses:
        201:
          description: Dmn resource definition deployed
          content:
            application/json:
              schema:
                type: object
                required:
                  - dmnResourceDefinitionKey
                properties:
                  dmnResourceDefinitionKey:
                    type: integer
                    format: int64
              example:
                dmnResourceDefinitionKey: 4503599627370495
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        409:
          description: Conflict - dmn resource definition already exists
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

    get:
      operationId: getDmnResourceDefinitions
      summary: Get list of dmn resource definitions
      tags:
        - dmn-resource-definition
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
          example: 10
        - name: onlyLatest
          in: query
          schema:
            type: boolean
            default: false
          description: If true, returns only the latest version of each DMN resource definition grouped by dmnResourceDefinitionId
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [ dmnDefinitionName, dmnResourceDefinitionId, version, key ]
          description: Sort field
        - $ref: "#/components/parameters/sortOrder"
        - name: dmnResourceDefinitionId
          in: query
          schema:
            type: string
          description: Filter by DMN resource definition ID to get all versions
        - name: dmnDefinitionName
          in: query
          schema:
            type: string
          description: Filter by name (partial match)
      responses:
        200:
          description: List of dmn resource definitions
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DmnResourceDefinitionsPage"
              example:
                items:
                  - key: 4503599627370496
                    version: 2
                    dmnResourceDefinitionId: "loan-approval"
                    dmnDefinitionName: "Loan Approval Decision"
                  - key: 4503599627370497
                    version: 1
                    dmnResourceDefinitionId: "credit-score-check"
                    dmnDefinitionName: "Credit Score Check"
                page: 1
                size: 10
                count: 2
                totalCount: 2
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /dmn-resource-definitions/{dmnResourceDefinitionKey}:
    get:
      operationId: getDmnResourceDefinition
      summary: Get dmn resource definition
      tags:
        - dmn-resource-definition
      parameters:
        - name: dmnResourceDefinitionKey
          required: true
          in: path
          schema:
            type: integer
            format: int64
          example: 4503599627370495
      responses:
        200:
          description: Dmn resource definition
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DmnResourceDefinitionDetail"
              example:
                key: 4503599627370495
                version: 2
                dmnResourceDefinitionId: "loan-approval"
                dmnDefinitionName: "Loan Approval Decision"
                dmnData: |
                  <?xml version="1.0" encoding="UTF-8"?>
                  <definitions>
                    <decision id="loan-approval" name="Loan Approval">
                      ...
                    </decision>
                  </definitions>
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /decision-definitions/{decisionId}/evaluate:
    post:
      operationId: evaluateDecision
      summary: Evaluate latest version of decision definition directly in engine
      tags:
        - decision-definition
      parameters:
        - name: decisionId
          required: true
          in: path
          schema:
            type: string
          example: "loan-approval"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - bindingType
              properties:
                bindingType:
                  type: string
                  enum:
                    - latest
                    - deployment #TODO: unsupported
                    - versionTag
                dmnResourceDefinitionId:
                  description: Can be used in combination with bindingType latest
                  type: string
                versionTag:
                  description: Is used in combination with bindingType versionTag
                  type: string
                variables:
                  type: object
            example:
              bindingType: "latest"
              variables:
                age: 25
                income: 50000
      responses:
        200:
          description: Decision Evaluated
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EvaluatedDRDResult"
              example:
                evaluatedDecisions:
                  - decisionId: "loan-approval"
                    decisionName: "Loan Approval"
                    decisionType: "DECISION_TABLE"
                    decisionDefinitionVersion: 1
                    dmnResourceDefinitionKey: 4503599627370495
                    dmnResourceDefinitionId: "loan-approval"
                    matchedRules:
                      - ruleId: "rule1"
                        ruleIndex: 0
                        evaluatedOutputs:
                          - outputId: "output1"
                            outputName: "approved"
                            outputValue: { "approved": true }
                    decisionOutput: { "approved": true }
                    evaluatedInputs:
                      - inputId: "input1"
                        inputName: "Age"
                        inputExpression: "age"
                        inputValue: { "age": 25 }
                      - inputId: "input2"
                        inputName: "Income"
                        inputExpression: "income"
                        inputValue: { "income": 50000 }
                decisionOutput: { "approved": true }
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /decision-instances:
    get:
      operationId: getDecisionInstances
      summary: Get list of decision instances
      tags:
        - decision-instance
      parameters:
        - name: dmnResourceDefinitionKey
          in: query
          schema:
            type: integer
            format: int64
          description: Filter by DMN resource definition key
        - name: dmnResourceDefinitionId
          in: query
          schema:
            type: string
          description: Filter by DMN resource definition ID
        - name: processInstanceKey
          in: query
          schema:
            type: integer
            format: int64
          description: Filter by process instance
        - name: evaluatedFrom
          in: query
          schema:
            type: string
            format: date-time
          description: Filter - evaluated after this date
        - name: evaluatedTo
          in: query
          schema:
            type: string
            format: date-time
          description: Filter - evaluated before this date
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [ evaluatedAt, key ]
          description: Sort field
        - $ref: "#/components/parameters/sortOrder"
      responses:
        200:
          description: List of decision instances
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DecisionInstancePartitionPage"
              example:
                partitions:
                  - partition: 1
                    count: 156
                    items:
                      - key: 4503599627370600
                        dmnResourceDefinitionKey: 4503599627370495
                        dmnResourceDefinitionId: "loan-approval"
                        processInstanceKey: 4503599627370501
                        flowElementInstanceKey: 4503599627370550
                        evaluatedAt: "2025-08-22T14:30:25Z"
                        inputCount: 3
                        outputCount: 2
                  - partition: 2
                    count: 98
                    items:
                      - key: 9007199254740995
                        dmnResourceDefinitionKey: 4503599627370495
                        dmnResourceDefinitionId: "loan-approval"
                        processInstanceKey: 9007199254740992
                        flowElementInstanceKey: 9007199254740980
                        evaluatedAt: "2025-08-22T15:45:33Z"
                        inputCount: 3
                        outputCount: 2
                page: 1
                size: 10
                count: 2
                totalCount: 254
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible nodes
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /decision-instances/{decisionInstanceKey}:
    get:
      operationId: getDecisionInstance
      summary: Get decision instance details
      tags:
        - decision-instance
      parameters:
        - name: decisionInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370600
      responses:
        200:
          description: Decision instance details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DecisionInstanceDetail"
              example:
                key: 4503599627370600
                dmnResourceDefinitionKey: 4503599627370495
                dmnResourceDefinitionId: "loan-approval"
                dmnResourceDefinitionVersion: 1
                processInstanceKey: 4503599627370501
                flowElementInstanceKey: 4503599627370550
                evaluatedAt: "2025-08-22T14:30:25Z"
                decisionRequirementsKey: 4503599627370490
                decisionRequirementsId: "loan-drd"
                evaluatedDecisions:
                  - decisionId: "loan-approval"
                    decisionName: "Loan Approval"
                    decisionType: "DECISION_TABLE"
                    evaluationOrder: 1
                    inputs:
                      - inputId: "input_amount"
                        inputName: "Loan Amount"
                        inputExpression: "loanAmount"
                        inputValue: 50000
                    outputs:
                      - outputId: "output_approved"
                        outputName: "Approved"
                        outputValue: true
                    matchedRules:
                      - ruleId: "rule_1"
                        ruleIndex: 0
                        evaluatedOutputs:
                          - outputId: "output_approved"
                            outputName: "Approved"
                            outputValue: true
                decisionOutput:
                  approved: true
        404:
          description: Decision instance not found
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-definitions:
    post:
      operationId: createProcessDefinition
      summary: Deploy a new process definition
      tags:
        - process-definition
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - resource
              properties:
                resource:
                  type: string
                  format: binary
                  description: BPMN process definition file (.bpmn format only, max 4MB)
            encoding:
              resource:
                contentType: application/octet-stream

      responses:
        201:
          description: Process definition deployed
          content:
            application/json:
              schema:
                type: object
                required:
                  - processDefinitionKey
                properties:
                  processDefinitionKey:
                    type: integer
                    format: int64
              example:
                processDefinitionKey: 4503599627370498
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_REQUEST"
                message: "The provided BPMN file is invalid: missing required 'process' element"
        409:
          description: Conflict - process definition already exists
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "CONFLICT"
                message: "A process definition with the same BPMN process ID and version already exists"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "INTERNAL_SERVER_ERROR"
                message: "An unexpected error occurred while processing the BPMN file"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_GATEWAY"
                message: "Failed to redirect request to responsible node"
    get:
      operationId: getProcessDefinitions
      summary: Get list of process definitions
      tags:
        - process-definition
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
          example: 10
        - name: onlyLatest
          in: query
          schema:
            type: boolean
            default: false
          description: If true, returns only the latest version of each process definition grouped by bpmnProcessId
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [ name, bpmnProcessId, bpmnProcessName, version, key ]
          description: Sort field
        - $ref: "#/components/parameters/sortOrder"
        - name: bpmnProcessId
          in: query
          schema:
            type: string
          description: Filter by BPMN process ID to get all versions of a specific process
      responses:
        200:
          description: List of process definitions
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessDefinitionsPage"
              example:
                items:
                  - key: 4503599627370498
                    version: 1
                    bpmnProcessId: "loan-application"
                  - key: 4503599627370499
                    version: 2
                    bpmnProcessId: "loan-application"
                  - key: 4503599627370500
                    version: 1
                    bpmnProcessId: "credit-check"
                page: 1
                size: 10
                count: 2
                totalCount: 2
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_REQUEST"
                message: "The request parameters are invalid"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "INTERNAL_SERVER_ERROR"
                message: "An unexpected error occurred while retrieving process definitions"

  /process-definitions/{processDefinitionKey}:
    get:
      operationId: getProcessDefinition
      summary: Get process definition
      tags:
        - process-definition
      parameters:
        - name: processDefinitionKey
          required: true
          in: path
          schema:
            type: integer
            format: int64
          example: 4503599627370498
      responses:
        200:
          description: Process definition
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessDefinitionDetail"
              example:
                key: 4503599627370498
                version: 1
                bpmnProcessId: "loan-application"
                bpmnData: |
                  <?xml version="1.0" encoding="UTF-8"?>
                  <bpmn:definitions>
                    <bpmn:process id="loan-application" name="Loan Application Process" isExecutable="true">
                      ...
                    </bpmn:process>
                  </bpmn:definitions>
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_REQUEST"
                message: "The provided processDefinitionKey is invalid"
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "NOT_FOUND"
                message: "No process definition found for the given key"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "INTERNAL_SERVER_ERROR"
                message: "An unexpected error occurred while retrieving the process definition"

  /process-definitions/{processDefinitionKey}/statistics:
    get:
      operationId: getProcessDefinitionElementStatistics
      summary: Get running and incident counts per BPMN element
      tags:
        - process-definition
      parameters:
        - name: processDefinitionKey
          required: true
          in: path
          schema:
            type: integer
            format: int64
          example: 4503599627370498
      responses:
        200:
          description: Element statistics as a map of elementId to counts
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ElementStatisticsPartitions"
              example:
                partitions:
                  - partition: 1
                    items:
                      Task_CheckApplication:
                        activeCount: 5
                        incidentCount: 2
                      Task_CreditCheck:
                        activeCount: 3
                        incidentCount: 1
                  - partition: 2
                    items:
                      Task_CheckApplication:
                        activeCount: 4
                        incidentCount: 0
                      Task_CreditCheck:
                        activeCount: 6
                        incidentCount: 3
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_REQUEST"
                message: "The provided processDefinitionKey is invalid"
        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "NOT_FOUND"
                message: "No process definition found for the given key"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "INTERNAL_SERVER_ERROR"
                message: "An unexpected error occurred while retrieving process definition statistics"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_GATEWAY"
                message: "Failed to redirect request to responsible node"

  /process-definitions/statistics:
    get:
      operationId: getProcessDefinitionStatistics
      summary: Get process definition statistics
      tags:
        - process-definition
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
        - name: onlyLatest
          in: query
          schema:
            type: boolean
            default: false
          description: If true, returns only the latest version of each process definition
        - name: bpmnProcessIdIn
          in: query
          schema:
            type: array
            items:
              type: string
          description: Filter by BPMN process ID
        - name: bpmnProcessDefinitionKeyIn
          in: query
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: Filter by process definition key
        - name: name
          in: query
          schema:
            type: string
          description: Filter by name (partial match)
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [name, bpmnProcessId, version, instanceCount, incidentCount]
          description: Sort field
        - name: sortOrder
          in: query
          schema:
            type: string
            enum: [asc, desc]
          description: Sort direction
      responses:
        200:
          description: Process definition statistics
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessDefinitionStatisticsPage"
              example:
                items:
                  - key: 4503599627370498
                    version: 3
                    bpmnProcessId: "loan-application"
                    name: "Loan Application Process"
                    bpmnResourceName: "loan-application.bpmn"
                    instanceCounts:
                      total: 1250
                      active: 45
                      completed: 1180
                      terminated: 20
                      failed: 5
                  - key: 4503599627370510
                    version: 1
                    bpmnProcessId: "order-fulfillment"
                    name: "Order Fulfillment"
                    bpmnResourceName: "order-fulfillment.bpmn"
                    instanceCounts:
                      total: 890
                      active: 120
                      completed: 750
                      terminated: 15
                      failed: 5
                page: 1
                size: 10
                count: 2
                totalCount: 2
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_REQUEST"
                message: "The request parameters are invalid"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "INTERNAL_SERVER_ERROR"
                message: "An unexpected error occurred while retrieving process definition statistics"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
              example:
                code: "BAD_GATEWAY"
                message: "Failed to redirect request to responsible node"

  /process-instances:
    post:
      operationId: createProcessInstance
      summary: Create a new process instance
      tags:
        - process-instance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - processDefinitionKey
              properties:
                processDefinitionKey:
                  type: integer
                  format: int64
                variables:
                  type: object
                historyTimeToLive:
                  type: string
                  description: Duration for which process instance data are kept in storage after the process instance ends. If omitted the default will be picked up from engine configuration. (1d8h, 1M5d8h)
                  example: 30d
                businessKey:
                  type: string
                  description: Business key of the process instance used mainly for correlating process instance to the business entity.
            example:
              processDefinitionKey: 4503599627370498
              variables:
                customerId: "customer-456"
                amount: 1000
                applicationDate: "2025-08-22"
      responses:
        201:
          description: Process instance created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessInstance"
              example:
                key: 4503599627370501
                processDefinitionKey: 4503599627370498
                createdAt: "2025-08-22T14:30:25Z"
                state: "active"
                variables:
                  customerId: "customer-456"
                  amount: 1000
                  applicationDate: "2025-08-22"
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Not found (e.g. process definition was not found)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    get:
      summary: Get list of running process instances
      operationId: getProcessInstances
      tags:
        - process-instance
      parameters:
        - name: processDefinitionKey
          in: query
          schema:
            type: integer
            format: int64
          description: Key of the process definition
          example: 4503599627370498
        - name: parentProcessInstanceKey
          in: query
          schema:
            type: integer
            format: int64
          description: Key of the parent process instance
          example: 1603294627315478
        - name: businessKey
          in: query
          schema:
            type: string
          description: Business key of the process instance used mainly for correlating process instance to the business entity.
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 10
          description: Number of items per page
          example: 10
        - name: bpmnProcessId
          in: query
          schema:
            type: string
          description: Filter by BPMN process ID (returns instances across all versions)
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [ createdAt, key, state ]
          description: Sort field (applies globally across partitions)
        - $ref: "#/components/parameters/sortOrder"
        - name: createdFrom
          in: query
          schema:
            type: string
            format: date-time
          description: Filter - created after this date
        - name: createdTo
          in: query
          schema:
            type: string
            format: date-time
          description: Filter - created before this date
        - name: state
          in: query
          schema:
            type: string
            enum: [ active, completed, terminated, failed ]
          description: Filter by state
        - name: activityId
          in: query
          schema:
            type: string
          description: Filter by current activity element ID
        - name: includeChildProcesses
          in: query
          schema:
            type: boolean
      responses:
        200:
          description: List of running process instances
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessInstancePage"
              example:
                partitions:
                  - partition: 1
                    count: 24
                    items:
                      - key: 4503599627370501
                        processDefinitionKey: 4503599627370498
                        bpmnProcessId: "loan-application"
                        createdAt: "2025-08-22T14:30:25Z"
                        state: "active"
                        variables:
                          customerId: "customer-456"
                          amount: 1000
                          applicationDate: "2025-08-22"
                      - key: 4503599627370505
                        processDefinitionKey: 4503599627370498
                        bpmnProcessId: "loan-application"
                        createdAt: "2025-08-22T15:10:12Z"
                        state: "active"
                        variables:
                          customerId: "customer-789"
                          amount: 5000
                          applicationDate: "2025-08-22"
                  - partition: 2
                    count: 18
                    items:
                      - key: 9007199254740992
                        processDefinitionKey: 4503599627370498
                        bpmnProcessId: "loan-application"
                        createdAt: "2025-08-22T15:45:33Z"
                        state: "active"
                        variables:
                          customerId: "customer-101"
                          amount: 7500
                          applicationDate: "2025-08-22"
                page: 1
                size: 10
                count: 3
                totalCount: 42
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible nodes
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}:
    get:
      operationId: getProcessInstance
      tags:
        - process-instance
      summary: Get state of a process instance selected by processInstanceKey
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
      responses:
        200:
          description: State of a process instance
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessInstance"
              example:
                key: 4503599627370501
                processDefinitionKey: 4503599627370498
                createdAt: "2025-08-22T14:30:25Z"
                state: "active"
                variables:
                  customerId: "customer-456"
                  amount: 1000
                  applicationDate: "2025-08-22"
                  taskAssignee: "john.doe"
                  currentStatus: "Application review"

        404:
          description: Not Found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/variables:
    patch:
      operationId: updateProcessInstanceVariables
      summary: Update process instance variables
      tags:
        - process-instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - variables
              properties:
                variables:
                  type: object
            example:
              variables:
                orderAmount: 150.00
                approved: true
                reviewedBy: "john.doe"
                reviewComment: "Approved after verification"
      responses:
        204:
          description: Variables updated
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Not found (e.g process instance is not found)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        409:
          description: Conflict (e.g process instance is not in correct state for this operation)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/variables/{variableName}:
    delete:
      operationId: deleteProcessInstanceVariable
      summary: Delete a process instance variable
      tags:
        - process-instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
        - name: variableName
          in: path
          required: true
          schema:
            type: string
          example: "temporaryFlag"
      responses:
        204:
          description: Variable deleted
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Not found (e.g. process instance or variable not found)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        409:
          description: Conflict (e.g process instance is not in correct state for this operation)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/child-processes:
    get:
      summary: Get list of running child process instances
      operationId: getChildProcessInstances
      tags:
        - process-instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 10
          description: Number of items per page
          example: 10
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [ key, state ]
          description: Sort field (applies globally across partitions)
        - $ref: "#/components/parameters/sortOrder"
        - name: state
          in: query
          schema:
            type: string
            enum: [ active, completed, terminated, failed ]
          description: Filter by state
      responses:
        200:
          description: List of child process instances
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessInstancePage"
              example:
                partitions:
                  - partition: 1
                    items:
                      - key: "4503599627370501"
                        processDefinitionKey: "4503599627370498"
                        createdAt: "2025-08-22T14:30:25Z"
                        state: "active"
                        variables:
                          customerId: "customer-456"
                          amount: 1000
                          applicationDate: "2025-08-22"
                      - key: "4503599627370505"
                        processDefinitionKey: "4503599627370498"
                        createdAt: "2025-08-22T15:10:12Z"
                        state: "active"
                        variables:
                          customerId: "customer-789"
                          amount: 5000
                          applicationDate: "2025-08-22"
                  - partition: 2
                    items:
                      - key: "9007199254740992"
                        processDefinitionKey: "4503599627370498"
                        createdAt: "2025-08-22T15:45:33Z"
                        state: "active"
                        variables:
                          customerId: "customer-101"
                          amount: 7500
                          applicationDate: "2025-08-22"
                page: 1
                size: 10
                count: 3
                totalCount: 3
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible nodes
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/cancel:
    post:
      operationId: cancelProcessInstance
      summary: Cancels a process instance
      tags:
        - process-instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
      responses:
        204:
          description: Process instance cancelled
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Not found (e.g. process instance is not found)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        409:
          description: Conflict (e.g process instance is not in cancellable state)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/jobs:
    get:
      operationId: getProcessInstanceJobs
      tags:
        - process-instance
      summary: Get list of jobs for a process instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
          example: 10
      responses:
        200:
          description: List of jobs
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobPage"
              example:
                items:
                  - key: 4503599627370510
                    elementId: "Task_CheckApplication"
                    type: "user-task"
                    processInstanceKey: 4503599627370501
                    state: "active"
                    createdAt: "2025-08-22T14:30:26Z"
                    variables:
                      formKey: "loan-application-form"
                      assignee: "john.doe"
                  - key: 4503599627370511
                    elementId: "Task_CreditCheck"
                    type: "service-task"
                    processInstanceKey: 4503599627370501
                    state: "completed"
                    createdAt: "2025-08-22T14:32:15Z"
                    variables:
                      result: "approved"
                      score: 85
                page: 1
                size: 10
                count: 2
                totalCount: 2
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/history:
    get:
      operationId: getHistory
      tags:
        - process-instance
      summary: Get list of visited flow elements for a process instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
          example: 10
      responses:
        200:
          description: List of activities
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FlowElementHistoryPage"
              example:
                items:
                  - key: 4503599627370525
                    elementId: "StartEvent_1"
                    processInstanceKey: 4503599627370501
                    createdAt: "2025-08-22T14:30:26Z"
                  - key: 4503599627370526
                    elementId: "Flow_1"
                    processInstanceKey: 4503599627370501
                    createdAt: "2025-08-22T14:30:26Z"
                  - key: 4503599627370527
                    elementId: "Task_CheckApplication"
                    processInstanceKey: 4503599627370501
                    createdAt: "2025-08-22T14:30:27Z"
                page: 1
                size: 10
                count: 3
                totalCount: 3
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /process-instances/{processInstanceKey}/incidents:
    get:
      operationId: getIncidents
      tags:
        - process-instance
      summary: Get list of incidents for a process instance
      parameters:
        - name: processInstanceKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370501
        - name: state
          in: query
          schema:
            type: string
            enum: [ resolved, unresolved ]
          description: Filter by incident state (omit to get all incidents)
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
          example: 10
      responses:
        200:
          description: List of incidents
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/IncidentPage"
              example:
                items:
                  - key: 4503599627370530
                    elementInstanceKey: 4503599627370521
                    elementId: "Task_CheckApplication"
                    processInstanceKey: 4503599627370501
                    message: "Failed to assign task: User not found"
                    createdAt: "2025-08-22T14:35:10Z"
                    executionToken: 123456
                    bpmnProcessId: "loan-application"
                    state: "unresolved"
                  - key: 4503599627370531
                    elementInstanceKey: 4503599627370522
                    elementId: "Task_CreditCheck"
                    processInstanceKey: 4503599627370501
                    message: "External service unavailable"
                    createdAt: "2025-08-22T14:36:22Z"
                    resolvedAt: "2025-08-22T14:45:18Z"
                    executionToken: 123457
                    bpmnProcessId: "loan-application"
                    state: "resolved"
                page: 1
                size: 10
                count: 2
                totalCount: 2
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /jobs:
    get:
      operationId: getJobs
      tags:
        - job
      summary: Get list of jobs on partitions
      parameters:
        - name: processInstanceKey
          in: query
          schema:
            type: integer
            format: int64
          description: Filter by process instance
        - name: jobType
          in: query
          required: false
          schema:
            type: string
          description: Filter by job type
          example: "service-task"
        - name: assignee
          in: query
          schema:
            type: string
          description: Filter by assignee
        - name: state
          in: query
          required: false
          schema:
            $ref: "#/components/schemas/JobState"
          description: Filter by job state
          example: "active"
        - name: page
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            default: 1
          description: Page number (1-based indexing)
          example: 1
        - name: size
          in: query
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
            default: 10
          description: Number of items per page (max 100)
          example: 10
        - name: sortBy
          in: query
          schema:
            type: string
            enum: [ createdAt, key, type, state ]
          description: Sort field
        - name: sortOrder
          in: query
          schema:
            type: string
            enum: [ asc, desc ]
          description: Sort direction
      responses:
        200:
          description: List of jobs on partitions
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobPartitionPage"
              example:
                partitions:
                  - partition: 1
                    items:
                      - key: 4503599627370540
                        elementId: "Task_ReviewApplication"
                        type: "user-task"
                        processInstanceKey: 4503599627370501
                        state: "active"
                        createdAt: "2025-08-22T15:10:26Z"
                        assignee: "john.doe"
                        retries: 3
                        variables:
                          formKey: "loan-review-form"
                  - partition: 2
                    items:
                      - key: 9007199254740995
                        elementId: "Task_SendNotification"
                        type: "service-task"
                        processInstanceKey: 9007199254740992
                        state: "active"
                        createdAt: "2025-08-22T15:46:33Z"
                        retries: 3
                        variables:
                          notificationType: "email"
                          recipient: "customer@example.com"
                page: 1
                size: 10
                count: 2
                totalCount: 2
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /jobs/{jobKey}:
    get:
      operationId: getJob
      summary: Get job details
      tags:
        - job
      parameters:
        - name: jobKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370540
      responses:
        200:
          description: Job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"
              example:
                key: 4503599627370540
                elementId: "Task_ReviewApplication"
                type: "io.camunda.zeebe:userTask"
                processInstanceKey: 4503599627370501
                state: "active"
                createdAt: "2025-08-22T15:10:26Z"
                assignee: "john.doe"
                retries: 3
                variables:
                  formKey: "loan-review-form"
                  applicationId: "APP-12345"
                  customerName: "Alice Johnson"
        404:
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to collect data from responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /jobs/{jobKey}/assign:
    post:
      operationId: assignJob
      summary: Assign a job to a user
      tags:
        - job
      parameters:
        - name: jobKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370540
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - assignee
              properties:
                assignee:
                  type: string
            example:
              assignee: "john.doe"
      responses:
        204:
          description: Job assigned
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Job not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /jobs/{jobKey}/complete:
    post:
      operationId: completeJob
      tags:
        - job
      summary: Complete a job
      parameters:
        - name: jobKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370540
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                variables:
                  type: object
            example:
              variables:
                result: "success"
                transactionId: "tx-789-xyz"
                processedAt: "2025-08-22T15:15:30Z"
      responses:
        201:
          description: Job completed
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /messages:
    post:
      operationId: publishMessage
      tags:
        - message
      summary: Publish a message
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - correlationKey
                - messageName
              properties:
                correlationKey:
                  type: string
                messageName:
                  type: string
                variables:
                  type: object
            example:
              correlationKey: "011-235-813"
              messageName: "payment-received"
              variables:
                paymentId: "pay-123-abc"
                amount: 1000
                currency: "USD"
                receivedAt: "2025-08-22T16:25:10Z"
      responses:
        201:
          description: Message sent
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /incidents/{incidentKey}/resolve:
    post:
      operationId: resolveIncident
      tags:
        - incident
      summary: Resolve an incident
      parameters:
        - name: incidentKey
          in: path
          required: true
          schema:
            type: integer
            format: int64
          example: 4503599627370530
      responses:
        201:
          description: Incident resolved
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /modify/start-process-instance:
    post:
      operationId: StartProcessInstanceOnElements
      summary: Start a new process instance starting at chosen elements
      tags:
        - migration
        - process-instance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - processDefinitionKey
                - startingElementIds
              properties:
                processDefinitionKey:
                  type: integer
                  format: int64
                variables:
                  type: object
                startingElementIds:
                  type: array
                  description: Allows for a start at chosen element id
                  items:
                    type: string
            example:
              processDefinitionKey: 4503599627370498
              variables:
                customerId: "customer-456"
                amount: 1000
                applicationDate: "2025-08-22"
              startingElementIds: [ "flowNode-1", "flowNode-2" ]
      responses:
        201:
          description: Process instance created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProcessInstance"
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Not found (e.g. process definition with processDefinitionKey not found)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /modify/process-instance:
    post:
      operationId: ModifyProcessInstance
      summary: Modify process instance
      tags:
        - migration
        - process-instance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - processInstanceKey
              properties:
                processInstanceKey:
                  type: integer
                  format: int64
                variables:
                  type: object
                  description: Sets process instance variables.
                elementInstancesToStart:
                  type: array
                  items:
                    $ref: "#/components/schemas/StartElementInstanceData"
                  description: Starts execution token.
                elementInstancesToTerminate:
                  type: array
                  items:
                    $ref: "#/components/schemas/TerminateElementInstanceData"
                  description: Terminates execution token.
      responses:
        201:
          description: Process instance modified
          content:
            application/json:
              schema:
                type: object
                properties:
                  processInstance:
                    $ref: "#/components/schemas/ProcessInstance"
                  activeElementInstances:
                    type: array
                    items:
                      $ref: "#/components/schemas/ElementInstance"
        400:
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        404:
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        502:
          description: Failed to redirect request to responsible node
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /tests/{nodeId}/start-pprof-server:
    post:
      operationId: testStartPprofServer
      summary: start pprof server
      tags:
        - test
      parameters:
        - name: nodeId
          in: path
          required: true
          schema:
            type: string
            pattern: "^[a-zA-Z0-9-_]+$"
          description: ID of the node to start pprof server on
      responses:
        200:
          description: Pprof server started
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /tests/{nodeId}/stop-pprof-server:
    post:
      operationId: testStopPprofServer
      summary: stop pprof server
      tags:
        - test
      parameters:
        - name: nodeId
          in: path
          required: true
          schema:
            type: string
            pattern: "^[a-zA-Z0-9-_]+$"
          description: ID of the node to stop pprof server on
      responses:
        200:
          description: Pprof server stopped
        500:
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

components:
  schemas:
    DecisionInstancePartitionPage:
      type: object
      allOf:
        - type: object
          required:
            - partitions
          properties:
            partitions:
              type: array
              items:
                $ref: "#/components/schemas/PartitionDecisionInstances"
        - $ref: "#/components/schemas/PartitionedPageMetadata"
    PartitionDecisionInstances:
      type: object
      required:
        - partition
        - items
      properties:
        partition:
          type: integer
        count:
          type: integer
          description: Total decision instances in this partition
        items:
          type: array
          items:
            $ref: "#/components/schemas/DecisionInstanceSummary"
    DecisionInstanceSummary:
      type: object
      required:
        - key
        - dmnResourceDefinitionKey
        - evaluatedAt
      properties:
        key:
          type: integer
          format: int64
        dmnResourceDefinitionKey:
          type: integer
          format: int64
        processInstanceKey:
          type: integer
          format: int64
        flowElementInstanceKey:
          type: integer
          format: int64
          description: Key of the flow element instance that triggered this decision
        evaluatedAt:
          type: string
          format: date-time
    DecisionInstanceDetail:
      type: object
      required:
        - key
        - dmnResourceDefinitionKey
        - evaluatedAt
        - evaluatedDecisions
      properties:
        key:
          type: integer
          format: int64
        dmnResourceDefinitionKey:
          type: integer
          format: int64
        processInstanceKey:
          type: integer
          format: int64
        flowElementInstanceKey:
          type: integer
          format: int64
          description: Key of the flow element instance that triggered this decision
        evaluatedAt:
          type: string
          format: date-time
        evaluatedDecisions:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedDecision"
        decisionOutput:
          type: string
          format: json
          x-go-type: json.RawMessage
          description: Final output of the requested decision
    EvaluatedDecision:
      type: object
      properties:
        decisionId:
          type: string
        decisionName:
          type: string
        decisionType:
          type: string
          enum: [ DECISION_TABLE, LITERAL_EXPRESSION ]
        evaluationOrder:
          type: integer
          description: Order in which this decision was evaluated
        inputs:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedInput"
        outputs:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedOutput"
        matchedRules:
          type: array
          items:
            $ref: "#/components/schemas/MatchedRule"
          description: For DECISION_TABLE type only
    EvaluatedInput:
      type: object
      properties:
        inputId:
          type: string
        inputName:
          type: string
        inputExpression:
          type: string
        inputValue:
          description: The evaluated input value (any type)
    EvaluatedOutput:
      type: object
      properties:
        outputId:
          type: string
        outputName:
          type: string
        outputValue:
          description: The output value (any type)
    MatchedRule:
      type: object
      properties:
        ruleId:
          type: string
        ruleIndex:
          type: integer
        evaluatedOutputs:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedOutput"
    PartitionedPageMetadata:
      type: object
      required:
        - page
        - size
        - count
        - totalCount
      properties:
        page:
          type: integer
          description: Current page number (1-based indexing)
        size:
          type: integer
          description: Number of items per page
        count:
          type: integer
          description: Number of items returned in the current page
        totalCount:
          type: integer
          description: Total number of items available
    PageMetadata:
      type: object
      required:
        - page
        - size
        - count
        - totalCount
      properties:
        page:
          type: integer
          description: Current page number (1-based indexing)
        size:
          type: integer
          description: Number of items per page
        count:
          type: integer
          description: Number of items returned in the current page
        totalCount:
          type: integer
          description: Total number of items available
    PartitionProcessInstances:
      type: object
      required:
        - partition
        - items
      properties:
        partition:
          type: integer
        items:
          type: array
          items:
            $ref: "#/components/schemas/ProcessInstance"
    DmnResourceDefinitionsPage:
      type: object
      allOf:
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: "#/components/schemas/DmnResourceDefinitionSimple"
        - $ref: "#/components/schemas/PageMetadata"
    DmnResourceDefinitionSimple:
      type: object
      required:
        - key
        - version
        - dmnResourceDefinitionId
        - dmnDefinitionName
      properties:
        key:
          type: integer
          format: int64
        version:
          type: integer
        dmnResourceDefinitionId:
          type: string
        dmnDefinitionName:
          type: string
    DmnResourceDefinitionDetail:
      type: object
      required:
        - dmnData
      allOf:
        - $ref: "#/components/schemas/DmnResourceDefinitionSimple"
        - type: object
          properties:
            dmnData:
              type: string
    EvaluatedDRDResult:
      type: object
      required:
        - decisionInstanceKey
        - evaluatedDecisions
        - decisionOutput
      properties:
        decisionInstanceKey:
          type: integer
          format: int64
        evaluatedDecisions:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedDecisionResult"
        decisionOutput: { }
    EvaluatedDecisionResult:
      type: object
      required:
        - decisionId
        - decisionName
        - decisionType
        - decisionDefinitionVersion
        - dmnResourceDefinitionKey
        - dmnResourceDefinitionId
        - matchedRules
        - decisionOutput
        - evaluatedInputs
      properties:
        decisionId:
          type: string
        decisionName:
          type: string
        decisionType:
          type: string
        decisionDefinitionVersion:
          type: integer
        dmnResourceDefinitionKey:
          type: integer
          format: int64
        dmnResourceDefinitionId:
          type: string
        matchedRules:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedDecisionRule"
        decisionOutput:
          type: object
        evaluatedInputs:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedDecisionInput"
    EvaluatedDecisionRule:
      type: object
      required:
        - ruleId
        - ruleIndex
        - evaluatedOutputs
      properties:
        ruleId:
          type: string
        ruleIndex:
          type: integer
        evaluatedOutputs:
          type: array
          items:
            $ref: "#/components/schemas/EvaluatedDecisionOutput"
    EvaluatedDecisionInput:
      type: object
      required:
        - inputId
        - inputName
        - inputExpression
        - inputValue
      properties:
        inputId:
          type: string
        inputName:
          type: string
        inputExpression:
          type: string
        inputValue: { }
    EvaluatedDecisionOutput:
      type: object
      required:
        - outputId
        - outputName
        - outputValue
      properties:
        outputId:
          type: string
        outputName:
          type: string
        outputValue:
          type: object
    ProcessDefinitionsPage:
      type: object
      allOf:
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: "#/components/schemas/ProcessDefinitionSimple"
        - $ref: "#/components/schemas/PageMetadata"
    ProcessDefinitionSimple:
      type: object
      required:
        - key
        - version
        - bpmnProcessId
      properties:
        key:
          type: integer
          format: int64
        version:
          type: integer
        bpmnProcessId:
          type: string
        bpmnProcessName:
          type: string
          description: Process name from BPMN
    ProcessDefinitionDetail:
      type: object
      required:
        - bpmnData
      allOf:
        - $ref: "#/components/schemas/ProcessDefinitionSimple"
        - type: object
          properties:
            bpmnData:
              type: string
    ElementStatisticCounts:
      type: object
      description: Active and incident counts for a single BPMN element
      required:
        - activeCount
        - incidentCount
      properties:
        activeCount:
          type: integer
          description: Number of active element instances
        incidentCount:
          type: integer
          description: Number of incidents on this element
    ElementStatistic:
      type: object
      description: Map of elementId to active/incident counts
      additionalProperties:
        $ref: "#/components/schemas/ElementStatisticCounts"
    PartitionElementStatistics:
      type: object
      required:
        - partition
        - items
      properties:
        partition:
          type: integer
        items:
          $ref: "#/components/schemas/ElementStatistic"
    ElementStatisticsPartitions:
      type: object
      required:
        - partitions
      properties:
        partitions:
          type: array
          items:
            $ref: "#/components/schemas/PartitionElementStatistics"
    ProcessDefinitionStatisticsPage:
      type: object
      required:
        - partitions
        - page
        - size
        - count
        - totalCount
      properties:
        partitions:
          type: array
          items:
            $ref: "#/components/schemas/PartitionProcessDefinitionStatistics"
        page:
          type: integer
        size:
          type: integer
        count:
          type: integer
          description: Number of items in current page
        totalCount:
          type: integer
          description: Total number of items across all pages
    PartitionProcessDefinitionStatistics:
      type: object
      required:
        - partition
        - items
      properties:
        partition:
          type: integer
        items:
          type: array
          items:
            $ref: "#/components/schemas/ProcessDefinitionStatistics"
    ProcessDefinitionStatistics:
      type: object
      required:
        - key
        - version
        - bpmnProcessId
        - instanceCounts
      properties:
        key:
          type: integer
          format: int64
        version:
          type: integer
        bpmnProcessId:
          type: string
        name:
          type: string
          description: Process name from BPMN
        instanceCounts:
          $ref: "#/components/schemas/InstanceCounts"
    InstanceCounts:
      type: object
      required:
        - total
        - active
        - completed
        - terminated
        - failed
      properties:
        total:
          type: integer
          description: Total number of process instances
        active:
          type: integer
          description: Number of active instances
        completed:
          type: integer
          description: Number of completed instances
        terminated:
          type: integer
          description: Number of terminated instances
        failed:
          type: integer
          description: Number of failed instances
    ProcessInstancePage:
      type: object
      allOf:
        - type: object
          required:
            - partitions
          properties:
            partitions:
              type: array
              items:
                $ref: "#/components/schemas/PartitionProcessInstances"
        - $ref: "#/components/schemas/PartitionedPageMetadata"
    ProcessInstance:
      type: object
      required:
        - key
        - processDefinitionKey
        - createdAt
        - state
        - variables
        - activeElementInstances
        - processType
      properties:
        key:
          type: integer
          format: int64
        processDefinitionKey:
          type: integer
          format: int64
        bpmnProcessId:
          type: string
        businessKey:
          type: string
        createdAt:
          type: string
          format: date-time
        state:
          type: string
          enum:
            - active
            - completed
            - terminated
            - failed
        parentProcessInstanceKey:
          type: integer
          format: int64
        processType:
          type: string
          enum:
            - default
            - multiInstance
            - subprocess
            - callActivity
        variables:
          type: object
        activeElementInstances:
          type: array
          items:
            $ref: "#/components/schemas/ElementInstance"
    JobPage:
      type: object
      allOf:
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: "#/components/schemas/Job"
        - $ref: "#/components/schemas/PageMetadata"
    JobPartitionPage:
      type: object
      allOf:
        - type: object
          required:
            - partitions
          properties:
            partitions:
              type: array
              items:
                $ref: "#/components/schemas/PartitionJobs"
        - $ref: "#/components/schemas/PartitionedPageMetadata"
    PartitionJobs:
      type: object
      required:
        - partition
        - items
      properties:
        partition:
          type: integer
        items:
          type: array
          items:
            $ref: "#/components/schemas/Job"
    Job:
      type: object
      required:
        - key
        - elementId
        - type
        - processInstanceKey
        - state
        - createdAt
        - variables
      properties:
        key:
          type: integer
          format: int64
        elementId:
          type: string
        type:
          type: string
        processInstanceKey:
          type: integer
          format: int64
        state:
          $ref: "#/components/schemas/JobState"
        createdAt:
          type: string
          format: date-time
        variables:
          type: object
        assignee:
          type: string
          description: Assignee (user assigned to this job)
        retries:
          type: integer
          description: Remaining retries
    JobState:
      type: string
      enum:
        - active
        - completed
        - terminated
        - failed
    ElementInstance:
      type: object
      required:
        - elementInstanceKey
        - createdAt
        - state
        - elementId
      properties:
        elementInstanceKey:
          type: integer
          format: int64
        createdAt:
          type: string
          format: date-time
        state:
          type: string
        elementId:
          type: string
    FlowElementHistoryPage:
      type: object
      allOf:
        - type: object
          properties:
            items:
              type: array
              items:
                $ref: "#/components/schemas/FlowElementHistory"
        - $ref: "#/components/schemas/PageMetadata"
    TerminateElementInstanceData:
      type: object
      required:
        - elementInstanceKey
      properties:
        elementInstanceKey:
          type: integer
          format: int64
      example:
        elementId: "flow-node-1"
    StartElementInstanceData:
      type: object
      required:
        - elementId
      properties:
        elementId:
          type: string
          description: Element instance is created at this element.
      example:
        elementId: "flow-node-1"
    FlowElementHistory:
      type: object
      required:
        - key
        - processInstanceKey
        - createdAt
        - elementId
      properties:
        key:
          type: integer
          format: int64
        processInstanceKey:
          type: integer
          format: int64
        createdAt:
          type: string
          format: date-time
        elementId:
          type: string
    IncidentPage:
      type: object
      allOf:
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: "#/components/schemas/Incident"
        - $ref: "#/components/schemas/PageMetadata"
    Incident:
      type: object
      required:
        - key
        - elementInstanceKey
        - elementId
        - processInstanceKey
        - message
        - createdAt
        - executionToken
      properties:
        key:
          type: integer
          format: int64
        elementInstanceKey:
          type: integer
          format: int64
        elementId:
          type: string
        processInstanceKey:
          type: integer
          format: int64
        message:
          type: string
        createdAt:
          type: string
          format: date-time
        resolvedAt:
          type: string
          format: date-time
        executionToken:
          type: integer
          format: int64
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
        message:
          type: string
      example:
        code: "NOT_FOUND"
        message: "Process instance with key 4503599627370501 not found"
  parameters:
    sortOrder:
      name: sortOrder
      in: query
      schema:
        type: string
        enum: [ asc, desc ]
      description: Sort direction
