{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://github.com/andrewhuot/headless-chat-sdk/schemas/governance.schema.json",
  "title": "DataGovernance",
  "description": "Data-governance lifecycle shapes for the headless chat SDK. Mirrors packages/gecx-chat/src/governance/types.ts.",
  "definitions": {
    "ConsentPosture": {
      "type": "string",
      "enum": ["none", "functional", "analytics", "all"]
    },
    "ConsentWithdrawnPolicy": {
      "type": "string",
      "enum": ["noop", "clear_only", "clear_and_block"]
    },
    "RetentionMode": {
      "type": "string",
      "enum": ["session", "ttl", "forever"]
    },
    "AudioRetentionMode": {
      "type": "string",
      "enum": ["ephemeral", "session", "ttl"]
    },
    "ConsentFlag": {
      "type": "string",
      "enum": [
        "voice_recording",
        "microphone_capture",
        "camera_capture",
        "screen_capture",
        "geolocation_capture",
        "computer_use"
      ]
    },
    "ComputerUseActionType": {
      "type": "string",
      "enum": [
        "navigate",
        "click",
        "type",
        "select",
        "scroll",
        "wait",
        "submit_form",
        "download",
        "navigate_external"
      ]
    },
    "ComputerUseActionRiskLevel": {
      "type": "string",
      "enum": ["low", "medium", "high"]
    },
    "ComputerUsePolicy": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "enabled": { "type": "boolean" },
        "allowlist": { "type": "array", "items": { "type": "string" } },
        "maxDurationMs": { "type": "integer", "minimum": 1000 },
        "maxActionsPerSession": { "type": "integer", "minimum": 1 },
        "highRiskActions": {
          "type": "array",
          "items": { "$ref": "#/definitions/ComputerUseActionType" }
        },
        "killSwitch": { "type": "boolean" }
      }
    },
    "ConsentPolicy": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "initial": { "$ref": "#/definitions/ConsentPosture" },
        "onWithdrawn": { "$ref": "#/definitions/ConsentWithdrawnPolicy" },
        "flags": {
          "type": "array",
          "items": { "$ref": "#/definitions/ConsentFlag" }
        }
      }
    },
    "RetentionPolicy": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "mode": { "$ref": "#/definitions/RetentionMode" },
        "sessionTtlMs": { "type": "integer", "minimum": 0 },
        "historyTtlMs": { "type": "integer", "minimum": 0 },
        "purgeOnConsentWithdrawn": { "type": "boolean" },
        "audio": { "$ref": "#/definitions/AudioRetentionMode" },
        "audioTtlMs": { "type": "integer", "minimum": 0 }
      }
    },
    "DataGovernancePolicy": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "retention": { "$ref": "#/definitions/RetentionPolicy" },
        "consent": { "$ref": "#/definitions/ConsentPolicy" },
        "computerUse": { "$ref": "#/definitions/ComputerUsePolicy" },
        "requireServerAck": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "delete": { "type": "boolean" },
            "forget": { "type": "boolean" }
          }
        },
        "export": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "localFallback": { "type": "boolean" }
          }
        },
        "audit": { "description": "Function: (event: GovernanceAuditEvent) => void" }
      }
    },
    "ExportBundle": {
      "type": "object",
      "required": ["version", "sessionId", "exportedAt", "source", "messages", "metadata", "serverAcknowledged"],
      "properties": {
        "version": { "const": "1" },
        "sessionId": { "type": "string" },
        "exportedAt": { "type": "string", "format": "date-time" },
        "source": { "type": "string", "enum": ["server", "local", "merged"] },
        "messages": {
          "type": "array",
          "items": { "$ref": "messages.schema.json#/definitions/ChatMessage" }
        },
        "metadata": { "type": "object" },
        "serverAcknowledged": { "type": "boolean" },
        "localCleared": { "type": "boolean" }
      }
    },
    "GovernanceAuditKind": {
      "type": "string",
      "enum": [
        "governance.delete_requested",
        "governance.delete_completed",
        "governance.delete_failed",
        "governance.export_requested",
        "governance.export_completed",
        "governance.export_failed",
        "governance.forget_requested",
        "governance.forget_completed",
        "governance.forget_failed",
        "governance.consent_changed",
        "governance.local_state_cleared",
        "governance.retention_purged",
        "governance.voice_session_started",
        "governance.voice_session_ended",
        "governance.voice_recording_consent_granted",
        "governance.voice_recording_consent_withdrawn",
        "governance.device_capture_consent_granted",
        "governance.device_capture_consent_withdrawn",
        "governance.computer_use.session_requested",
        "governance.computer_use.session_started",
        "governance.computer_use.session_ended",
        "governance.computer_use.action",
        "governance.computer_use.allowlist_violation",
        "governance.computer_use.high_risk_approval_requested",
        "governance.computer_use.high_risk_approval_granted",
        "governance.computer_use.high_risk_approval_denied",
        "governance.computer_use.killed"
      ]
    },
    "GovernanceAuditEvent": {
      "type": "object",
      "required": ["kind", "timestamp", "actor"],
      "properties": {
        "kind": { "$ref": "#/definitions/GovernanceAuditKind" },
        "timestamp": { "type": "string", "format": "date-time" },
        "actor": { "const": "sdk" },
        "sessionId": { "type": "string" },
        "userId": { "type": "string" },
        "details": { "type": "object" }
      }
    },
    "DeleteResult": {
      "type": "object",
      "required": ["sessionId", "serverAcknowledged", "localCleared", "deletedAt"],
      "properties": {
        "sessionId": { "type": "string" },
        "serverAcknowledged": { "type": "boolean" },
        "localCleared": { "type": "boolean" },
        "deletedAt": { "type": "string", "format": "date-time" },
        "reason": { "type": "string" }
      }
    },
    "ForgetResult": {
      "type": "object",
      "required": ["userId", "serverAcknowledged", "localCleared", "forgottenAt", "sessionsCleared"],
      "properties": {
        "userId": { "type": "string" },
        "serverAcknowledged": { "type": "boolean" },
        "localCleared": { "type": "boolean" },
        "forgottenAt": { "type": "string", "format": "date-time" },
        "sessionsCleared": { "type": "array", "items": { "type": "string" } }
      }
    },
    "PurgeResult": {
      "type": "object",
      "required": ["keysRemoved", "purgedAt"],
      "properties": {
        "keysRemoved": { "type": "integer", "minimum": 0 },
        "purgedAt": { "type": "string", "format": "date-time" }
      }
    }
  }
}
