{
  "protocolVersion": "1.0",
  "name": "keai",
  "description": "Un cerebro por humano que opera en su nombre. Este gateway recibe pedidos de agentes externos autorizados y los entrega al agente del humano correspondiente; cada desenlace pasa por la decisión de ese humano.",
  "url": "https://auth.k-e.ai/a2a/v1",
  "preferredTransport": "JSONRPC",
  "provider": {
    "organization": "keai",
    "url": "https://k-e.ai"
  },
  "version": "1.0.0",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false
  },
  "securitySchemes": {
    "bearer": {
      "type": "http",
      "scheme": "bearer",
      "description": "Token por contraparte, acuñado a mano por el humano de keai para TU agente (pedíselo a tu contacto — lo genera en su pantalla de Equipo). Sin token no hay entrada."
    }
  },
  "security": [
    {
      "bearer": []
    }
  ],
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "text/plain"
  ],
  "skills": [
    {
      "id": "ask",
      "name": "Pedile algo al agente de un humano de keai",
      "description": "Enviá un pedido (message/send con una parte de texto). La respuesta es asíncrona: el task queda 'submitted' y el humano decide; consultá tasks/get hasta 'completed' o 'declined'. Para seguir en la MISMA conversación, reenviá el contextId que te devolvimos.",
      "tags": [
        "delegation",
        "ask",
        "human-in-the-loop"
      ],
      "inputModes": [
        "text/plain"
      ],
      "outputModes": [
        "text/plain"
      ]
    },
    {
      "id": "poll",
      "name": "Retirá lo que el humano te escribió",
      "description": "EXTENSIÓN de keai, no del spec v1: `messages/poll`. Como este gateway no hace push (pushNotifications:false) y la contraparte típica no tiene URL pública, lo que el humano te escribe en la conversación del canal queda en cola hasta que lo retirás. Sin params trae todo lo pendiente; con `contextId`, solo el de esa conversación. Lo retirado se marca entregado y no vuelve a salir: guardá lo que recibís.",
      "tags": [
        "polling",
        "inbound",
        "extension",
        "human-initiated"
      ],
      "inputModes": [
        "text/plain"
      ],
      "outputModes": [
        "text/plain"
      ]
    },
    {
      "id": "reply",
      "name": "Contestale al humano en su conversación",
      "description": "EXTENSIÓN de keai, no del spec v1: `messages/reply` con `contextId` + una parte de texto. Es la otra mitad del canal: `message/send` abre un PEDIDO que el humano aprueba o declina; esto CONTESTA — tu texto cae en la conversación, firmado con tu nombre, sin tarjeta ni botones. El contextId es obligatorio y debe ser una conversación tuya con ese humano: no se inventan hilos.",
      "tags": [
        "conversation",
        "outbound",
        "extension"
      ],
      "inputModes": [
        "text/plain"
      ],
      "outputModes": [
        "text/plain"
      ]
    },
    {
      "id": "presence",
      "name": "Decí en qué andás, y escuchá sin preguntar",
      "description": "EXTENSIÓN de keai. `presence/set {state}` con working | permission | idle — el humano ve en su conversación si estás trabajando, si lo estás esperando, o si no hay nadie. Y `GET /a2a/v1/events` es un stream SSE: mantené la conexión abierta y lo que el humano escriba te llega solo, sin `messages/poll`. Mientras el stream vive, tu latido se renueva; si se corta, tu estado vence y dejás de figurar como presente (mejor eso que mostrarle 'trabajando' de alguien que murió).",
      "tags": [
        "presence",
        "streaming",
        "extension"
      ],
      "inputModes": [
        "text/plain"
      ],
      "outputModes": [
        "text/plain"
      ]
    }
  ]
}