{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/runloop-ai/main/json-schema/runloop-launch-parameters-schema.json",
  "title": "Runloop Launch Parameters",
  "description": "LaunchParameters enable you to customize the resources available to your Devbox as well as the environment set up that should be completed before the Devbox is marked as 'running'.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "launch_commands": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "nullable": true,
      "description": "Set of commands to be run at launch time, before the entrypoint process is run."
    },
    "resource_size_request": {
      "$ref": "#/$defs/ResourceSize",
      "nullable": true,
      "description": "Preset Devbox resources (vCPU, RAM in GiB, ephemeral disk in GiB). If not set, SMALL is used. X_SMALL: 0.5 vCPU, 1 GiB RAM, 4 GiB disk. SMALL: 1 vCPU, 2 GiB RAM, 4 GiB disk. MEDIUM: 2 vCPU, 4 GiB RAM, 8 GiB disk. LARGE: 2 vCPU, 8 GiB RAM, 16 GiB disk. X_LARGE: 4 vCPU, 16 GiB RAM, 16 GiB disk. XX_LARGE: 8 vCPU, 32 GiB RAM, 16 GiB disk. CUSTOM_SIZE: set custom_cpu_cores, custom_gb_memory, and optionally custom_disk_size."
    },
    "available_ports": {
      "type": "array",
      "items": {
        "type": "integer",
        "format": "int32"
      },
      "nullable": true,
      "description": "[Deprecated] A list of ports to make available on the Devbox. This field is ignored."
    },
    "keep_alive_time_seconds": {
      "type": "integer",
      "format": "int64",
      "nullable": true,
      "description": "Time in seconds after which Devbox will automatically shutdown. Default is 1 hour. Maximum is 48 hours (172800 seconds)."
    },
    "after_idle": {
      "$ref": "#/$defs/IdleConfigurationParameters",
      "nullable": true,
      "description": "Configure Devbox lifecycle based on idle activity. If after_idle is set, Devbox will ignore keep_alive_time_seconds. If both after_idle and lifecycle.after_idle are set, they must have the same value. Use lifecycle.after_idle instead."
    },
    "custom_cpu_cores": {
      "type": "integer",
      "format": "int32",
      "nullable": true,
      "description": "Custom CPU cores. Must be 0.5, 1, or a multiple of 2. Max is 16."
    },
    "custom_gb_memory": {
      "type": "integer",
      "format": "int32",
      "nullable": true,
      "description": "Custom memory size in GiB. Must be 1 or a multiple of 2. Max is 64GiB."
    },
    "custom_disk_size": {
      "type": "integer",
      "format": "int32",
      "nullable": true,
      "description": "Custom disk size in GiB. Must be a multiple of 2. Min is 2GiB, max is 64GiB."
    },
    "architecture": {
      "$ref": "#/$defs/Architecture",
      "nullable": true,
      "description": "The target architecture for the Devbox. If unset, defaults to x86_64."
    },
    "user_parameters": {
      "$ref": "#/$defs/UserParameters",
      "nullable": true,
      "description": "Specify the user for execution on Devbox. If not set, default `user` will be used."
    },
    "required_services": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "nullable": true,
      "description": "A list of ContainerizedService names to be started when a Devbox is created. A valid ContainerizedService must be specified in Blueprint to be started."
    },
    "network_policy_id": {
      "type": "string",
      "nullable": true,
      "description": "(Optional) ID of the network policy to apply to Devboxes launched with these parameters. When set on a Blueprint launch parameters, Devboxes created from it will inherit this policy unless explicitly overridden."
    },
    "lifecycle": {
      "$ref": "#/$defs/LifecycleConfigurationParameters",
      "nullable": true,
      "description": "Lifecycle configuration for idle and resume behavior. Configure idle policy via lifecycle.after_idle (if both this and the top-level after_idle are set, they must match) and resume triggers via lifecycle.resume_triggers."
    }
  },
  "$defs": {
    "ResourceSize": {
      "type": "string",
      "enum": [
        "X_SMALL",
        "SMALL",
        "MEDIUM",
        "LARGE",
        "X_LARGE",
        "XX_LARGE",
        "CUSTOM_SIZE"
      ],
      "description": "The size of the Devbox resources for Runloop to allocate.\n\nX_SMALL: 0.5 cpu x 1GiB memory x 4GiB disk\nSMALL: 1 cpu x 2GiB memory x 4GiB disk\nMEDIUM: 2 cpu x 4GiB memory x 8GiB disk\nLARGE: 2 cpu x 8GiB memory x 16GiB disk\nX_LARGE: 4 cpu x 16GiB memory x 16GiB disk\nXX_LARGE: 8 cpu x 32GiB memory x 16GiB disk\nCUSTOM_SIZE: To choose a custom size, set this enum and also the custom_cpu_cores, custom_gb_memory, and optionally custom_disk_size in launch parameters. CPU must be 0.5, 1, or a multiple of 2 (max 16). Memory must be 1 or a multiple of 2 (max 64GiB). Disk must be a multiple of 2 (min 2GiB, max 64GiB). The cpu:memory ratio must be between 1:2 and 1:8 inclusive.\n",
      "x-enum-descriptions": {
        "X_SMALL": "0.5 cpu x 1GiB memory x 4GiB disk",
        "SMALL": "1 cpu x 2GiB memory x 4GiB disk",
        "MEDIUM": "2 cpu x 4GiB memory x 8GiB disk",
        "LARGE": "2 cpu x 8GiB memory x 16GiB disk",
        "X_LARGE": "4 cpu x 16GiB memory x 16GiB disk",
        "XX_LARGE": "8 cpu x 32GiB memory x 16GiB disk",
        "CUSTOM_SIZE": "To choose a custom size, set this enum and also the custom_cpu_cores, custom_gb_memory, and optionally custom_disk_size in launch parameters. CPU must be 0.5, 1, or a multiple of 2 (max 16). Memory must be 1 or a multiple of 2 (max 64GiB). Disk must be a multiple of 2 (min 2GiB, max 64GiB). The cpu:memory ratio must be between 1:2 and 1:8 inclusive."
      }
    },
    "IdleAction": {
      "type": "string",
      "enum": [
        "shutdown",
        "suspend"
      ],
      "description": "Action to take after Devbox idle timer is triggered.\n\nshutdown: Shutdown the Devbox.\nsuspend: Suspend the Devbox.\n",
      "x-enum-descriptions": {
        "shutdown": "Shutdown the Devbox.",
        "suspend": "Suspend the Devbox."
      }
    },
    "IdleConfigurationParameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "idle_time_seconds": {
          "type": "integer",
          "format": "int32",
          "description": "After idle_time_seconds, on_idle action will be taken."
        },
        "on_idle": {
          "$ref": "#/$defs/IdleAction",
          "description": "Action to take after Devbox becomes idle."
        }
      },
      "required": [
        "idle_time_seconds",
        "on_idle"
      ]
    },
    "Architecture": {
      "type": "string",
      "enum": [
        "x86_64",
        "arm64"
      ]
    },
    "UserParameters": {
      "type": "object",
      "additionalProperties": false,
      "description": "Configuration for the Linux user in the Devbox environment.",
      "properties": {
        "username": {
          "type": "string",
          "description": "Username for the Linux user."
        },
        "uid": {
          "type": "integer",
          "format": "int32",
          "description": "User ID (UID) for the Linux user. Must be a non-negative integer."
        }
      },
      "required": [
        "username",
        "uid"
      ]
    },
    "ResumeTriggers": {
      "type": "object",
      "additionalProperties": false,
      "description": "Triggers that can resume a suspended Devbox.",
      "properties": {
        "http": {
          "type": "boolean",
          "nullable": true,
          "description": "When true, HTTP traffic to a suspended Devbox via tunnel will trigger a resume."
        },
        "axon_event": {
          "type": "boolean",
          "nullable": true,
          "description": "When true, axon events targeting a suspended Devbox will trigger a resume."
        }
      }
    },
    "LifecycleConfigurationParameters": {
      "type": "object",
      "additionalProperties": false,
      "description": "Lifecycle configuration for Devbox idle and resume behavior. Configure idle policy via after_idle and resume triggers via resume_triggers.",
      "properties": {
        "after_idle": {
          "$ref": "#/$defs/IdleConfigurationParameters",
          "nullable": true,
          "description": "Configure Devbox lifecycle based on idle activity. If both this and the top-level after_idle are set, they must have the same value. Prefer this field for new integrations."
        },
        "resume_triggers": {
          "$ref": "#/$defs/ResumeTriggers",
          "nullable": true,
          "description": "Triggers that can resume a suspended Devbox."
        }
      }
    }
  }
}