{
  "description": "Reference responses for the capabilities endpoint the host queries at stage 2. The endpoint does not exist yet - defining it is OpenHands/automation#262. Field names here are the contract that setup.requires.features, the trigger kinds in setup.form.triggers, and the cron and timezone field types are written against.",
  "endpoint": {
    "method": "GET",
    "path": "/v1/capabilities"
  },
  "responses": {
    "supported": {
      "description": "A deployment that is publicly reachable and can run every archetype.",
      "status": 200,
      "body": {
        "ready": true,
        "triggerKinds": ["cron", "event"],
        "eventSources": ["github"],
        "eventTypes": [
          "issue_comment.created",
          "pull_request.opened",
          "pull_request.labeled",
          "pull_request_review_comment.created",
          "push"
        ],
        "triggers": {
          "cron": {
            "minIntervalSeconds": 300,
            "timezones": [
              "UTC",
              "America/Los_Angeles",
              "America/New_York",
              "Asia/Tokyo",
              "Europe/London"
            ]
          },
          "event": {
            "filterLanguage": "jmespath",
            "filterFunctions": [
              "contains",
              "ends_with",
              "glob",
              "icontains",
              "lower",
              "regex",
              "starts_with",
              "upper"
            ]
          }
        },
        "features": [
          "conversationDispatch",
          "customTarball",
          "mcpTools",
          "presetPlugin",
          "presetPrompt",
          "repoClone",
          "webhookDelivery"
        ]
      }
    },
    "cronOnly": {
      "description": "A deployment that is not reachable from the public internet, so external services cannot deliver webhooks to it. Scheduled polling is the documented alternative - see skills/openhands-automation/SKILL.md.",
      "status": 200,
      "body": {
        "ready": true,
        "triggerKinds": ["cron"],
        "eventSources": [],
        "eventTypes": [],
        "triggers": {
          "cron": {
            "minIntervalSeconds": 300,
            "timezones": ["UTC"]
          }
        },
        "features": [
          "conversationDispatch",
          "customTarball",
          "mcpTools",
          "presetPrompt",
          "repoClone"
        ]
      }
    },
    "noCustomTarball": {
      "description": "A ready deployment running a service that predates bundle support, so it can run a preset but not a tarball the client supplies. An entry whose setup ships a bundle is blocked here even though every trigger kind it needs is available.",
      "status": 200,
      "body": {
        "ready": true,
        "triggerKinds": ["cron", "event"],
        "eventSources": ["github"],
        "eventTypes": ["pull_request.labeled"],
        "triggers": {
          "cron": {
            "minIntervalSeconds": 300,
            "timezones": ["UTC"]
          },
          "event": {
            "filterLanguage": "jmespath",
            "filterFunctions": ["contains", "icontains"]
          }
        },
        "features": [
          "conversationDispatch",
          "mcpTools",
          "presetPlugin",
          "presetPrompt",
          "repoClone",
          "webhookDelivery"
        ]
      }
    },
    "notReady": {
      "description": "The automation service is reachable but not accepting work. It offers no features and no trigger kinds, so every setup block is blocked.",
      "status": 200,
      "body": {
        "ready": false,
        "triggerKinds": [],
        "eventSources": [],
        "eventTypes": [],
        "triggers": {},
        "features": []
      }
    }
  }
}
