{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.invalid/gcr/language-sidecar/v1",
  "oneOf": [
    {"$ref": "#/$defs/readyRequest"},
    {"$ref": "#/$defs/readyResponse"},
    {"$ref": "#/$defs/analyzeRequest"},
    {"$ref": "#/$defs/result"},
    {"$ref": "#/$defs/cancelRequest"},
    {"$ref": "#/$defs/cancelled"},
    {"$ref": "#/$defs/error"}
  ],
  "$defs": {
    "base": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"},
        "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"}
      },
      "required": ["protocol", "version", "request_id"]
    },
    "readyRequest": {
      "allOf": [{"$ref": "#/$defs/base"}],
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "ready"}
      },
      "required": ["protocol", "version", "request_id", "operation"],
      "additionalProperties": false
    },
    "readyResponse": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "ready_result"},
        "supported_versions": {
          "type": "array", "items": {"type": "number", "multipleOf": 1, "minimum": 1, "maximum": 2147483647},
          "minItems": 1, "maxItems": 16,
          "uniqueItems": true
        },
        "runtime_id": {"type": "string", "pattern": "^[a-z][a-z0-9_-]{0,63}(?![\\s\\S])"},
        "state": {"const": "ready"}
      },
      "required": ["protocol", "version", "request_id", "operation", "supported_versions", "runtime_id", "state"],
      "additionalProperties": false
    },
    "file": {
      "type": "object",
      "properties": {
        "path": {"type": "string", "minLength": 1, "maxLength": 4073},
        "source_base64url": {"type": "string", "pattern": "^[A-Za-z0-9_-]*(?![\\s\\S])"},
        "changed_lines": {"type": "array", "items": {"type": "integer", "minimum": 1}, "maxItems": 8192}
      },
      "required": ["path", "source_base64url", "changed_lines"],
      "additionalProperties": false
    },
    "analyzeRequest": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "analyze"},
        "remaining_wall_milliseconds": {"type": "integer", "minimum": 1, "maximum": 60000},
        "files": {"type": "array", "items": {"$ref": "#/$defs/file"}, "minItems": 1, "maxItems": 128}
      },
      "required": ["protocol", "version", "request_id", "operation", "remaining_wall_milliseconds", "files"],
      "additionalProperties": false
    },
    "finding": {
      "type": "object",
      "properties": {
        "rule_id": {"type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*(?![\\s\\S])", "minLength": 1, "maxLength": 1024},
        "severity": {"enum": ["error", "warning", "info"]},
        "path": {"type": "string", "minLength": 1, "maxLength": 4073},
        "line": {"type": ["integer", "null"], "minimum": 1},
        "message": {"type": "string", "minLength": 1, "maxLength": 16384}
      },
      "required": ["rule_id", "severity", "path", "line", "message"],
      "additionalProperties": false
    },
    "context": {
      "type": "object",
      "properties": {
        "path": {"type": "string", "minLength": 1, "maxLength": 4073},
        "identifier": {"type": "string", "minLength": 1, "maxLength": 1024},
        "kind": {"type": "string", "pattern": "^[a-z][a-z0-9_.:-]*(?![\\s\\S])", "minLength": 1, "maxLength": 1024},
        "start_line": {"type": "integer", "minimum": 1},
        "end_line": {"type": "integer", "minimum": 1},
        "source_base64url": {"type": "string", "pattern": "^[A-Za-z0-9_-]+(?![\\s\\S])"}
      },
      "required": ["path", "identifier", "kind", "start_line", "end_line", "source_base64url"],
      "additionalProperties": false
    },
    "result": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "result"},
        "findings": {"type": "array", "items": {"$ref": "#/$defs/finding"}, "maxItems": 512},
        "contexts": {"type": "array", "items": {"$ref": "#/$defs/context"}, "maxItems": 256}
      },
      "required": ["protocol", "version", "request_id", "operation", "findings", "contexts"],
      "additionalProperties": false
    },
    "cancelRequest": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "cancel"}
      },
      "required": ["protocol", "version", "request_id", "operation"],
      "additionalProperties": false
    },
    "cancelled": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "cancelled"}
      },
      "required": ["protocol", "version", "request_id", "operation"],
      "additionalProperties": false
    },
    "error": {
      "type": "object",
      "properties": {
        "protocol": {"const": "language-sidecar"}, "version": {"const": 1},
        "request_id": {"type": "string", "pattern": "^[0-9a-f]{32}(?![\\s\\S])"},
        "operation": {"const": "error"},
        "code": {"enum": ["invalid_request", "unsupported_version", "busy", "tool_failed", "unavailable", "cancelled"]}
      },
      "required": ["protocol", "version", "request_id", "operation", "code"],
      "oneOf": [
        {"properties": {"request_id": {"const": "00000000000000000000000000000000"}, "code": {"const": "invalid_request"}}},
        {"properties": {"request_id": {"pattern": "^(?!0{32}(?![\\s\\S]))[0-9a-f]{32}(?![\\s\\S])"}}}
      ],
      "additionalProperties": false
    }
  }
}
