openapi: "3.0.3"

info:
  version: 1.197.1
  title: Windmill API

  contact:
    name: Windmill Team
    email: contact@windmill.dev
    url: https://windmill.dev

  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html

  x-logo:
    url: https://windmill.dev/img/windmill.svg
externalDocs:
  description: documentation portal
  url: https://windmill.dev

servers:
  - url: /api

security:
  - bearerAuth: []
  - cookieAuth: []

paths:
  /version:
    get:
      summary: get backend version
      operationId: backendVersion
      tags:
        - settings
      responses:
        "200":
          description: git version of backend
          content:
            text/plain:
              schema:
                type: string

  /uptodate:
    get:
      summary: is backend up to date
      operationId: backendUptodate
      tags:
        - settings
      responses:
        "200":
          description: is backend up to date
          content:
            text/plain:
              schema:
                type: string

  /ee_license:
    get:
      summary: get license id
      operationId: getLicenseId
      tags:
        - settings
      responses:
        "200":
          description: get license id (empty if not ee)
          content:
            text/plain:
              schema:
                type: string

  /openapi.yaml:
    get:
      summary: get openapi yaml spec
      operationId: getOpenApiYaml
      tags:
        - settings
      responses:
        "200":
          description: openapi yaml file content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/audit/get/{id}:
    get:
      summary: get audit log (requires admin privilege)
      operationId: getAuditLog
      tags:
        - audit
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: an audit log
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuditLog"

  /w/{workspace}/audit/list:
    get:
      summary: list audit logs (requires admin privilege)
      operationId: listAuditLogs
      tags:
        - audit
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/Before"
        - $ref: "#/components/parameters/After"
        - $ref: "#/components/parameters/Username"
        - $ref: "#/components/parameters/Operation"
        - $ref: "#/components/parameters/ResourceName"
        - $ref: "#/components/parameters/ActionKind"

      responses:
        "200":
          description: a list of audit logs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AuditLog"

  /auth/login:
    post:
      security: []
      summary: login with password
      operationId: login
      tags:
        - user
      requestBody:
        description: credentials
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Login"

      responses:
        "200":
          description: >
            Successfully authenticated. The session ID is returned in a cookie
            named `token` and as plaintext response. Preferred method of
            authorization is through the bearer token. The cookie is only for
            browser convenience.

          headers:
            Set-Cookie:
              schema:
                type: string
                example: token=abcde12345; Path=/; HttpOnly
          content:
            text/plain:
              schema:
                type: string

  /auth/logout:
    post:
      security: []
      summary: logout
      operationId: logout
      tags:
        - user

      responses:
        "200":
          description: clear cookies and clear token (if applicable)
          headers:
            Set-Cookie:
              schema:
                type: string
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/add:
    post:
      summary: create user (require admin privilege)
      operationId: createUser
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new user
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewUser"
      responses:
        "201":
          description: user created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/update/{username}:
    post:
      summary: update user (require admin privilege)
      operationId: updateUser
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: new user
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditWorkspaceUser"
      responses:
        "200":
          description: edited user
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/is_owner/{path}:
    get:
      summary: is owner of path
      operationId: isOwnerOfPath
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: is owner
          content:
            application/json:
              schema:
                type: boolean

  /users/setpassword:
    post:
      summary: set password
      operationId: setPassword
      tags:
        - user
      requestBody:
        description: set password
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                password:
                  type: string
              required:
                - password
      responses:
        "200":
          description: password set
          content:
            text/plain:
              schema:
                type: string

  /users/create:
    post:
      summary: create user
      operationId: createUserGlobally
      tags:
        - user
      requestBody:
        description: user info
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                password:
                  type: string
                super_admin:
                  type: boolean
                name:
                  type: string
                company:
                  type: string
              required:
                - email
                - password
                - super_admin
      responses:
        "201":
          description: user created
          content:
            text/plain:
              schema:
                type: string

  /users/update/{email}:
    post:
      summary: global update user (require super admin)
      operationId: globalUserUpdate
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: new user info
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_super_admin:
                  type: boolean
      responses:
        "200":
          description: user updated
          content:
            text/plain:
              schema:
                type: string

  /users/delete/{email}:
    delete:
      summary: global delete user (require super admin)
      operationId: globalUserDelete
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/delete/{username}:
    delete:
      summary: delete user (require admin privilege)
      operationId: deleteUser
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: delete user
          content:
            text/plain:
              schema:
                type: string

  /workspaces/list:
    get:
      summary: list all workspaces visible to me
      operationId: listWorkspaces
      tags:
        - workspace
      responses:
        "200":
          description: all workspaces
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Workspace"

  /workspaces/allowed_domain_auto_invite:
    get:
      summary: is domain allowed for auto invi
      operationId: isDomainAllowed
      tags:
        - workspace
      responses:
        "200":
          description: domain allowed or not
          content:
            application/json:
              schema:
                type: boolean

  /workspaces/users:
    get:
      summary: list all workspaces visible to me with user info
      operationId: listUserWorkspaces
      tags:
        - workspace
      responses:
        "200":
          description: workspace with associated username
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserWorkspaceList"

  /workspaces/list_as_superadmin:
    get:
      summary: list all workspaces as super admin (require to be super admin)
      operationId: listWorkspacesAsSuperAdmin
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: workspaces
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Workspace"

  /workspaces/create:
    post:
      summary: create workspace
      operationId: createWorkspace
      tags:
        - workspace
      requestBody:
        description: new token
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateWorkspace"
      responses:
        "201":
          description: token created
          content:
            text/plain:
              schema:
                type: string

  /workspaces/exists:
    post:
      summary: exists workspace
      operationId: existsWorkspace
      tags:
        - workspace
      requestBody:
        description: id of workspace
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
              required:
                - id
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: boolean

  /workspaces/exists_username:
    post:
      summary: exists username
      operationId: existsUsername
      tags:
        - workspace
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                username:
                  type: string
              required:
                - id
                - username
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: boolean

  /settings/global/{key}:
    get:
      summary: get global settings
      operationId: getGlobal
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/Key"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

    post:
      summary: post global settings
      operationId: setGlobal
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/Key"
      requestBody:
        description: value set
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                value: {}

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/local:
    get:
      summary: get local settings
      operationId: getLocal
      tags:
        - setting
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /settings/test_smtp:
    post:
      summary: test smtp
      operationId: testSmtp
      tags:
        - setting
      requestBody:
        description: test smtp payload
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                to:
                  type: string
                smtp:
                  type: object
                  properties:
                    host:
                      type: string
                    username:
                      type: string
                    password:
                      type: string
                    port:
                      type: integer
                    from:
                      type: string
                    tls_implicit:
                      type: boolean
                  required:
                    - host
                    - username
                    - password
                    - port
                    - from
                    - tls_implicit
              required:
                - to
                - smtp
      responses:
        "200":
          description: status
          content:
            text/plain::
              schema:
                type: string

  /settings/test_license_key:
    post:
      summary: test license key
      operationId: testLicenseKey
      tags:
        - setting
      requestBody:
        description: test license key
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                license_key:
                  type: string
              required:
                - license_key
      responses:
        "200":
          description: status
          content:
            text/plain::
              schema:
                type: string

  /users/email:
    get:
      summary: get current user email (if logged in)
      operationId: getCurrentEmail
      tags:
        - user
      responses:
        "200":
          description: user email
          content:
            text/plain:
              schema:
                type: string

  /users/refresh_token:
    get:
      summary: refresh the current token
      operationId: refreshUserToken
      tags:
        - user
      responses:
        "200":
          description: free usage
          content:
            text/plain:
              schema:
                type: string

  /users/tutorial_progress:
    get:
      summary: get tutorial progress
      operationId: getTutorialProgress
      tags:
        - user
      responses:
        "200":
          description: tutorial progress
          content:
            application/json:
              schema:
                type: object
                properties:
                  progress:
                    type: integer
    post:
      summary: update tutorial progress
      operationId: updateTutorialProgress
      tags:
        - user
      requestBody:
        description: progress update
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                progress:
                  type: integer
      responses:
        "200":
          description: tutorial progress
          content:
            text/plain:
              schema:
                type: string

  /users/usage:
    get:
      summary: get current usage outside of premium workspaces
      operationId: getUsage
      tags:
        - user
      responses:
        "200":
          description: free usage
          content:
            text/plain:
              schema:
                type: number

  /users/all_runnables:
    get:
      summary: get all runnables in every workspace
      operationId: getRunnable
      tags:
        - user
      responses:
        "200":
          description: free all runnables
          content:
            application/json:
              schema:
                type: object
                properties:
                  workspace:
                    type: string
                  endpoint_async:
                    type: string
                  endpoint_sync:
                    type: string
                  endpoint_openai_sync:
                    type: string
                  summary:
                    type: string
                  description:
                    type: string
                  kind:
                    type: string
                required:
                  - workspace
                  - endpoint_async
                  - endpoint_sync
                  - endpoint_openai_sync
                  - summary
                  - kind

  /users/whoami:
    get:
      summary: get current global whoami (if logged in)
      operationId: globalWhoami
      tags:
        - user
      responses:
        "200":
          description: user email
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GlobalUserInfo"

  /users/list_invites:
    get:
      summary: list all workspace invites
      operationId: listWorkspaceInvites
      tags:
        - user
      responses:
        "200":
          description: list all workspace invites
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkspaceInvite"

  /w/{workspace}/users/whoami:
    get:
      summary: whoami
      operationId: whoami
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"

  /w/{workspace}/users/leave_workspace:
    post:
      summary: leave workspace
      operationId: leaveWorkspace
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /users/accept_invite:
    post:
      summary: accept invite to workspace
      operationId: acceptInvite
      tags:
        - user
      requestBody:
        description: accept invite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workspace_id:
                  type: string
                username:
                  type: string
              required:
                - workspace_id
                - username
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /users/decline_invite:
    post:
      summary: decline invite to workspace
      operationId: declineInvite
      tags:
        - user
      requestBody:
        description: decline invite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workspace_id:
                  type: string
              required:
                - workspace_id
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/invite_user:
    post:
      summary: invite user to workspace
      operationId: inviteUser
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                is_admin:
                  type: boolean
                operator:
                  type: boolean
              required:
                - email
                - is_admin
                - operator
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/add_user:
    post:
      summary: add user to workspace
      operationId: addUser
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                is_admin:
                  type: boolean
                username:
                  type: string
                operator:
                  type: boolean
              required:
                - email
                - is_admin
                - operator
                - username
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/delete_invite:
    post:
      summary: delete user invite
      operationId: delete invite
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                is_admin:
                  type: boolean
                operator:
                  type: boolean
              required:
                - email
                - is_admin
                - operator
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/archive:
    post:
      summary: archive workspace
      operationId: archiveWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /workspaces/unarchive/{workspace}:
    post:
      summary: unarchive workspace
      operationId: unarchiveWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /workspaces/delete/{workspace}:
    delete:
      summary: delete workspace (require super admin)
      operationId: deleteWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/whois/{username}:
    get:
      summary: whois
      operationId: whois
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"

  /users/exists/{email}:
    get:
      summary: exists email
      operationId: existsEmail
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: boolean

  /users/list_as_super_admin:
    get:
      summary: list all users as super admin (require to be super amdin)
      operationId: listUsersAsSuperAdmin
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/GlobalUserInfo"

  /w/{workspace}/workspaces/list_pending_invites:
    get:
      summary: list pending invites for a workspace
      operationId: listPendingInvites
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkspaceInvite"

  /w/{workspace}/workspaces/get_settings:
    get:
      summary: get settings
      operationId: getSettings
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  workspace_id:
                    type: string
                  slack_name:
                    type: string
                  slack_team_id:
                    type: string
                  slack_command_script:
                    type: string
                  auto_invite_domain:
                    type: string
                  auto_invite_operator:
                    type: boolean
                  plan:
                    type: string
                  customer_id:
                    type: string
                  webhook:
                    type: string
                  deploy_to:
                    type: string
                  openai_resource_path:
                    type: string
                  code_completion_enabled:
                    type: boolean
                  error_handler:
                    type: string
                  error_handler_extra_args:
                    $ref: "#/components/schemas/ScriptArgs"
                required:
                  - code_completion_enabled

  /w/{workspace}/workspaces/get_deploy_to:
    get:
      summary: get deploy to
      operationId: getDeployTo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  deploy_to:
                    type: string

  /w/{workspace}/workspaces/premium_info:
    get:
      summary: get premium info
      operationId: getPremiumInfo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  premium:
                    type: boolean
                  usage:
                    type: number
                required:
                  - premium

  /w/{workspace}/workspaces/edit_slack_command:
    post:
      summary: edit slack command
      operationId: editSlackCommand
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                slack_command_script:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/run_slack_message_test_job:
    post:
      summary: run a job that sends a message to Slack
      operationId: runSlackMessageTestJob
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: path to hub script to run and its corresponding args
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                hub_script_path:
                  type: string
                channel:
                  type: string
                test_msg:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/json:
              schema:
                type: object
                properties:
                  job_uuid:
                    type: string

  /w/{workspace}/workspaces/edit_deploy_to:
    post:
      summary: edit deploy to
      operationId: editDeployTo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deploy_to:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_auto_invite:
    post:
      summary: edit auto invite
      operationId: editAutoInvite
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                operator:
                  type: boolean

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_webhook:
    post:
      summary: edit webhook
      operationId: editWebhook
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceWebhook
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                webhook:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_copilot_config:
    post:
      summary: edit copilot config
      operationId: editCopilotConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceCopilotConfig
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - code_completion_enabled
              properties:
                openai_resource_path:
                  type: string
                code_completion_enabled:
                  type: boolean
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/get_copilot_info:
    get:
      summary: get copilot info
      operationId: getCopilotInfo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: object
                properties:
                  exists_openai_resource_path:
                    type: boolean
                  code_completion_enabled:
                    type: boolean
                required:
                  - exists_openai_resource_path
                  - code_completion_enabled

  /w/{workspace}/workspaces/edit_error_handler:
    post:
      summary: edit error handler
      operationId: editErrorHandler
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceErrorHandler
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                error_handler:
                  type: string
                error_handler_extra_args:
                  $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/list:
    get:
      summary: list users
      operationId: listUsers
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/User"

  /w/{workspace}/users/list_usernames:
    get:
      summary: list usernames
      operationId: listUsernames
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /users/tokens/create:
    post:
      summary: create token
      operationId: createToken
      tags:
        - user
      requestBody:
        description: new token
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewToken"
      responses:
        "201":
          description: token created
          content:
            text/plain:
              schema:
                type: string

  /users/tokens/impersonate:
    post:
      summary: create token to impersonate a user (require superadmin)
      operationId: createTokenImpersonate
      tags:
        - user
      requestBody:
        description: new token
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewTokenImpersonate"
      responses:
        "201":
          description: token created
          content:
            text/plain:
              schema:
                type: string

  /users/tokens/delete/{token_prefix}:
    delete:
      summary: delete token
      operationId: deleteToken
      tags:
        - user
      parameters:
        - name: token_prefix
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: delete token
          content:
            text/plain:
              schema:
                type: string

  /users/tokens/list:
    get:
      summary: list token
      operationId: listTokens
      tags:
        - user
      responses:
        "200":
          description: truncated token
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TruncatedToken"

  /w/{workspace}/variables/create:
    post:
      summary: create variable
      operationId: createVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: already_encrypted
          in: query
          schema:
            type: boolean
      requestBody:
        description: new variable
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateVariable"
      responses:
        "201":
          description: variable created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/encrypt:
    post:
      summary: encrypt value
      operationId: encryptValue
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new variable
        required: true
        content:
          application/json:
            schema:
              type: string
      responses:
        "200":
          description: encrypted value
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/delete/{path}:
    delete:
      summary: delete variable
      operationId: deleteVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: variable deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/update/{path}:
    post:
      summary: update variable
      operationId: updateVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: already_encrypted
          in: query
          schema:
            type: boolean
      requestBody:
        description: updated variable
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditVariable"
      responses:
        "200":
          description: variable updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/get/{path}:
    get:
      summary: get variable
      operationId: getVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: decrypt_secret
          description: |
            ask to decrypt secret if this variable is secret
            (if not secret no effect, default: true)
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: variable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ListableVariable"

  /w/{workspace}/variables/get_value/{path}:
    get:
      summary: get variable value
      operationId: getVariableValue
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: variable
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/variables/exists/{path}:
    get:
      summary: does variable exists at path
      operationId: existsVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: variable
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/variables/list:
    get:
      summary: list variables
      operationId: listVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: variable list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableVariable"

  /w/{workspace}/variables/list_contextual:
    get:
      summary: list contextual variables
      operationId: listContextualVariables
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: contextual variable list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ContextualVariable"

  /oauth/login_callback/{client_name}:
    post:
      security: []
      summary: login with oauth authorization flow
      operationId: loginWithOauth
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/ClientName"
      requestBody:
        description: Partially filled script
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string

      responses:
        "200":
          description: >
            Successfully authenticated. The session ID is returned in a cookie
            named `token` and as plaintext response. Preferred method of
            authorization is through the bearer token. The cookie is only for
            browser convenience.

          headers:
            Set-Cookie:
              schema:
                type: string
                example: token=abcde12345; Path=/; HttpOnly
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/connect_slack_callback:
    post:
      summary: connect slack callback
      operationId: connectSlackCallback
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string
              required:
                - code
                - state
      responses:
        "200":
          description: slack token
          content:
            text/plain:
              schema:
                type: string

  /oauth/connect_callback/{client_name}:
    post:
      summary: connect callback
      operationId: connectCallback
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/ClientName"
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string
              required:
                - code
                - state
      responses:
        "200":
          description: oauth token
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TokenResponse"

  /w/{workspace}/oauth/create_account:
    post:
      summary: create OAuth account
      operationId: createAccount
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                refresh_token:
                  type: string
                expires_in:
                  type: integer
                owner:
                  type: string
                client:
                  type: string
              required:
                - expires_in
                - owner
                - client
      responses:
        "200":
          description: account set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/refresh_token/{id}:
    post:
      summary: refresh token
      operationId: refreshToken
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/AccountId"
      requestBody:
        description: variable path
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
              required:
                - path
      responses:
        "200":
          description: token refreshed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/disconnect/{id}:
    post:
      summary: disconnect account
      operationId: disconnectAccount
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/AccountId"
      responses:
        "200":
          description: disconnected client
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/disconnect_slack:
    post:
      summary: disconnect slack
      operationId: disconnectSlack
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: disconnected slack
          content:
            text/plain:
              schema:
                type: string

  /oauth/list_logins:
    get:
      summary: list oauth logins
      operationId: listOAuthLogins
      tags:
        - oauth
      responses:
        "200":
          description: list of oauth and saml login clients
          content:
            application/json:
              schema:
                type: object
                properties:
                  oauth:
                    type: array
                    items:
                      type: string
                  saml:
                    type: string
                required:
                  - oauth

  /oauth/list_connects:
    get:
      summary: list oauth connects
      operationId: listOAuthConnects
      tags:
        - oauth
      responses:
        "200":
          description: list of oauth connects clients
          content:
            application/json:
              schema:
                additionalProperties:
                  type: object
                  properties:
                    extra_params:
                      additionalProperties:
                        type: string
                    scopes:
                      type: array
                      items:
                        type: string

  /w/{workspace}/resources/create:
    post:
      summary: create resource
      operationId: createResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: update_if_exists
          in: query
          schema:
            type: boolean
      requestBody:
        description: new resource
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateResource"
      responses:
        "201":
          description: resource created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/delete/{path}:
    delete:
      summary: delete resource
      operationId: deleteResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/update/{path}:
    post:
      summary: update resource
      operationId: updateResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated resource
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditResource"
      responses:
        "200":
          description: resource updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/update_value/{path}:
    post:
      summary: update resource value
      operationId: updateResourceValue
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated resource
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                value: {}
      responses:
        "200":
          description: resource value updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/get/{path}:
    get:
      summary: get resource
      operationId: getResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Resource"

  /w/{workspace}/resources/get_value_interpolated/{path}:
    get:
      summary: get resource interpolated (variables and resources are fully unrolled)
      operationId: getResourceValueInterpolated
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: job_id
          description: job id
          in: query
          schema:
            type: string
            format: uuid
      responses:
        "200":
          description: resource value
          content:
            application/json:
              schema: {}

  /w/{workspace}/resources/get_value/{path}:
    get:
      summary: get resource value
      operationId: getResourceValue
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource value
          content:
            application/json:
              schema: {}

  /w/{workspace}/resources/exists/{path}:
    get:
      summary: does resource exists
      operationId: existsResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: does resource exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/resources/list:
    get:
      summary: list resources
      operationId: listResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: resource_type
          description: resource_types to list from, separated by ',',
          in: query
          schema:
            type: string
        - name: resource_type_exclude
          description: resource_types to not list from, separated by ',',
          in: query
          schema:
            type: string
      responses:
        "200":
          description: resource list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableResource"

  /w/{workspace}/resources/list_search:
    get:
      summary: list resources for search
      operationId: listSearchResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: resource list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                  required:
                    - path
                    - value

  /w/{workspace}/resources/list_names/{name}:
    get:
      summary: list resource names
      operationId: listResourceNames
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: resource list names
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    path:
                      type: string
                  required:
                    - name
                    - path

  /w/{workspace}/resources/type/create:
    post:
      summary: create resource_type
      operationId: createResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new resource_type
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ResourceType"
      responses:
        "201":
          description: resource_type created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/type/delete/{path}:
    delete:
      summary: delete resource_type
      operationId: deleteResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource_type deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/type/update/{path}:
    post:
      summary: update resource_type
      operationId: updateResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated resource_type
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditResourceType"
      responses:
        "200":
          description: resource_type updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/type/get/{path}:
    get:
      summary: get resource_type
      operationId: getResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource_type deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResourceType"

  /w/{workspace}/resources/type/exists/{path}:
    get:
      summary: does resource_type exists
      operationId: existsResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: does resource_type exist
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/resources/type/list:
    get:
      summary: list resource_types
      operationId: listResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: resource_type list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ResourceType"

  /w/{workspace}/resources/type/listnames:
    get:
      summary: list resource_types names
      operationId: listResourceTypeNames
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: resource_type list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/embeddings/query_resource_types:
    get:
      summary: query resource types by similarity
      operationId: queryResourceTypes
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: text
          description: query text
          in: query
          required: true
          schema:
            type: string
        - name: limit
          description: query limit
          in: query
          required: false
          schema:
            type: number
      responses:
        "200":
          description: resource type details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    score:
                      type: number
                    schema: {}
                  required:
                    - name
                    - score

  /integrations/hub/list:
    get:
      summary: list hub integrations
      operationId: listHubIntegrations
      tags:
        - integration
      parameters:
        - name: kind
          description: query integrations kind
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: integrations details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                  required:
                    - name

  /flows/hub/list:
    get:
      summary: list all hub flows
      operationId: listHubFlows
      tags:
        - flow
      responses:
        "200":
          description: hub flows list
          content:
            application/json:
              schema:
                type: object
                properties:
                  flows:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                        flow_id:
                          type: number
                        summary:
                          type: string
                        apps:
                          type: array
                          items:
                            type: string
                        approved:
                          type: boolean
                        votes:
                          type: number

                      required:
                        - id
                        - flow_id
                        - summary
                        - apps
                        - approved
                        - votes

  /flows/hub/get/{id}:
    get:
      summary: get hub flow by id
      operationId: getHubFlowById
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: flow
          content:
            application/json:
              schema:
                type: object
                properties:
                  flow:
                    $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"

  /apps/hub/list:
    get:
      summary: list all hub apps
      operationId: listHubApps
      tags:
        - app
      responses:
        "200":
          description: hub apps list
          content:
            application/json:
              schema:
                type: object
                properties:
                  apps:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                        app_id:
                          type: number
                        summary:
                          type: string
                        apps:
                          type: array
                          items:
                            type: string
                        approved:
                          type: boolean
                        votes:
                          type: number
                      required:
                        - id
                        - app_id
                        - summary
                        - apps
                        - approved
                        - votes

  /apps/hub/get/{id}:
    get:
      summary: get hub app by id
      operationId: getHubAppById
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: app
          content:
            application/json:
              schema:
                type: object
                properties:
                  app:
                    type: object
                    properties:
                      summary:
                        type: string
                      value: {}
                    required:
                      - summary
                      - value
                required:
                  - app

  /scripts/hub/get/{path}:
    get:
      summary: get hub script content by path
      operationId: getHubScriptContentByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            text/plain:
              schema:
                type: string

  /scripts/hub/get_full/{path}:
    get:
      summary: get full hub script by path
      operationId: getHubScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: string
                  lockfile:
                    type: string
                  schema: {}
                  language:
                    type: string
                  summary:
                    type: string
                required:
                  - content
                  - language

  /scripts/hub/top:
    get:
      summary: get top hub scripts
      operationId: getTopHubScripts
      tags:
        - script
      parameters:
        - name: limit
          description: query limit
          in: query
          required: false
          schema:
            type: number
        - name: app
          description: query scripts app
          in: query
          required: false
          schema:
            type: string
        - name: kind
          description: query scripts kind
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: hub scripts list
          content:
            application/json:
              schema:
                type: object
                properties:
                  asks:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                        ask_id:
                          type: number
                        summary:
                          type: string
                        app:
                          type: string
                        version_id:
                          type: number
                        kind:
                          $ref: "#/components/schemas/HubScriptKind"
                        votes:
                          type: number
                        views:
                          type: number
                      required:
                        - id
                        - ask_id
                        - summary
                        - app
                        - version_id
                        - kind
                        - views
                        - votes

  /embeddings/query_hub_scripts:
    get:
      summary: query hub scripts by similarity
      operationId: queryHubScripts
      tags:
        - script
      parameters:
        - name: text
          description: query text
          in: query
          required: true
          schema:
            type: string
        - name: kind
          description: query scripts kind
          in: query
          required: false
          schema:
            type: string
        - name: limit
          description: query limit
          in: query
          required: false
          schema:
            type: number
        - name: app
          description: query scripts app
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    ask_id:
                      type: number
                    id:
                      type: number
                    version_id:
                      type: number
                    summary:
                      type: string
                    app:
                      type: string
                    kind:
                      $ref: "#/components/schemas/HubScriptKind"
                    score:
                      type: number
                  required:
                    - ask_id
                    - id
                    - version_id
                    - summary
                    - app
                    - kind
                    - score

  /w/{workspace}/scripts/list_search:
    get:
      summary: list scripts for search
      operationId: listSearchScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: script list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    content:
                      type: string
                  required:
                    - path
                    - content

  /w/{workspace}/scripts/list:
    get:
      summary: list all scripts
      operationId: listScripts
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: first_parent_hash
          description: mask to filter scripts whom first direct parent has exact hash
          in: query
          schema:
            type: string
        - name: last_parent_hash
          description: |
            mask to filter scripts whom last parent in the chain has exact hash. 
            Beware that each script stores only a limited number of parents. Hence
            the last parent hash for a script is not necessarily its top-most parent.
            To find the top-most parent you will have to jump from last to last hash
             until finding the parent
          in: query
          schema:
            type: string
        - name: parent_hash
          description: |
            is the hash present in the array of stored parent hashes for this script.
            The same warning applies than for last_parent_hash. A script only store a
            limited number of direct parent
          in: query
          schema:
            type: string
        - name: show_archived
          description: |
            (default false)
            show also the archived files.
            when multiple archived hash share the same path, only the ones with the latest create_at
            are 
            ed.
          in: query
          schema:
            type: boolean
        - name: is_template
          description: |
            (default regardless)
            if true show only the templates
            if false show only the non templates
            if not defined, show all regardless of if the script is a template
          in: query
          schema:
            type: boolean
        - name: kinds
          description: |
            (default regardless)
            script kinds to filter, split by comma
          in: query
          schema:
            type: string
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All scripts
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/list_paths:
    get:
      summary: list all scripts paths
      operationId: listScriptPaths
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: list of script paths
          content:
            text/plain:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/drafts/create:
    post:
      summary: create draft
      operationId: createDraft
      tags:
        - draft
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                typ:
                  type: string
                  enum: ["flow", "script", "app"]
                value: {}
              required:
                - path
                - typ
                - enum
      responses:
        "201":
          description: draft created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/drafts/delete/{kind}/{path}:
    delete:
      summary: delete draft
      operationId: deleteDraft
      tags:
        - draft
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              - script
              - flow
              - app
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: draft deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/create:
    post:
      summary: create script
      operationId: createScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Partially filled script
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewScript"

      responses:
        "201":
          description: script created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/toggle_workspace_error_handler/p/{path}:
    post:
      summary: Toggle ON and OFF the workspace error handler for a given script
      operationId: toggleWorkspaceErrorHandlerForScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Workspace error handler enabled
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                muted:
                  type: boolean
      responses:
        "200":
          description: error handler toggled
          content:
            text/plain:
              schema:
                type: string

  /workers/custom_tags:
    get:
      summary: get all instance custom tags (tags are used to dispatch jobs to
        different worker groups)
      operationId: getCustomTags
      tags:
        - worker
      responses:
        "200":
          description: list of custom tags
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/scripts/archive/p/{path}:
    post:
      summary: archive script by path
      operationId: archiveScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script archived
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/archive/h/{hash}:
    post:
      summary: archive script by hash
      operationId: archiveScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/delete/h/{hash}:
    post:
      summary: delete script by hash (erase content but keep hash, require admin)
      operationId: deleteScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/delete/p/{path}:
    post:
      summary: delete all scripts at a given path (require admin)
      operationId: deleteScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script path
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/scripts/get/p/{path}:
    get:
      summary: get script by path
      operationId: getScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/get/draft/{path}:
    get:
      summary: get script by path with draft
      operationId: getScriptByPathWithDraft
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NewScriptWithDraft"

  /w/{workspace}/scripts/raw/p/{path}:
    get:
      summary: raw script by path
      operationId: rawScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script content
          content:
            text/plain:
              schema:
                type: string

  /scripts_u/tokened_raw/{workspace}/{token}/{path}:
    get:
      summary:
        raw script by path with a token (mostly used by lsp to be used with
        import maps to resolve scripts)
      operationId: rawScriptByPathTokened
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Token"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/exists/p/{path}:
    get:
      summary: exists script by path
      operationId: existsScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: does it exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/scripts/get/h/{hash}:
    get:
      summary: get script by hash
      operationId: getScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/raw/h/{path}:
    get:
      summary: raw script by hash
      operationId: rawScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/deployment_status/h/{hash}:
    get:
      summary: get script deployment status
      operationId: getScriptDeploymentStatus
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                type: object
                properties:
                  lock:
                    type: string
                  lock_error_logs:
                    type: string

  /w/{workspace}/jobs/run/p/{path}:
    post:
      summary: run script by path
      operationId: runScriptByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/openai_sync/p/{path}:
    post:
      summary: run script by path in openai format
      operationId: openaiSyncScriptByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run_wait_result/p/{path}:
    post:
      summary: run script by path
      operationId: runWaitResultScriptByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

    get:
      summary: run script by path with get
      operationId: runWaitResultScriptByPathGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/openai_sync/f/{path}:
    post:
      summary: run flow by path and wait until completion in openai format
      operationId: openaiSyncFlowByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/NewJobId"

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run_wait_result/f/{path}:
    post:
      summary: run flow by path and wait until completion
      operationId: runWaitResultFlowByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/NewJobId"

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/result_by_id/{flow_job_id}/{node_id}:
    get:
      summary: get job result by id
      operationId: resultById
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: flow_job_id
          in: path
          required: true
          schema:
            type: string
        - name: node_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/flows/list_paths:
    get:
      summary: list all flow paths
      operationId: listFlowPaths
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: list of flow paths
          content:
            text/plain:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/flows/list_search:
    get:
      summary: list flows for search
      operationId: listSearchFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: flow list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                  required:
                    - path
                    - value

  /w/{workspace}/flows/list:
    get:
      summary: list all flows
      operationId: listFlows
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: show_archived
          description: |
            (default false)
            show also the archived files.
            when multiple archived hash share the same path, only the ones with the latest create_at
            are displayed.
          in: query
          schema:
            type: boolean
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All flow
          content:
            application/json:
              schema:
                type: array
                items:
                  allOf:
                    - $ref: "#/components/schemas/Flow"
                    - type: object
                      properties:
                        has_draft:
                          type: boolean
                        draft_only:
                          type: boolean

  /w/{workspace}/flows/get/{path}:
    get:
      summary: get flow by path
      operationId: getFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Flow"

  /w/{workspace}/flows/toggle_workspace_error_handler/{path}:
    post:
      summary: Toggle ON and OFF the workspace error handler for a given flow
      operationId: toggleWorkspaceErrorHandlerForFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Workspace error handler enabled
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                muted:
                  type: boolean
      responses:
        "200":
          description: error handler toggled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/get/draft/{path}:
    get:
      summary: get flow by path with draft
      operationId: getFlowByPathWithDraft
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow details with draft
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/Flow"
                  - type: object
                    properties:
                      draft:
                        $ref: "#/components/schemas/Flow"

  /w/{workspace}/flows/exists/{path}:
    get:
      summary: exists flow by path
      operationId: existsFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow details
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/flows/create:
    post:
      summary: create flow
      operationId: createFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Partially filled flow
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: "#/components/schemas/OpenFlowWPath"
                - type: object
                  properties:
                    draft_only:
                      type: boolean
      responses:
        "201":
          description: flow created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/update/{path}:
    post:
      summary: update flow
      operationId: updateFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Partially filled flow
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/OpenFlowWPath"

      responses:
        "200":
          description: flow updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/archive/{path}:
    post:
      summary: archive flow by path
      operationId: archiveFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: archiveFlow
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                archived:
                  type: boolean
      responses:
        "200":
          description: flow archived
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/delete/{path}:
    delete:
      summary: delete flow by path
      operationId: deleteFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow delete
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/input_history/p/{path}:
    get:
      summary: list inputs for previous completed flow jobs
      operationId: getFlowInputHistoryByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: input history for completed jobs with this flow path
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Input"

  /w/{workspace}/raw_apps/list:
    get:
      summary: list all raw apps
      operationId: listRawApps
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All raw apps
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableRawApp"

  /w/{workspace}/raw_apps/exists/{path}:
    get:
      summary: does an app exisst at path
      operationId: existsRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/apps/get_data/{version}/{path}:
    get:
      summary: get app by path
      operationId: getRawAppData
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/VersionId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app details
          content:
            text/javascript:
              schema:
                type: string

  /w/{workspace}/apps/list_search:
    get:
      summary: list apps for search
      operationId: listSearchApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: app list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                  required:
                    - path
                    - value

  /w/{workspace}/apps/list:
    get:
      summary: list all apps
      operationId: listApps
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All apps
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableApp"

  /w/{workspace}/apps/create:
    post:
      summary: create app
      operationId: createApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                value: {}
                summary:
                  type: string
                policy:
                  $ref: "#/components/schemas/Policy"
                draft_only:
                  type: boolean
              required:
                - path
                - value
                - summary
                - policy
      responses:
        "201":
          description: app created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/exists/{path}:
    get:
      summary: does an app exisst at path
      operationId: existsApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/apps/get/p/{path}:
    get:
      summary: get app by path
      operationId: getAppByPath
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/apps/get/draft/{path}:
    get:
      summary: get app by path with draft
      operationId: getAppByPathWithDraft
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app details with draft
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersionWDraft"

  /w/{workspace}/apps_u/public_app/{path}:
    get:
      summary: get public app by secret
      operationId: getPublicAppBySecret
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/apps_u/public_resource/{path}:
    get:
      summary: get public resource
      operationId: get public resource
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource value
          content:
            application/json:
              schema: {}

  /w/{workspace}/apps/secret_of/{path}:
    get:
      summary: get public secret of app
      operationId: getPublicSecretOfApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app secret
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/get/v/{id}:
    get:
      summary: get app by version
      operationId: getAppByVersion
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/raw_apps/create:
    post:
      summary: create raw app
      operationId: createRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new raw app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                value:
                  type: string
                summary:
                  type: string
              required:
                - path
                - value
                - summary
      responses:
        "201":
          description: raw app created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/raw_apps/update/{path}:
    post:
      summary: update app
      operationId: updateRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: updateraw  app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                summary:
                  type: string
                value:
                  type: string
      responses:
        "200":
          description: app updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/raw_apps/delete/{path}:
    delete:
      summary: delete raw app
      operationId: deleteRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/delete/{path}:
    delete:
      summary: delete app
      operationId: deleteApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/update/{path}:
    post:
      summary: update app
      operationId: updateApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: update app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                summary:
                  type: string
                value: {}
                policy:
                  $ref: "#/components/schemas/Policy"
      responses:
        "200":
          description: app updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps_u/execute_component/{path}:
    post:
      summary: executeComponent
      operationId: executeComponent
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: update app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                component:
                  type: string
                #script: script/<path>
                #flow: flow/<path>
                path:
                  type: string
                args: {}
                raw_code:
                  type: object
                  properties:
                    content:
                      type: string
                    language:
                      type: string
                    path:
                      type: string
                    cache_ttl:
                      type: integer
                  required:
                    - content
                    - language
                force_viewer_static_fields:
                  type: object
              required:
                - args
                - component

      responses:
        "200":
          description: job uuid
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/run/f/{path}:
    post:
      summary: run flow by path
      operationId: runFlowByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the flow owner (default false)
          in: query
          schema:
            type: boolean

      requestBody:
        description: flow args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/restart/f/{id}/from/{step_id}/{branch_or_iteration_n}:
    post:
      summary: restart a completed flow at a given step
      operationId: restartFlowAtStep
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: step_id
          description: step id to restart the flow from
          required: true
          in: path
          schema:
            type: string
        - name: branch_or_iteration_n
          description: for branchall or loop, the iteration at which the flow should restart
          required: true
          in: path
          schema:
            type: integer
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the flow owner (default false)
          in: query
          schema:
            type: boolean

      requestBody:
        description: flow args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/h/{hash}:
    post:
      summary: run script by hash
      operationId: runScriptByHash
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: Partially filled args
        required: true
        content:
          application/json:
            schema:
              type: object

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/preview:
    post:
      summary: run script preview
      operationId: runScriptPreview
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
        - $ref: "#/components/parameters/NewJobId"

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Preview"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/preview_flow:
    post:
      summary: run flow preview
      operationId: runFlowPreview
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
        - $ref: "#/components/parameters/NewJobId"

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowPreview"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/queue/list:
    get:
      summary: list all queued jobs
      operationId: listQueue
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/Success"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/Suspended"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/Tag"
      responses:
        "200":
          description: All queued jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/QueuedJob"

  /w/{workspace}/jobs/queue/count:
    get:
      summary: get queue count
      operationId: getQueueCount
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: queue count
          content:
            application/json:
              schema:
                type: object
                properties:
                  database_length:
                    type: integer
                required:
                  - database_length

  /w/{workspace}/jobs/completed/count:
    get:
      summary: get completed count
      operationId: getCompletedCount
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: completed count
          content:
            application/json:
              schema:
                type: object
                properties:
                  database_length:
                    type: integer
                required:
                  - database_length

  /w/{workspace}/jobs/queue/cancel_all:
    post:
      summary: cancel all jobs
      operationId: cancelAll
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: uuids of canceled jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/jobs/completed/list:
    get:
      summary: list all completed jobs
      operationId: listCompletedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/Success"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/Tag"
        - name: is_skipped
          description: is the job skipped
          in: query
          schema:
            type: boolean
        - name: is_flow_step
          description: is the job a flow step
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All completed jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CompletedJob"

  /w/{workspace}/jobs/list:
    get:
      summary: list all jobs
      operationId: listJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/CreatedOrStartedBefore"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/CreatedOrStartedAfter"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/ResultFilter"
        - name: is_skipped
          description: is the job skipped
          in: query
          schema:
            type: boolean
        - name: is_flow_step
          description: is the job a flow step
          in: query
          schema:
            type: boolean
        - name: success
          description: filter on successful jobs
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Job"

  /jobs/db_clock:
    get:
      summary: get db clock
      operationId: getDbClock
      tags:
        - job
      responses:
        "200":
          description: the timestamp of the db that can be used to compute the drift
          content:
            application/json:
              schema:
                type: integer

  /w/{workspace}/jobs_u/get/{id}:
    get:
      summary: get job
      operationId: getJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"

  /w/{workspace}/jobs_u/get_logs/{id}:
    get:
      summary: get job logs
      operationId: getJob logs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job details
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/getupdate/{id}:
    get:
      summary: get job updates
      operationId: getJobUpdates
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: running
          in: query
          schema:
            type: boolean
        - name: log_offset
          in: query
          schema:
            type: integer

      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                type: object
                properties:
                  running:
                    type: boolean
                  completed:
                    type: boolean
                  new_logs:
                    type: string
                  mem_peak:
                    type: integer

  /w/{workspace}/jobs_u/completed/get/{id}:
    get:
      summary: get completed job
      operationId: getCompletedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CompletedJob"

  /w/{workspace}/jobs_u/completed/get_result/{id}:
    get:
      summary: get completed job result
      operationId: getCompletedJobResult
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs_u/completed/get_result_maybe/{id}:
    get:
      summary: get completed job result if job is completed
      operationId: getCompletedJobResultMaybe
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/GetStarted"
      responses:
        "200":
          description: result
          content:
            application/json:
              schema:
                type: object
                properties:
                  completed:
                    type: boolean
                  result: {}
                  started:
                    type: boolean
                required:
                  - completed
                  - result

  /w/{workspace}/jobs/completed/delete/{id}:
    post:
      summary: delete completed job (erase content but keep run id)
      operationId: deleteCompletedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CompletedJob"

  /w/{workspace}/jobs_u/queue/cancel/{id}:
    post:
      summary: cancel queued job
      operationId: cancelQueuedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        description: reason
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string

      responses:
        "200":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/queue/force_cancel/{id}:
    post:
      summary: force cancel queued job
      operationId: forceCancelQueuedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        description: reason
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string

      responses:
        "200":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/job_signature/{id}/{resume_id}:
    get:
      summary: create an HMac signature given a job id and a resume id
      operationId: createJobSignature
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "200":
          description: job signature
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/resume_urls/{id}/{resume_id}:
    get:
      summary: get resume urls given a job_id, resume_id and a nonce to resume a flow
      operationId: getResumeUrls
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "200":
          description: url endpoints
          content:
            application/json:
              schema:
                type: object
                properties:
                  approvalPage:
                    type: string
                  resume:
                    type: string
                  cancel:
                    type: string
                required:
                  - approvalPage
                  - resume
                  - cancel

  /w/{workspace}/jobs_u/resume/{id}/{resume_id}/{signature}:
    get:
      summary: resume a job for a suspended flow
      operationId: resumeSuspendedJobGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/Payload"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "201":
          description: job resumed
          content:
            text/plain:
              schema:
                type: string

    post:
      summary: resume a job for a suspended flow
      operationId: resumeSuspendedJobPost
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        "201":
          description: job resumed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/flow/resume/{id}:
    post:
      summary: resume a job for a suspended flow as an owner
      operationId: resumeSuspendedFlowAsOwner
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        "201":
          description: job resumed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/cancel/{id}/{resume_id}/{signature}:
    get:
      summary: cancel a job for a suspended flow
      operationId: cancelSuspendedJobGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "201":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

    post:
      summary: cancel a job for a suspended flow
      operationId: cancelSuspendedJobPost
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        "201":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_flow/{id}/{resume_id}/{signature}:
    get:
      summary: get parent flow job of suspended job
      operationId: getSuspendedJobFlow
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "200":
          description: parent flow details
          content:
            application/json:
              schema:
                type: object
                properties:
                  job:
                    $ref: "#/components/schemas/Job"
                  approvers:
                    type: array
                    items:
                      type: object
                      properties:
                        resume_id:
                          type: integer
                        approver:
                          type: string
                      required:
                        - resume_id
                        - approver
                required:
                  - job
                  - approvers

  /schedules/preview:
    post:
      summary: preview schedule
      operationId: previewSchedule
      tags:
        - schedule
      requestBody:
        description: schedule
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                schedule:
                  type: string
                timezone:
                  type: string
              required:
                - schedule
                - timezone
      responses:
        "200":
          description: List of 5 estimated upcoming execution events (in UTC)
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  format: date-time

  /w/{workspace}/schedules/create:
    post:
      summary: create schedule
      operationId: createSchedule
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new schedule
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewSchedule"
      responses:
        "201":
          description: schedule created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/update/{path}:
    post:
      summary: update schedule
      operationId: updateSchedule
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated schedule
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditSchedule"
      responses:
        "200":
          description: schedule updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/setenabled/{path}:
    post:
      summary: set enabled schedule
      operationId: setScheduleEnabled
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated schedule enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                enabled:
                  type: boolean
              required:
                - enabled

      responses:
        "200":
          description: schedule enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/delete/{path}:
    delete:
      summary: delete schedule
      operationId: deleteSchedule
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: schedule deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/get/{path}:
    get:
      summary: get schedule
      operationId: getSchedule
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: schedule deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Schedule"

  /w/{workspace}/schedules/exists/{path}:
    get:
      summary: does schedule exists
      operationId: existsSchedule
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: schedule exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/schedules/list:
    get:
      summary: list schedules
      operationId: listSchedules
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: schedule list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Schedule"

  /w/{workspace}/schedules/list_with_jobs:
    get:
      summary: list schedules with last 20 jobs
      operationId: listSchedulesWithJobs
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: schedule list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ScheduleWJobs"

  /groups/list:
    get:
      summary: list instance groups
      operationId: listInstanceGroups
      tags:
        - group
      responses:
        "200":
          description: instance group list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/InstanceGroup"

  /groups/get/{name}:
    get:
      summary: get instance group
      operationId: getInstanceGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: instance group
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InstanceGroup"

  /w/{workspace}/groups/list:
    get:
      summary: list groups
      operationId: listGroups
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: group list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Group"

  /w/{workspace}/groups/listnames:
    get:
      summary: list group names
      operationId: listGroupNames
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: only_member_of
          in: query
          description: only list the groups the user is member of (default false)
          schema:
            type: boolean
      responses:
        "200":
          description: group list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/groups/create:
    post:
      summary: create group
      operationId: createGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: create group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                summary:
                  type: string
              required:
                - name
      responses:
        "200":
          description: group created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/update/{name}:
    post:
      summary: update group
      operationId: updateGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: updated group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                summary:
                  type: string
      responses:
        "200":
          description: group updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/delete/{name}:
    delete:
      summary: delete group
      operationId: deleteGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: group deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/get/{name}:
    get:
      summary: get group
      operationId: getGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: group
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Group"

  /w/{workspace}/groups/adduser/{name}:
    post:
      summary: add user to group
      operationId: addUserToGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: added user to group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
      responses:
        "200":
          description: user added to group
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/removeuser/{name}:
    post:
      summary: remove user to group
      operationId: removeUserToGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: added user to group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
      responses:
        "200":
          description: user removed from group
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/list:
    get:
      summary: list folders
      operationId: listFolders
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: folder list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Folder"

  /w/{workspace}/folders/listnames:
    get:
      summary: list folder names
      operationId: listFolderNames
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: only_member_of
          in: query
          description: only list the folders the user is member of (default false)
          schema:
            type: boolean
      responses:
        "200":
          description: folder list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/folders/create:
    post:
      summary: create folder
      operationId: createFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: create folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                owners:
                  type: array
                  items:
                    type: string
                extra_perms:
                  additionalProperties:
                    type: boolean
              required:
                - name
      responses:
        "200":
          description: folder created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/update/{name}:
    post:
      summary: update folder
      operationId: updateFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: update folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owners:
                  type: array
                  items:
                    type: string
                extra_perms:
                  additionalProperties:
                    type: boolean
      responses:
        "200":
          description: folder updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/delete/{name}:
    delete:
      summary: delete folder
      operationId: deleteFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/get/{name}:
    get:
      summary: get folder
      operationId: getFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Folder"

  /w/{workspace}/folders/getusage/{name}:
    get:
      summary: get folder usage
      operationId: getFolderUsage
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder
          content:
            application/json:
              schema:
                type: object
                properties:
                  scripts:
                    type: number
                  flows:
                    type: number
                  apps:
                    type: number
                  resources:
                    type: number
                  variables:
                    type: number
                  schedules:
                    type: number
                required:
                  - scripts
                  - flows
                  - apps
                  - resources
                  - variables
                  - schedules

  /w/{workspace}/folders/addowner/{name}:
    post:
      summary: add owner to folder
      operationId: addOwnerToFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: owner user to folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
      responses:
        "200":
          description: owner added to folder
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/removeowner/{name}:
    post:
      summary: remove owner to folder
      operationId: removeOwnerToFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: added owner to folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
      responses:
        "200":
          description: owner removed from folder
          content:
            text/plain:
              schema:
                type: string

  /workers/list:
    get:
      summary: list workers
      operationId: listWorkers
      tags:
        - worker
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: a list of workers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkerPing"

  /configs/list_worker_groups:
    get:
      summary: list worker groups
      operationId: listWorkerGroups
      tags:
        - config
      responses:
        "200":
          description: a list of worker group configs
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    config: {}
                  required:
                    - name
                    - config

  /configs/get/{name}:
    get:
      summary: get config
      operationId: get config
      tags:
        - config
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: a config
          content:
            application/json:
              schema: {}

  /configs/update/{name}:
    post:
      summary: Update config
      operationId: updateConfig
      tags:
        - config
      parameters:
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: worker group
        required: true
        content:
          application/json:
            schema: {}
      responses:
        "200":
          description: Update a worker group
          content:
            text/plain:
              schema:
                type: string
    delete:
      summary: Delete Config
      operationId: deleteConfig
      tags:
        - config
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: Delete config
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/acls/get/{kind}/{path}:
    get:
      summary: get granular acls
      operationId: getGranularAcls
      tags:
        - granular_acl
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              [
                script,
                group_,
                resource,
                schedule,
                variable,
                flow,
                folder,
                app,
                raw_app,
              ]
      responses:
        "200":
          description: acls
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: boolean

  /w/{workspace}/acls/add/{kind}/{path}:
    post:
      summary: add granular acls
      operationId: addGranularAcls
      tags:
        - granular_acl
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              [
                script,
                group_,
                resource,
                schedule,
                variable,
                flow,
                folder,
                app,
                raw_app,
              ]
      requestBody:
        description: acl to add
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
                write:
                  type: boolean
              required: [owner]
      responses:
        "200":
          description: granular acl added
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/acls/remove/{kind}/{path}:
    post:
      summary: remove granular acls
      operationId: removeGranularAcls
      tags:
        - granular_acl
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              [
                script,
                group_,
                resource,
                schedule,
                variable,
                flow,
                folder,
                app,
                raw_app,
              ]
      requestBody:
        description: acl to add
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
              required: [owner]
      responses:
        "200":
          description: granular acl removed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/capture_u/{path}:
    post:
      summary: update flow preview capture
      operationId: updateCapture
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "204":
          description: flow preview captured

  /w/{workspace}/capture/{path}:
    put:
      summary: create flow preview capture
      operationId: createCapture
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "201":
          description: flow preview capture created
    get:
      summary: get flow preview capture
      operationId: getCapture
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: captured flow preview
          content:
            application/json:
              schema: {}
        "404":
          description: capture does not exist for this flow

  /w/{workspace}/favorites/star:
    post:
      summary: star item
      operationId: star
      tags:
        - favorite
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                favorite_kind:
                  type: string
                  enum: [flow, app, script, raw_app]
      responses:
        "200":
          description: star item

  /w/{workspace}/favorites/unstar:
    post:
      summary: unstar item
      operationId: unstar
      tags:
        - favorite
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                favorite_kind:
                  type: string
                  enum: [flow, app, script, raw_app]
      responses:
        "200":
          description: unstar item

  /w/{workspace}/inputs/history:
    get:
      summary: List Inputs used in previously completed jobs
      operationId: getInputHistory
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableId"
        - $ref: "#/components/parameters/RunnableTypeQuery"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: Input history for completed jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Input"

  /w/{workspace}/inputs/list:
    get:
      summary: List saved Inputs for a Runnable
      operationId: listInputs
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableId"
        - $ref: "#/components/parameters/RunnableTypeQuery"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: Saved Inputs for a Runnable
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Input"

  /w/{workspace}/inputs/create:
    post:
      summary: Create an Input for future use in a script or flow
      operationId: createInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableId"
        - $ref: "#/components/parameters/RunnableTypeQuery"
      requestBody:
        description: Input
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateInput"
      responses:
        "201":
          description: Input created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/inputs/update:
    post:
      summary: Update an Input
      operationId: updateInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: UpdateInput
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateInput"
      responses:
        "201":
          description: Input updated
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/inputs/delete/{input}:
    post:
      summary: Delete a Saved Input
      operationId: deleteInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/InputId"
      responses:
        "200":
          description: Input deleted
          content:
            text/plain:
              schema:
                type: string
                format: uuid

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
    cookieAuth:
      type: apiKey
      in: cookie
      name: token

  parameters:
    Key:
      name: key
      in: path
      required: true
      schema:
        type: string
    WorkspaceId:
      name: workspace
      in: path
      required: true
      schema:
        type: string
    VersionId:
      name: version
      in: path
      required: true
      schema:
        type: number
    Token:
      name: token
      in: path
      required: true
      schema:
        type: string
    AccountId:
      name: id
      in: path
      required: true
      schema:
        type: integer
    ClientName:
      name: client_name
      in: path
      required: true
      schema:
        type: string
    ScriptPath:
      name: path
      in: path
      required: true
      schema:
        type: string
    ScriptHash:
      name: hash
      in: path
      required: true
      schema:
        type: string
    JobId:
      name: id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    Path:
      name: path
      in: path
      required: true
      schema:
        type: string
    PathId:
      name: id
      in: path
      required: true
      schema:
        type: integer
    Name:
      name: name
      in: path
      required: true
      schema:
        type: string
    Page:
      name: page
      description: which page to return (start at 1, default 1)
      in: query
      schema:
        type: integer
    PerPage:
      name: per_page
      description: number of items to return for a given page (default 30, max 100)
      in: query
      schema:
        type: integer
    OrderDesc:
      name: order_desc
      description: order by desc order (default true)
      in: query
      schema:
        type: boolean
    CreatedBy:
      name: created_by
      description: mask to filter exact matching user creator
      in: query
      schema:
        type: string
    ParentJob:
      name: parent_job
      description:
        The parent job that is at the origin and responsible for the execution
        of this script if any
      in: query
      schema:
        type: string
        format: uuid
    NewJobId:
      name: job_id
      description:
        The job id to assign to the created job. if missing, job is chosen
        randomly using the ULID scheme. If a job id already exists in the queue
        or as a completed job, the request to create one will fail (Bad Request)
      in: query
      schema:
        type: string
        format: uuid
    IncludeHeader:
      name: include_header
      description: |
        List of headers's keys (separated with ',') whove value are added to the args
        Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key
      in: query
      schema:
        type: string
    QueueLimit:
      name: queue_limit
      description: |
        The maximum size of the queue for which the request would get rejected if that job would push it above that limit
      in: query
      schema:
        type: string
    Payload:
      name: payload
      description: |
        The base64 encoded payload that has been encoded as a JSON. e.g how to encode such payload encodeURIComponent
        `encodeURIComponent(btoa(JSON.stringify({a: 2})))`
      in: query
      schema:
        type: string
    ScriptStartPath:
      name: script_path_start
      description: mask to filter matching starting path
      in: query
      schema:
        type: string
    SchedulePath:
      name: schedule_path
      description: mask to filter by schedule path
      in: query
      schema:
        type: string
    ScriptExactPath:
      name: script_path_exact
      description: mask to filter exact matching path
      in: query
      schema:
        type: string
    ScriptExactHash:
      name: script_hash
      description: mask to filter exact matching path
      in: query
      schema:
        type: string
    StartedBefore:
      name: started_before
      description: filter on started before (inclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    StartedAfter:
      name: started_after
      description: filter on started after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    CreatedOrStartedAfter:
      name: created_or_started_after
      description:
        filter on created_at for non non started job and started_at otherwise
        after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    CreatedOrStartedBefore:
      name: created_or_started_before
      description:
        filter on created_at for non non started job and started_at otherwise
        before (inclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    Success:
      name: success
      description: filter on successful jobs
      in: query
      schema:
        type: boolean
    Suspended:
      name: suspended
      description: filter on suspended jobs
      in: query
      schema:
        type: boolean
    Running:
      name: running
      description: filter on running jobs
      in: query
      schema:
        type: boolean
    ArgsFilter:
      name: args
      description: filter on jobs containing those args as a json subset (@> in postgres)
      in: query
      schema:
        type: string
    Tag:
      name: tag
      description: filter on jobs with a given tag/worker group
      in: query
      schema:
        type: string
    ResultFilter:
      name: result
      description: filter on jobs containing those result as a json subset (@> in postgres)
      in: query
      schema:
        type: string
    After:
      name: after
      description: filter on created after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    Before:
      name: before
      description: filter on created before (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    Username:
      name: username
      description: filter on exact username of user
      in: query
      schema:
        type: string
    Operation:
      name: operation
      description: filter on exact or prefix name of operation
      in: query
      schema:
        type: string
    ResourceName:
      name: resource
      description: filter on exact or prefix name of resource
      in: query
      schema:
        type: string
    ActionKind:
      name: action_kind
      description: filter on type of operation
      in: query
      schema:
        type: string
        enum: [Create, Update, Delete, Execute]
    JobKinds:
      name: job_kinds
      description:
        filter on job kind (values 'preview', 'script', 'dependencies', 'flow')
        separated by,
      in: query
      schema:
        type: string
      # correct type is below but explode not supported by our codegen
      #   type: array
      #   items:
      #     type: string
      #     enum: ["preview", "script", "dependencies"]
      # explode: false
    RunnableId:
      name: runnable_id
      in: query
      schema:
        type: string
    RunnableTypeQuery:
      name: runnable_type
      in: query
      schema:
        $ref: "#/components/schemas/RunnableType"
    InputId:
      name: input
      in: path
      required: true
      schema:
        type: string
    GetStarted:
      name: get_started
      in: query
      schema:
        type: boolean

  schemas:
    $ref: "../../openflow.openapi.yaml#/components/schemas"

    Script:
      type: object
      properties:
        workspace_id:
          type: string
        hash:
          type: string
        path:
          type: string
        parent_hashes:
          type: array
          description: |
            The first element is the direct parent of the script, the second is the parent of the first, etc
          items:
            type: string
        summary:
          type: string
        description:
          type: string
        content:
          type: string
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        archived:
          type: boolean
        schema:
          type: object
        deleted:
          type: boolean
        is_template:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        lock:
          type: string
        lock_error_logs:
          type: string
        language:
          type: string
          enum:
            [
              python3,
              deno,
              go,
              bash,
              powershell,
              postgresql,
              mysql,
              bigquery,
              snowflake,
              graphql,
              nativets,
              bun,
            ]
        kind:
          type: string
          enum: [script, failure, trigger, command, approval]
        starred:
          type: boolean
        tag:
          type: string
        has_draft:
          type: boolean
        draft_only:
          type: boolean
        envs:
          type: array
          items:
            type: string
        concurrent_limit:
          type: integer
        concurrency_time_window_s:
          type: integer
        cache_ttl:
          type: number
        dedicated_worker:
          type: boolean
        ws_error_handler_muted:
          type: boolean
        priority:
          type: integer
      required:
        - hash
        - path
        - summary
        - description
        - content
        - created_by
        - created_at
        - archived
        - deleted
        - is_template
        - extra_perms
        - language
        - kind
        - starred

    NewScript:
      type: object
      properties:
        path:
          type: string
        parent_hash:
          type: string
        summary:
          type: string
        description:
          type: string
        content:
          type: string
        schema:
          type: object
        is_template:
          type: boolean
        lock:
          type: array
          items:
            type: string
        language:
          type: string
          enum:
            [
              python3,
              deno,
              go,
              bash,
              powershell,
              postgresql,
              mysql,
              bigquery,
              snowflake,
              graphql,
              nativets,
              bun,
            ]
        kind:
          type: string
          enum: [script, failure, trigger, command, approval]
        tag:
          type: string
        draft_only:
          type: boolean
        envs:
          type: array
          items:
            type: string
        concurrent_limit:
          type: integer
        concurrency_time_window_s:
          type: integer
        cache_ttl:
          type: number
        dedicated_worker:
          type: boolean
        ws_error_handler_muted:
          type: boolean
        priority:
          type: integer
      required:
        - path
        - summary
        - description
        - content
        - language

    NewScriptWithDraft:
      allOf:
        - $ref: "#/components/schemas/NewScript"
        - type: object
          properties:
            draft:
              $ref: "#/components/schemas/NewScript"
            hash:
              type: string
          required:
            - hash

    ScriptArgs:
      type: object
      additionalProperties: {}

    Input:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        args:
          type: object
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        is_public:
          type: boolean
        success:
          type: boolean
      required:
        - id
        - name
        - args
        - created_by
        - created_at
        - is_public

    CreateInput:
      type: object
      properties:
        name:
          type: string
        args:
          type: object
      required:
        - name
        - args
        - created_by

    UpdateInput:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        is_public:
          type: boolean
      required:
        - id
        - name
        - is_public

    RunnableType:
      type: string
      enum: ["ScriptHash", "ScriptPath", "FlowPath"]

    QueuedJob:
      type: object
      properties:
        workspace_id:
          type: string
        id:
          type: string
          format: uuid
        parent_job:
          type: string
          format: uuid
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        scheduled_for:
          type: string
          format: date-time
        running:
          type: boolean
        script_path:
          type: string
        script_hash:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        logs:
          type: string
        raw_code:
          type: string
        canceled:
          type: boolean
        canceled_by:
          type: string
        canceled_reason:
          type: string
        last_ping:
          type: string
          format: date-time
        job_kind:
          type: string
          enum:
            [
              "script",
              "preview",
              "dependencies",
              "flowdependencies",
              "appdependencies",
              "flow",
              "flowpreview",
              "script_hub",
              "identity",
            ]
        schedule_path:
          type: string
        permissioned_as:
          type: string
          description: |
            The user (u/userfoo) or group (g/groupfoo) whom 
            the execution of this script will be permissioned_as and by extension its DT_TOKEN.
        flow_status:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatus"
        raw_flow:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
        is_flow_step:
          type: boolean
        language:
          type: string
          enum:
            [
              python3,
              deno,
              go,
              bash,
              powershell,
              postgresql,
              mysql,
              bigquery,
              snowflake,
              graphql,
              nativets,
              bun,
            ]
        email:
          type: string
        visible_to_owner:
          type: boolean
        mem_peak:
          type: integer
        tag:
          type: string
        priority:
          type: integer
      required:
        - id
        - running
        - canceled
        - job_kind
        - permissioned_as
        - is_flow_step
        - email
        - visible_to_owner
        - tag

    CompletedJob:
      type: object
      properties:
        workspace_id:
          type: string
        id:
          type: string
          format: uuid
        parent_job:
          type: string
          format: uuid
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        duration_ms:
          type: integer
        success:
          type: boolean
        script_path:
          type: string
        script_hash:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        result: {}
        logs:
          type: string
        deleted:
          type: boolean
        raw_code:
          type: string
        canceled:
          type: boolean
        canceled_by:
          type: string
        canceled_reason:
          type: string
        job_kind:
          type: string
          enum:
            [
              "script",
              "preview",
              "dependencies",
              "flow",
              "flowdependencies",
              "appdependencies",
              "flowpreview",
              "script_hub",
              "identity",
            ]
        schedule_path:
          type: string
        permissioned_as:
          type: string
          description: |
            The user (u/userfoo) or group (g/groupfoo) whom 
            the execution of this script will be permissioned_as and by extension its DT_TOKEN.
        flow_status:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatus"
        raw_flow:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
        is_flow_step:
          type: boolean
        language:
          type: string
          enum:
            [
              python3,
              deno,
              go,
              bash,
              powershell,
              postgresql,
              mysql,
              bigquery,
              snowflake,
              graphql,
              nativets,
              bun,
            ]
        is_skipped:
          type: boolean
        email:
          type: string
        visible_to_owner:
          type: boolean
        mem_peak:
          type: integer
        tag:
          type: string
        priority:
          type: integer
      required:
        - id
        - created_by
        - duration_ms
        - created_at
        - started_at
        - success
        - canceled
        - job_kind
        - permissioned_as
        - is_flow_step
        - is_skipped
        - email
        - visible_to_owner
        - tag

    Job:
      allOf:
        - oneOf:
            - $ref: "#/components/schemas/CompletedJob"
            - $ref: "#/components/schemas/QueuedJob"
        - type: object
          properties:
            type:
              type: string
              enum: [CompletedJob, QueuedJob]
      discriminator:
        propertyName: type

    User:
      type: object
      properties:
        email:
          type: string
        username:
          type: string
        is_admin:
          type: boolean
        is_super_admin:
          type: boolean
        created_at:
          type: string
          format: date-time
        operator:
          type: boolean
        disabled:
          type: boolean
        groups:
          type: array
          items:
            type: string
        folders:
          type: array
          items:
            type: string
        folders_owners:
          type: array
          items:
            type: string
        usage:
          $ref: "#/components/schemas/Usage"
      required:
        - email
        - username
        - is_admin
        - is_super_admin
        - created_at
        - operator
        - disabled
        - folders
        - folders_owners

    Usage:
      type: object
      properties:
        executions:
          type: number

    Login:
      type: object
      properties:
        email:
          type: string
        password:
          type: string
      required:
        - email
        - password

    NewUser:
      type: object
      properties:
        email:
          type: string
        username:
          type: string
        is_admin:
          type: boolean
      required:
        - email
        - username
        - is_admin

    EditWorkspaceUser:
      type: object
      properties:
        is_admin:
          type: boolean
        operator:
          type: boolean
        disabled:
          type: boolean

    TruncatedToken:
      type: object
      properties:
        label:
          type: string
        expiration:
          type: string
          format: date-time
        token_prefix:
          type: string
        created_at:
          type: string
          format: date-time
        last_used_at:
          type: string
          format: date-time
        scopes:
          type: array
          items:
            type: string
      required:
        - token_prefix
        - created_at
        - last_used_at

    NewToken:
      type: object
      properties:
        label:
          type: string
        expiration:
          type: string
          format: date-time
        scopes:
          type: array
          items:
            type: string

    NewTokenImpersonate:
      type: object
      properties:
        label:
          type: string
        expiration:
          type: string
          format: date-time
        impersonate_email:
          type: string
      required:
        - impersonate_email

    ListableVariable:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        value:
          type: string
        is_secret:
          type: boolean
        description:
          type: string
        account:
          type: integer
        is_oauth:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        is_expired:
          type: boolean
        refresh_error:
          type: string
        is_linked:
          type: boolean
        is_refreshed:
          type: boolean
      required:
        - workspace_id
        - path
        - is_secret
        - extra_perms

    ContextualVariable:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        description:
          type: string
      required:
        - name
        - value
        - description

    CreateVariable:
      type: object
      properties:
        path:
          type: string
        value:
          type: string
        is_secret:
          type: boolean
        description:
          type: string
        account:
          type: integer
        is_oauth:
          type: boolean
      required:
        - path
        - value
        - is_secret
        - description

    EditVariable:
      type: object
      properties:
        path:
          type: string
        value:
          type: string
        is_secret:
          type: boolean
        description:
          type: string

    AuditLog:
      type: object
      properties:
        id:
          type: integer
        timestamp:
          type: string
          format: date-time
        username:
          type: string
        operation:
          type: string
          enum:
            - "jobs.run"
            - "jobs.run.script"
            - "jobs.run.preview"
            - "jobs.run.flow"
            - "jobs.run.flow_preview"
            - "jobs.run.script_hub"
            - "jobs.run.dependencies"
            - "jobs.run.identity"
            - "jobs.run.noop"
            - "jobs.flow_dependencies"
            - "jobs"
            - "jobs.cancel"
            - "jobs.force_cancel"
            - "jobs.disapproval"
            - "jobs.delete"
            - "account.delete"
            - "openai.request"
            - "resources.create"
            - "resources.update"
            - "resources.delete"
            - "resource_types.create"
            - "resource_types.update"
            - "resource_types.delete"
            - "schedule.create"
            - "schedule.setenabled"
            - "schedule.edit"
            - "schedule.delete"
            - "scripts.create"
            - "scripts.update"
            - "scripts.archive"
            - "scripts.delete"
            - "users.create"
            - "users.delete"
            - "users.update"
            - "users.login"
            - "users.logout"
            - "users.accept_invite"
            - "users.decline_invite"
            - "users.token.create"
            - "users.token.delete"
            - "users.add_to_workspace"
            - "users.add_global"
            - "users.setpassword"
            - "users.impersonate"
            - "users.leave_workspace"
            - "oauth.login"
            - "oauth.signup"
            - "variables.create"
            - "variables.delete"
            - "variables.update"
            - "flows.create"
            - "flows.update"
            - "flows.delete"
            - "flows.archive"
            - "apps.create"
            - "apps.update"
            - "apps.delete"
            - "folder.create"
            - "folder.update"
            - "folder.delete"
            - "folder.add_owner"
            - "folder.remove_owner"
            - "group.create"
            - "group.delete"
            - "group.edit"
            - "group.adduser"
            - "group.removeuser"
            - "igroup.create"
            - "igroup.delete"
            - "igroup.adduser"
            - "igroup.removeuser"
            - "variables.decrypt_secret"
            - "workspaces.edit_command_script"
            - "workspaces.edit_deploy_to"
            - "workspaces.edit_auto_invite_domain"
            - "workspaces.edit_webhook"
            - "workspaces.edit_copilot_config"
            - "workspaces.edit_error_handler"
            - "workspaces.create"
            - "workspaces.update"
            - "workspaces.archive"
            - "workspaces.unarchive"
            - "workspaces.delete"
        action_kind:
          type: string
          enum: ["Created", "Updated", "Delete", "Execute"]
        resource:
          type: string
        parameters:
          type: object
      required:
        - id
        - timestamp
        - username
        - operation
        - action_kind

    MainArgSignature:
      type: object
      properties:
        type:
          type: string
          enum: ["Valid", "Invalid"]
        error:
          type: string
        star_args:
          type: boolean
        star_kwargs:
          type: boolean
        args:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              typ:
                oneOf:
                  - type: string
                    enum:
                      [
                        "float",
                        "int",
                        "bool",
                        "email",
                        "unknown",
                        "bytes",
                        "dict",
                        "datetime",
                        "sql",
                      ]
                  - type: object
                    properties:
                      resource:
                        type: string
                        nullable: true
                    required:
                      - resource
                  - type: object
                    properties:
                      str:
                        type: array
                        items:
                          type: string
                        nullable: true
                    required:
                      - str
                  - type: object
                    properties:
                      object:
                        type: array
                        items:
                          type: object
                          properties:
                            key:
                              type: string
                            typ:
                              oneOf:
                                - type: string
                                  enum:
                                    [
                                      "float",
                                      "int",
                                      "bool",
                                      "email",
                                      "unknown",
                                      "bytes",
                                      "dict",
                                      "datetime",
                                      "sql",
                                    ]
                                - type: object
                                  properties:
                                    str: {}
                                  required: [str]
                          required:
                            - key
                            - typ
                    required:
                      - object
                  - type: object
                    properties:
                      list:
                        oneOf:
                          - type: string
                            enum:
                              [
                                "float",
                                "int",
                                "bool",
                                "email",
                                "unknown",
                                "bytes",
                                "dict",
                                "datetime",
                                "sql",
                              ]
                          - type: object
                            properties:
                              str: {}
                            required: [str]
                        nullable: true
                    required:
                      - list
              has_default:
                type: boolean
              default: {}
            required:
              - name
              - typ
      required:
        - star_args
        - start_kwargs
        - args
        - type
        - error

    Preview:
      type: object
      properties:
        content:
          type: string
        path:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        language:
          type: string
          enum:
            [
              python3,
              deno,
              go,
              bash,
              powershell,
              postgresql,
              mysql,
              bigquery,
              snowflake,
              graphql,
              nativets,
              bun,
            ]
        tag:
          type: string
        kind:
          type: string
          enum: [code, identity, http]

      required:
        - args

    CreateResource:
      type: object
      properties:
        path:
          type: string
        value: {}
        description:
          type: string
        resource_type:
          type: string
      required:
        - path
        - value
        - resource_type

    EditResource:
      type: object
      properties:
        path:
          type: string
        description:
          type: string
        value: {}

    Resource:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        description:
          type: string
        resource_type:
          type: string
        value: {}
        is_oauth:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
      required:
        - path
        - resource_type
        - is_oauth

    ListableResource:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        description:
          type: string
        resource_type:
          type: string
        value: {}
        is_oauth:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        is_expired:
          type: boolean
        refresh_error:
          type: string
        is_linked:
          type: boolean
        is_refreshed:
          type: boolean
        account:
          type: number
      required:
        - path
        - resource_type
        - is_oauth
        - is_linked
        - is_refreshed

    ResourceType:
      type: object
      properties:
        workspace_id:
          type: string
        name:
          type: string
        schema: {}
        description:
          type: string
      required:
        - name

    EditResourceType:
      type: object
      properties:
        schema: {}
        description:
          type: string

    Schedule:
      type: object
      properties:
        path:
          type: string
        edited_by:
          type: string
        edited_at:
          type: string
          format: date-time
        schedule:
          type: string
        timezone:
          type: string
        enabled:
          type: boolean
        script_path:
          type: string
        is_flow:
          type: boolean
        args:
          $ref: "#/components/schemas/ScriptArgs"
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        email:
          type: string
        error:
          type: string
        on_failure:
          # a reference to a script path, flow path, or webhook (script/<path>, flow/<path>)
          type: string
        on_failure_times:
          type: number
        on_failure_exact:
          type: boolean
        on_failure_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        on_recovery:
          type: string
        on_recovery_times:
          type: number
        on_recovery_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
      required:
        - path
        - edited_by
        - edited_at
        - schedule
        - script_path
        - timezone
        - extra_perms
        - is_flow
        - enabled
        - email

    ScheduleWJobs:
      allOf:
        - $ref: "#/components/schemas/Schedule"
        - type: object
          properties:
            jobs:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  success:
                    type: boolean
                  duration_ms:
                    type: number
                required:
                  - id
                  - success
                  - duration_ms

    NewSchedule:
      type: object
      properties:
        path:
          type: string
        schedule:
          type: string
        timezone:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        args:
          $ref: "#/components/schemas/ScriptArgs"
        enabled:
          type: boolean
        on_failure:
          # a reference to a script path, flow path, or webhook (script/<path>, flow/<path>)
          type: string
        on_failure_times:
          type: number
        on_failure_exact:
          type: boolean
        on_failure_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        on_recovery:
          type: string
        on_recovery_times:
          type: number
        on_recovery_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
      required:
        - path
        - schedule
        - timezone
        - script_path
        - is_flow
        - args

    EditSchedule:
      type: object
      properties:
        schedule:
          type: string
        timezone:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        on_failure:
          # a reference to a script path, flow path, or webhook (script/<path>, flow/<path>)
          type: string
        on_failure_times:
          type: number
        on_failure_exact:
          type: boolean
        on_failure_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        on_recovery:
          type: string
        on_recovery_times:
          type: number
        on_recovery_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
      required:
        - schedule
        - timezone
        - script_path
        - is_flow
        - args

    Group:
      type: object
      properties:
        name:
          type: string
        summary:
          type: string
        members:
          type: array
          items:
            type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
      required:
        - name

    InstanceGroup:
      type: object
      properties:
        name:
          type: string
        emails:
          type: array
          items:
            type: string
      required:
        - name

    Folder:
      type: object
      properties:
        name:
          type: string
        owners:
          type: array
          items:
            type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
      required:
        - name
        - owners
        - extra_perms

    WorkerPing:
      type: object
      properties:
        worker:
          type: string
        worker_instance:
          type: string
        last_ping:
          type: number
        started_at:
          type: string
          format: date-time
        ip:
          type: string
        jobs_executed:
          type: integer
        custom_tags:
          type: array
          items:
            type: string
        worker_group:
          type: string
      required:
        - worker
        - worker_instance
        - ping_at
        - started_at
        - ip
        - jobs_executed
        - worker_group

    UserWorkspaceList:
      type: object
      properties:
        email:
          type: string
        workspaces:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              username:
                type: string
            required:
              - id
              - name
              - username
      required:
        - email
        - workspaces

    CreateWorkspace:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        username:
          type: string
      required:
        - id
        - name
        - username

    Workspace:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        owner:
          type: string
        domain:
          type: string
      required:
        - id
        - name
        - owner

    WorkspaceInvite:
      type: object
      properties:
        workspace_id:
          type: string
        email:
          type: string
        is_admin:
          type: boolean
        operator:
          type: boolean
      required:
        - workspace_id
        - email
        - is_admin
        - operator

    GlobalUserInfo:
      type: object
      properties:
        email:
          type: string
        login_type:
          type: string
          enum: ["password", "github"]
        super_admin:
          type: boolean
        verified:
          type: boolean
        name:
          type: string
        company:
          type: string

      required:
        - email
        - login_type
        - super_admin
        - verified

    Flow:
      allOf:
        - $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"
        - $ref: "#/components/schemas/FlowMetadata"

    FlowMetadata:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        edited_by:
          type: string
        edited_at:
          type: string
          format: date-time
        archived:
          type: boolean
        extra_perms:
          type: object
        additionalProperties:
          type: boolean
        starred:
          type: boolean
        draft_only:
          type: boolean
        tag:
          type: string
        ws_error_handler_muted:
          type: boolean
        priority:
          type: integer
      required:
        - path
        - edited_by
        - edited_at
        - archived
        - extra_perms

    OpenFlowWPath:
      allOf:
        - $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"
        - type: object
          properties:
            path:
              type: string
            tag:
              type: string
            ws_error_handler_muted:
              type: boolean
            priority:
              type: integer
          required:
            - path

    FlowPreview:
      type: object
      properties:
        value:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
        path:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        tag:
          type: string
        restarted_from:
          $ref: "#/components/schemas/RestartedFrom"

      required:
        - value
        - content
        - args

    RestartedFrom:
      type: object
      properties:
        flow_job_id:
          type: string
          format: uuid
        step_id:
          type: string
        branch_or_iteration_n:
          type: integer

    Policy:
      type: object
      properties:
        triggerables:
          type: object
          additionalProperties:
            type: object
        execution_mode:
          type: string
          enum: [viewer, publisher, anonymous]
        on_behalf_of:
          type: string
        on_behalf_of_email:
          type: string

    ListableApp:
      type: object
      properties:
        id:
          type: integer
        workspace_id:
          type: string
        path:
          type: string
        summary:
          type: string
        version:
          type: integer
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        starred:
          type: boolean
        edited_at:
          type: string
          format: date-time
        execution_mode:
          type: string
          enum: [viewer, publisher, anonymous]
      required:
        - id
        - workspace_id
        - path
        - summary
        - version
        - extra_perms
        - edited_at
        - execution_mode

    ListableRawApp:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        summary:
          type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        starred:
          type: boolean
        version:
          type: number
        edited_at:
          type: string
          format: date-time
      required:
        - workspace_id
        - path
        - summary
        - extra_perms
        - version
        - edited_at

    AppWithLastVersion:
      type: object
      properties:
        id:
          type: integer
        workspace_id:
          type: string
        path:
          type: string
        summary:
          type: string
        versions:
          type: array
          items:
            type: integer
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        value: {}
        policy:
          $ref: "#/components/schemas/Policy"
        execution_mode:
          type: string
          enum: [viewer, publisher, anonymous]
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
      required:
        - id
        - workspace_id
        - path
        - summary
        - versions
        - created_by
        - created_at
        - value
        - policy
        - execution_mode
        - extra_perms

    AppWithLastVersionWDraft:
      allOf:
        - $ref: "#/components/schemas/AppWithLastVersion"
        - type: object
          properties:
            draft_only:
              type: boolean
            draft: {}

    SlackToken:
      type: object
      properties:
        access_token:
          type: string
        team_id:
          type: string
        team_name:
          type: string
        bot:
          type: object
          properties:
            bot_access_token:
              type: string
      required:
        - access_token
        - team_id
        - team_name
        - bot

    TokenResponse:
      type: object
      properties:
        access_token:
          type: string
        expires_in:
          type: integer
        refresh_token:
          type: string
        scope:
          type: array
          items:
            type: string

      required:
        - access_token

    HubScriptKind:
      name: kind
      schema:
        type: string
        enum: [script, failure, trigger, approval]
