---
openapi: "3.0.0"
info:
  description: |
    Synchronik API v1 defintion
  version: "1.0.0"
  title: Synchronik APIs
  contact:
    email: "rtyler+synchronik@brokenco.de"
  license:
    name: "AGPL v3.0"
    url: "https://www.gnu.org/licenses/agpl-3.0.en.html"
servers:
  - url: 'http://localhost:8000'
    description: Local dev server
  - url: 'http://localhost:9000'
    description: Local dev agent

tags:
- name: 'agent'
  description: 'Agent APIs'
- name: 'server'
  description: 'Server APIs'

paths:
  '/api/v1/projects/{name}':
    post:
      tags:
        - 'server'
      summary: 'Trigger execution for this project'
      description:
      parameters:
        - in: path
          name: name
          required: true
          example: 'synchronik'
          schema:
            type: string
      responses:
        404:
          summary: 'No project configured by that name'
        200:
          summary: 'Execution has been triggered'


  '/api/v1/capabilities':
    get:
      tags:
        - 'agent'
      summary: "Retrieve a list of capabilities of this agent"
      description:
      responses:
        200:
          description: Getting capabilities
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CapsResponse'
  '/api/v1/execute':
    put:
      tags:
        - 'agent'
      summary: "Execute a series of commands on this agent"
      description:
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommandRequest'
            example:
              commands:
                - script: 'echo "Hi"'
      responses:
        201:
          description: 'Successfully accepted the commands for execution'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommandResponse'
        409:
          description: 'Returned when the agent is busy with another series of commands'

components:
  schemas:
    CapsResponse:
      type: object
      properties:
        caps:
          type: array
          items:
            $ref: '#/components/schemas/Capability'
    Capability:
      type: object
      properties:
        name:
          type: string
        path:
          type: string
        data:
          type: object
    Command:
      type: object
      properties:
        script:
          type: string
          description: "A script that can be exec()'d on the agent"
    CommandRequest:
      type: object
      properties:
        commands:
          type: array
          items:
            $ref: '#/components/schemas/Command'
    CommandResponse:
      type: object
      properties:
        uuid:
          type: string
          format: uuid
        stream:
          description: 'URL to streaming WebSockets logs'
          type: string
          format: url
        task:
          description: 'URL to the task metadata'
          type: string
          format: url
        log:
          description: 'URL to the raw log of the task run'
          type: string
          format: url
