{
  "id": "crabbox",
  "categories": [
    "infrastructure"
  ],
  "doctorContract": {
    "stateMigrations": [
      {
        "id": "crabbox-warm-profile-v3",
        "doctorOnly": true
      }
    ]
  },
  "name": "Crabbox Worker Provider",
  "description": "Cloud worker provider and lease-backed sandbox backend for the Crabbox CLI.",
  "cliCommands": [
    {
      "name": "crabbox",
      "description": "Run model-backed commands and manage Crabbox warm images",
      "hasSubcommands": true
    }
  ],
  "activation": {
    "onStartup": false,
    "onCommands": [
      "crabbox"
    ],
    "onConfigPaths": [
      "plugins.entries.crabbox.config.sandbox"
    ]
  },
  "commandAliases": [
    {
      "name": "crabbox",
      "kind": "cli"
    }
  ],
  "contracts": {
    "workerProviders": [
      "crabbox"
    ],
    "tools": [
      "crabbox"
    ]
  },
  "skills": [
    "./skills"
  ],
  "toolMetadata": {
    "crabbox": {
      "profiles": [
        "coding"
      ]
    }
  },
  "configGroups": [
    {
      "id": "sandbox",
      "title": "Sandbox",
      "order": 10,
      "properties": [
        "sandbox"
      ]
    },
    {
      "id": "warm-images",
      "title": "Warm images",
      "order": 20,
      "properties": [
        "warmImages"
      ]
    }
  ],
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "sandbox": {
        "type": "object",
        "additionalProperties": false,
        "description": "Lease a Crabbox box for tool-call isolation with agents.defaults.sandbox.backend=crabbox. Requires a direct provider with fixed lease IDs.",
        "properties": {
          "provider": {
            "type": "string",
            "minLength": 1,
            "description": "Crabbox provider for sandbox leases; defaults to the configured Crabbox selection."
          },
          "class": {
            "type": "string",
            "minLength": 1,
            "description": "Crabbox machine class for sandbox leases."
          },
          "ttl": {
            "type": "string",
            "pattern": "^\\d+(?:ms|s|m|h)$",
            "description": "Maximum lease lifetime passed to crabbox warmup --ttl."
          },
          "idleTimeout": {
            "type": "string",
            "pattern": "^\\d+(?:ms|s|m|h)$",
            "description": "Idle release passed to crabbox warmup --idle-timeout."
          },
          "binary": {
            "type": "string",
            "minLength": 1,
            "description": "Explicit crabbox executable; defaults to the discovered binary."
          }
        }
      },
      "warmImages": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "refreshAfter": {
            "type": "string",
            "default": "24h",
            "maxLength": 9,
            "pattern": "^(?:[1-9][0-9]*[hd]|(?:[6-9][0-9]|[1-9][0-9]{2,})m)(?![\\s\\S])",
            "description": "Refresh age, at least 1h. Use 1–8 whole digits followed by m, h, or d. Pinned checkpoints are exempt. Requires Gateway restart."
          },
          "retainUnused": {
            "type": "string",
            "default": "14d",
            "maxLength": 9,
            "pattern": "^(?:[1-9][0-9]*d|(?:2[4-9]|[3-9][0-9]|[1-9][0-9]{2,})h|(?:14[4-9][0-9]|1[5-9][0-9]{2}|[2-9][0-9]{3}|[1-9][0-9]{4,})m)(?![\\s\\S])",
            "description": "Unused retention, at least 1d (24h or 1440m). Use 1–8 whole digits followed by m, h, or d. Pinned checkpoints are exempt. Requires Gateway restart."
          },
          "keepPrevious": {
            "type": "integer",
            "enum": [
              0,
              1
            ],
            "default": 0,
            "description": "Retain one previous checkpoint generation for rollback. Pinned predecessors are always retained. Requires Gateway restart."
          }
        }
      }
    }
  }
}
