{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://github.com/andrewhuot/headless-chat-sdk/schemas/permissions.schema.json",
  "title": "Permissions",
  "description": "Cross-platform device-permission shapes for the headless chat SDK. Mirrors packages/gecx-chat/src/permissions/types.ts.",
  "definitions": {
    "MediaCapability": {
      "type": "string",
      "enum": ["microphone", "camera", "screen", "geolocation"]
    },
    "PermissionStatus": {
      "type": "string",
      "enum": ["unknown", "prompt", "granted", "denied", "blocked", "unsupported"]
    },
    "PermissionDenialReason": {
      "type": "string",
      "enum": [
        "user_denied",
        "system_blocked",
        "hardware_unavailable",
        "timeout",
        "aborted",
        "insecure_context",
        "unsupported"
      ]
    },
    "PermissionRequestConstraints": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "audio": {},
        "video": {},
        "screen": { "type": "object" },
        "geolocation": { "type": "object" }
      }
    },
    "PermissionRequest": {
      "type": "object",
      "required": ["capability"],
      "additionalProperties": false,
      "properties": {
        "capability": { "$ref": "#/definitions/MediaCapability" },
        "constraints": { "$ref": "#/definitions/PermissionRequestConstraints" },
        "rationale": { "type": "string" },
        "passive": { "type": "boolean" }
      }
    },
    "PermissionResult": {
      "type": "object",
      "required": ["capability", "status"],
      "additionalProperties": false,
      "properties": {
        "capability": { "$ref": "#/definitions/MediaCapability" },
        "status": { "$ref": "#/definitions/PermissionStatus" },
        "reason": { "$ref": "#/definitions/PermissionDenialReason" },
        "grantedAt": { "type": "string", "format": "date-time" }
      }
    },
    "PermissionSnapshot": {
      "type": "object",
      "required": ["microphone", "camera", "screen", "geolocation"],
      "additionalProperties": false,
      "properties": {
        "microphone": { "$ref": "#/definitions/PermissionStatus" },
        "camera": { "$ref": "#/definitions/PermissionStatus" },
        "screen": { "$ref": "#/definitions/PermissionStatus" },
        "geolocation": { "$ref": "#/definitions/PermissionStatus" }
      }
    },
    "PermissionEventKind": {
      "type": "string",
      "enum": [
        "permission.requested",
        "permission.resolved",
        "permission.revoked",
        "permission.snapshot_changed"
      ]
    },
    "PermissionEvent": {
      "type": "object",
      "required": ["kind", "timestamp"],
      "additionalProperties": false,
      "properties": {
        "kind": { "$ref": "#/definitions/PermissionEventKind" },
        "timestamp": { "type": "string", "format": "date-time" },
        "capability": { "$ref": "#/definitions/MediaCapability" },
        "status": { "$ref": "#/definitions/PermissionStatus" },
        "reason": { "$ref": "#/definitions/PermissionDenialReason" },
        "rationale": { "type": "string" },
        "providerId": { "type": "string" },
        "snapshot": { "$ref": "#/definitions/PermissionSnapshot" }
      }
    }
  }
}
