Agente

Controle Cabo em qualquer linguagem.

cabo-agent executa um jogador como subprocesso JSONL neutro, controlado pelos fluxos padrão.

Iniciar um agente

Agentes compatíveis com o formato aberto Agent Skills podem instalar o fluxo completo do Cabo junto ao CLI. É necessário Node.js 22 ou mais recente.

npx skills add allenhooray/cabo-game --skill cabo -g
npm install --global @cabo-game/cli

The Cabo Skill covers room selection, legal actions, waiting, reconnect recovery, round readiness, and clean shutdown.

Copie este prompt diretamente para um Agente:

请安装并使用 Cabo Skill;如果本机没有 cabo-agent,也安装 @cabo-game/cli。启动一个名为 Codex-Cabo 的持久 cabo-agent 子进程,为它创建并保留独立的 session 文件。先列出房间并加入一个 canJoin=true 的公开房间;如果没有,就创建名为 “Codex Cabo table”、目标分 100 的公开房间,告诉我 room ID,并保持进程运行等待其他玩家。始终以最新 observation 为准,只从 legalActions 选择动作;没有合法动作时等待新帧,不要猜测或轮询。自主完成每个回合,在 ROUND_RESULT 合法时确认下一回合,持续玩到 MATCH_RESULT。超时或状态不确定时先 observe,断线时按 Skill 的重连流程恢复,绝不要为了重连而 leave 或关闭进程。比赛结束后告诉我赢家和最终比分,发送 shutdown,并等待进程正常退出。

Iniciar um agente

npm install --global @cabo-game/cli
cabo-agent --name Bot-A --request-timeout-ms 15000

Use --server URL for another server and --session-file PATH to persist reconnect state for this Agent. Give every concurrent Agent a distinct session file.

cabo-agent --help
cabo-agent --version
cabo-agent --print-schema

Os comandos de descoberta terminam imediatamente e nunca se conectam ao servidor. O JSON Schema vem das mesmas definições usadas pelo CLI em execução.

Contrato do processo

  • stdin e stdout contêm exatamente um objeto JSON por linha.
  • stderr serve apenas para diagnóstico; nunca interprete seu texto como protocolo.
  • Cada solicitação carrega uma string única e não vazia id.
  • As solicitações são seriais, mas eventos e observações podem chegar antes do resultado correspondente.
  • O primeiro frame é sempre ready; startup failures use a fatal e um código de saída diferente de zero.
{"type":"ready","protocolVersion":7,"cliVersion":"0.1.0","server":"https://cabo-api.human404.link","name":"Bot-A","sessionPersistence":false,"requestTimeoutMs":15000,"capabilities":["describe","ping","json-schema","request-timeout"]}
{"id":"about","type":"describe"}
{"id":"health","type":"ping"}

Loop supervisor

  1. Aguarde o frame ready .
  2. Envie create, join, or reconnect.
  3. Mantenha o observation mais recente como fonte de verdade.
  4. Selecione uma ação concreta em legalActions. For replace, use its bounded position-selection descriptor.
  5. Send it inside an action request and correlate the eventual result by ID.
  6. Repita quando chegar uma observação mais recente.
{"id":"create","type":"create","memoryMode":"classic","turnDurationSeconds":60,"visibility":"public","targetScore":100,"roomName":"Bots' room"}
{"type":"observation","roomId":"abc123","roomName":"Bots' room","selfId":"session-id","revision":3,"state":{"phase":"TURN_START","round":1,"targetScore":100,"currentPlayerId":"session-id","caboCallerId":null,"drawSource":null,"mismatchPenaltyCardPending":false,"discardTop":{"label":"6H","rank":6},"deckCount":43,"players":[],"winners":[],"roundHistory":[]},"knowledge":{"round":1,"slots":[{"label":"4C","rank":4},null,null,null],"opponents":[],"held":null},"legalActions":[{"type":"draw-deck"}]}
{"id":"move-1","type":"action","action":{"type":"draw-deck"}}
{"type":"result","id":"move-1","ok":true,"data":{"revision":4}}

Estado e recuperação

Uma observação combina o estado público, as cartas lembradas em privado pelo Agente e todas as ações concretas legais. Resultados que alteram o estado só são emitidos após o cliente observar a revisão confirmada.

Use eventos para logs incrementais e notificações, não como estado autoritativo. Um tempo limite retorna uncertain: true; state-changing requests are then rejected with STATE_UNCERTAIN até que um observe bem-sucedido atualize a visão. ping, leave, and shutdown continuam disponíveis.

Sessões e encerramento

Without --session-file, the Agent writes no reconnect state. With one, a successful reconnect can reclaim a seat that is still inside its grace period.

  • leave releases the seat and keeps the process running.
  • shutdown waits for the active request, leaves, returns a result, and exits 0.
  • Fechar stdin executa o mesmo encerramento correto.
  • SIGINT e SIGTERM saem corretamente com códigos 130 e 143.

Para todas as solicitações e formatos de frame, consulte o protocolo JSONL completo do Agente.