← Files Meetings (Beta)ARCHIVED FILE

scripts/companion-control.v2.schema.json

51.5 KB · Oct 8, 2026 · 12:02 UTC

↓ Download file

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.openai.com/chatgpt-meetings/companion-control.v2.schema.json",
  "title": "ChatGPT Meetings companion control protocol v2",
  "description": "Authenticated local companion discovery and transport. Recording, uploads, recovery, background synchronization, and cached-data production remain companion-owned.",
  "x-companion-protocol-version": 2,
  "x-frame-prefix-byte-order": "little-endian",
  "x-frame-prefix-bytes": 4,
  "x-max-frame-bytes": 1048576,
  "x-max-request-ttl-millis": 5000,
  "x-max-client-identities": 64,
  "x-max-cached-responses": 128,
  "x-method-contracts": {
    "companion.initialize": {
      "requestSchemaRef": "#/$defs/InitializeRequest",
      "resultSchemaRef": "#/$defs/InitializeResult",
      "requiredCapabilities": []
    },
    "companion.getState": {
      "requestSchemaRef": "#/$defs/GetStateRequest",
      "resultSchemaRef": "#/$defs/CompanionState",
      "requiredCapabilities": ["recording.control.v2"]
    },
    "client.setContext": {
      "requestSchemaRef": "#/$defs/SetClientContextRequest",
      "resultSchemaRef": "#/$defs/RetryUploadResult",
      "requiredCapabilities": ["client.context.v1"]
    },
    "recording.start": {
      "requestSchemaRef": "#/$defs/StartRecordingRequest",
      "resultSchemaRef": "#/$defs/CompanionState",
      "requiredCapabilities": ["recording.control.v2"],
      "fieldCapabilities": { "calendarContext": "recording.calendar-context.v1" }
    },
    "recording.stop": {
      "requestSchemaRef": "#/$defs/StopRecordingRequest",
      "resultSchemaRef": "#/$defs/StopRecordingResult",
      "requiredCapabilities": ["recording.control.v2"]
    },
    "recording.getUploads": {
      "requestSchemaRef": "#/$defs/GetUploadsRequest",
      "resultSchemaRef": "#/$defs/UploadsResult",
      "requiredCapabilities": ["recording.recovery.v1"]
    },
    "recording.retry": {
      "requestSchemaRef": "#/$defs/RetryUploadRequest",
      "resultSchemaRef": "#/$defs/RetryUploadResult",
      "requiredCapabilities": ["recording.recovery.v1"]
    },
    "permissions.recheck": {
      "requestSchemaRef": "#/$defs/RecheckPermissionsRequest",
      "resultSchemaRef": "#/$defs/CompanionState",
      "requiredCapabilities": ["recording.audio-sources.v1"]
    },
    "permissions.request": {
      "requestSchemaRef": "#/$defs/RequestPermissionRequest",
      "resultSchemaRef": "#/$defs/CompanionState",
      "requiredCapabilities": ["permissions.request.v1"]
    },
    "permissions.openSystemSettings": {
      "requestSchemaRef": "#/$defs/OpenSystemSettingsRequest",
      "resultSchemaRef": "#/$defs/CompanionState",
      "requiredCapabilities": ["permissions.request.v1"]
    },
    "settings.get": {
      "requestSchemaRef": "#/$defs/GetSettingsRequest",
      "resultSchemaRef": "#/$defs/SettingsState",
      "requiredCapabilities": ["settings.v2"],
      "fieldCapabilities": {
        "calendarRemindersEnabled": "settings.reminders.v1",
        "meetingDetectionEnabled": "settings.meeting-detection.v1",
        "soundEffectsEnabled": "settings.sound-effects.v1"
      }
    },
    "settings.update": {
      "requestSchemaRef": "#/$defs/UpdateSettingsRequest",
      "resultSchemaRef": "#/$defs/SettingsState",
      "requiredCapabilities": ["settings.v2"],
      "fieldCapabilities": {
        "calendarRemindersEnabled": "settings.reminders.v1",
        "meetingDetectionEnabled": "settings.meeting-detection.v1",
        "soundEffectsEnabled": "settings.sound-effects.v1"
      }
    },
    "home.getSnapshot": {
      "requestSchemaRef": "#/$defs/GetHomeSnapshotRequest",
      "resultSchemaRef": "#/$defs/HomeSnapshot",
      "requiredCapabilities": ["home.snapshot.v1"]
    },
    "lifecycle.quitForUpdate": {
      "requestSchemaRef": "#/$defs/QuitForUpdateRequest",
      "resultSchemaRef": "#/$defs/QuitForUpdateResult",
      "requiredCapabilities": ["lifecycle.update.v2"]
    }
  },
  "x-notification-contracts": {
    "companion.stateChanged": {
      "notificationSchemaRef": "#/$defs/StateChangedNotification",
      "requiredCapabilities": ["recording.control.v2"]
    },
    "recording.completed": {
      "notificationSchemaRef": "#/$defs/RecordingCompletedNotification",
      "requiredCapabilities": ["recording.control.v2"]
    },
    "workspace.changed": {
      "notificationSchemaRef": "#/$defs/WorkspaceChangedNotification",
      "requiredCapabilities": ["workspace.events.v1"]
    }
  },
  "oneOf": [
    { "$ref": "#/$defs/Descriptor" },
    { "$ref": "#/$defs/Request" },
    { "$ref": "#/$defs/Response" },
    { "$ref": "#/$defs/Notification" }
  ],
  "$defs": {
    "PositiveSafeInteger": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
    "ExecutableIdentity": {
      "type": "object",
      "required": ["path", "sha256"],
      "additionalProperties": false,
      "dependentRequired": { "device": ["inode"], "inode": ["device"] },
      "properties": {
        "path": { "type": "string", "minLength": 1, "maxLength": 4096, "not": { "pattern": "[\\u0000\\r\\n]" } },
        "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
        "device": { "$ref": "#/$defs/PositiveSafeInteger" },
        "inode": { "$ref": "#/$defs/PositiveSafeInteger" },
        "processStartedAtMillis": { "$ref": "#/$defs/PositiveSafeInteger" }
      }
    },
    "Descriptor": {
      "type": "object",
      "required": ["protocolVersion", "ownerEpoch", "pid", "platform", "architecture", "transport", "endpoint", "companionVersion", "requestTTLMillis", "maxFrameBytes", "executableIdentity"],
      "additionalProperties": false,
      "properties": {
        "protocolVersion": { "const": 2 },
        "ownerEpoch": { "$ref": "#/$defs/OpaqueIdentifier" },
        "pid": { "type": "integer", "minimum": 1, "maximum": 2147483647 },
        "platform": { "enum": ["macos", "windows"] },
        "architecture": { "enum": ["arm64", "x64", "universal"] },
        "transport": { "enum": ["unix-domain-socket", "windows-named-pipe"] },
        "endpoint": { "type": "string", "minLength": 1, "maxLength": 4096, "not": { "pattern": "[\\u0000\\r\\n]" } },
        "companionVersion": { "type": "string", "minLength": 1, "maxLength": 64 },
        "requestTTLMillis": { "type": "integer", "minimum": 1, "maximum": 5000 },
        "maxFrameBytes": { "const": 1048576 },
        "executableIdentity": { "$ref": "#/$defs/ExecutableIdentity" }
      },
      "allOf": [
        { "if": { "properties": { "platform": { "const": "macos" } } }, "then": { "properties": { "transport": { "const": "unix-domain-socket" } } } },
        { "if": { "properties": { "platform": { "const": "windows" } } }, "then": { "properties": { "transport": { "const": "windows-named-pipe" }, "architecture": { "enum": ["arm64", "x64"] } } } }
      ]
    },
    "ReplayMetadata": {
      "type": "object",
      "required": ["clientId", "ownerEpoch", "sequence", "issuedAtMillis"],
      "additionalProperties": false,
      "properties": {
        "clientId": { "$ref": "#/$defs/OpaqueIdentifier" },
        "ownerEpoch": { "$ref": "#/$defs/OpaqueIdentifier" },
        "sequence": { "$ref": "#/$defs/PositiveSafeInteger" },
        "issuedAtMillis": { "$ref": "#/$defs/PositiveSafeInteger" }
      }
    },
    "OpaqueIdentifier": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "pattern": "^[A-Za-z0-9_-]+$"
    },
    "AccountScopeFingerprint": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "SafeInteger": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "Timestamp": {
      "type": "string",
      "format": "date-time",
      "maxLength": 64
    },
    "Capability": {
      "type": "string",
      "minLength": 3,
      "maxLength": 96,
      "pattern": "^[a-z][a-z0-9.-]*\\.v[1-9][0-9]*$"
    },
    "KnownCapability": {
      "enum": [
        "recording.control.v2",
        "client.context.v1", "meetings.eligibility.v1",
        "recording.calendar-context.v1",
        "recording.audio-sources.v1",
        "recording.recovery.v1",
        "recording.encryption-errors.v1",
        "recording.database-version-errors.v1",
        "permissions.request.v1",
        "settings.v2",
        "settings.reminders.v1",
        "settings.meeting-detection.v1",
        "settings.sound-effects.v1",
        "home.snapshot.v1",
        "home.notes-source.v1",
        "home.note-page-binding.v1",
        "workspace.events.v1",
        "lifecycle.update.v2",
        "lifecycle.bootstrap-recovery.v1"
      ]
    },
    "CapabilityList": {
      "type": "array",
      "items": { "$ref": "#/$defs/Capability" },
      "maxItems": 32,
      "uniqueItems": true
    },
    "JsonRpcRequest": {
      "type": "object",
      "required": ["jsonrpc", "id", "method", "params"],
      "additionalProperties": false,
      "properties": {
        "jsonrpc": { "const": "2.0" },
        "id": { "$ref": "#/$defs/OpaqueIdentifier" },
        "method": { "type": "string", "maxLength": 64 },
        "params": { "type": "object" },
        "meta": { "$ref": "#/$defs/ReplayMetadata" }
      }
    },
    "AuthenticatedRequest": {
      "allOf": [
        { "$ref": "#/$defs/JsonRpcRequest" },
        { "required": ["meta"] }
      ]
    },
    "EmptyParams": {
      "type": "object",
      "maxProperties": 0
    },
    "InitializeRequest": {
      "allOf": [
        { "$ref": "#/$defs/JsonRpcRequest" },
        {
          "not": { "required": ["meta"] },
          "properties": {
            "method": { "const": "companion.initialize" },
            "params": {
              "type": "object",
              "required": ["protocolVersion", "client", "requestedCapabilities"],
              "additionalProperties": false,
              "properties": {
                "protocolVersion": { "const": 2 },
                "client": {
                  "type": "object",
                  "required": ["id", "kind", "version"],
                  "additionalProperties": false,
                  "properties": {
                    "id": { "$ref": "#/$defs/OpaqueIdentifier" },
                    "kind": { "const": "meetings-mcp" },
                    "version": { "type": "string", "minLength": 1, "maxLength": 64 }
                  }
                },
                "requestedCapabilities": { "$ref": "#/$defs/CapabilityList" }
              }
            }
          }
        }
      ]
    },
    "SetClientContextRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "client.setContext" },
            "params": {
              "type": "object",
              "required": ["codexAppVersion"],
              "additionalProperties": false,
              "properties": {
                "codexAppVersion": {
                  "description": "Observed Codex desktop application version, never the CLI or Meetings plugin version. Missing or unknown observations must not be sent or clear a prior observation.",
                  "type": "string",
                  "maxLength": 128,
                  "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-((0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(\\.(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$(?![\\s\\S])"
                }
              }
            }
          }
        }
      ]
    },
    "GetStateRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        { "properties": { "method": { "const": "companion.getState" }, "params": { "$ref": "#/$defs/EmptyParams" } } }
      ]
    },
    "CalendarRecordingContext": {
      "type": "object",
      "additionalProperties": false,
      "required": ["accountScopeFingerprint", "source", "eventId", "occurrenceStart", "title"],
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
        "source": { "const": "google_calendar" },
        "eventId": { "type": "string", "minLength": 1, "maxLength": 512 },
        "occurrenceStart": { "$ref": "#/$defs/Timestamp" },
        "title": { "type": "string", "maxLength": 512 }
      }
    },
    "StartRecordingRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "recording.start" },
            "params": {
              "type": "object",
              "additionalProperties": false,
              "properties": { "calendarContext": { "$ref": "#/$defs/CalendarRecordingContext" } }
            }
          }
        }
      ]
    },
    "StopRecordingRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "recording.stop" },
            "params": {
              "type": "object",
              "required": ["expectedSessionId"],
              "additionalProperties": false,
              "properties": {
                "expectedSessionId": { "$ref": "#/$defs/OpaqueIdentifier" }
              }
            }
          }
        }
      ]
    },
    "RecheckPermissionsRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "permissions.recheck" },
            "params": { "$ref": "#/$defs/EmptyParams" }
          }
        }
      ]
    },
    "RequestPermissionRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "permissions.request" },
            "params": {
              "type": "object",
              "required": ["kind"],
              "additionalProperties": false,
              "properties": {
                "kind": { "enum": ["microphone", "systemAudio"] }
              }
            }
          }
        }
      ]
    },
    "OpenSystemSettingsRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "permissions.openSystemSettings" },
            "params": {
              "type": "object",
              "required": ["kind"],
              "additionalProperties": false,
              "properties": { "kind": { "enum": ["microphone", "systemAudio"] } }
            }
          }
        }
      ]
    },
    "AccountScopeParams": {
      "type": "object",
      "required": ["accountScopeFingerprint"],
      "additionalProperties": false,
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" }
      }
    },
    "UploadRecordingId": {
      "type": "string",
      "pattern": "^recording-[a-f0-9]{64}$"
    },
    "GetUploadsParams": {
      "type": "object",
      "required": ["accountScopeFingerprint"],
      "additionalProperties": false,
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
        "offset": { "$ref": "#/$defs/SafeInteger", "default": 0 }
      }
    },
    "GetUploadsRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        { "properties": { "method": { "const": "recording.getUploads" }, "params": { "$ref": "#/$defs/GetUploadsParams" } } }
      ]
    },
    "RetryUploadParams": {
      "type": "object",
      "required": ["accountScopeFingerprint", "recordingId"],
      "additionalProperties": false,
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
        "recordingId": { "$ref": "#/$defs/UploadRecordingId" }
      }
    },
    "RetryUploadRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        { "properties": { "method": { "const": "recording.retry" }, "params": { "$ref": "#/$defs/RetryUploadParams" } } }
      ]
    },
    "GetSettingsRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        { "properties": { "method": { "const": "settings.get" }, "params": { "$ref": "#/$defs/AccountScopeParams" } } }
      ]
    },
    "SettingsChanges": {
      "type": "object",
      "minProperties": 1,
      "additionalProperties": false,
      "properties": {
        "calendarRemindersEnabled": { "type": "boolean" },
        "meetingDetectionEnabled": { "type": "boolean" },
        "soundEffectsEnabled": { "type": "boolean" }
      }
    },
    "UpdateSettingsRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "settings.update" },
            "params": {
              "type": "object",
              "required": ["accountScopeFingerprint", "changes"],
              "additionalProperties": false,
              "properties": {
                "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
                "changes": { "$ref": "#/$defs/SettingsChanges" }
              }
            }
          }
        }
      ]
    },
    "GetHomeSnapshotRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "home.getSnapshot" },
            "params": {
              "type": "object",
              "required": ["accountScopeFingerprint"],
              "additionalProperties": false,
              "properties": {
                "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
                "notesSource": { "enum": ["meetings", "private-notes"] },
                "includePageBindings": { "type": "boolean" }
              }
            }
          }
        }
      ]
    },
    "BootstrapRecoveryStatus": { "type": "string", "enum": ["restartable", "restarting", "exhausted"] },
    "BootstrapRecovery": {
      "type": "object",
      "required": ["status"],
      "additionalProperties": false,
      "properties": { "status": { "$ref": "#/$defs/BootstrapRecoveryStatus" } }
    },
    "QuitForUpdateReason": { "type": "string", "enum": ["bootstrap-recovery"] },
    "QuitForUpdateRequest": {
      "allOf": [
        { "$ref": "#/$defs/AuthenticatedRequest" },
        {
          "properties": {
            "method": { "const": "lifecycle.quitForUpdate" },
            "params": {
              "type": "object",
              "required": ["expectedOwnerEpoch"],
              "additionalProperties": false,
              "properties": {
                "expectedOwnerEpoch": { "$ref": "#/$defs/OpaqueIdentifier" },
                "reason": { "$ref": "#/$defs/QuitForUpdateReason" }
              }
            }
          }
        }
      ]
    },
    "Request": {
      "oneOf": [
        { "$ref": "#/$defs/InitializeRequest" },
        { "$ref": "#/$defs/SetClientContextRequest" },
        { "$ref": "#/$defs/GetStateRequest" },
        { "$ref": "#/$defs/StartRecordingRequest" },
        { "$ref": "#/$defs/StopRecordingRequest" },
        { "$ref": "#/$defs/GetUploadsRequest" },
        { "$ref": "#/$defs/RetryUploadRequest" },
        { "$ref": "#/$defs/RecheckPermissionsRequest" },
        { "$ref": "#/$defs/RequestPermissionRequest" },
        { "$ref": "#/$defs/OpenSystemSettingsRequest" },
        { "$ref": "#/$defs/GetSettingsRequest" },
        { "$ref": "#/$defs/UpdateSettingsRequest" },
        { "$ref": "#/$defs/GetHomeSnapshotRequest" },
        { "$ref": "#/$defs/QuitForUpdateRequest" }
      ]
    },
    "Permission": {
      "type": "object",
      "required": ["status", "canRequest"],
      "additionalProperties": false,
      "properties": {
        "status": { "enum": ["granted", "promptable", "denied", "unsupported", "unknown"] },
        "canRequest": { "type": "boolean" }
      },
      "if": { "properties": { "status": { "const": "promptable" } } },
      "then": { "properties": { "canRequest": { "const": true } } },
      "else": { "properties": { "canRequest": { "const": false } } }
    },
    "StartControl": {
      "oneOf": [
        {
          "type": "object",
          "required": ["enabled", "disabledReason"],
          "additionalProperties": false,
          "properties": { "enabled": { "const": true }, "disabledReason": { "type": "null" } }
        },
        {
          "type": "object",
          "required": ["enabled", "disabledReason"],
          "additionalProperties": false,
          "properties": {
            "enabled": { "const": false },
            "disabledReason": {
              "enum": ["recording-active", "permission-required", "permission-denied", "companion-unavailable", "recording-unavailable", "update-in-progress"]
            }
          }
        }
      ]
    },
    "StopControl": {
      "type": "object",
      "required": ["enabled"],
      "additionalProperties": false,
      "properties": { "enabled": { "type": "boolean" } }
    },
    "RecordingSession": {
      "type": "object",
      "required": ["id", "startedAt"],
      "additionalProperties": false,
      "properties": {
        "id": { "$ref": "#/$defs/OpaqueIdentifier" },
        "startedAt": { "$ref": "#/$defs/Timestamp" },
        "meetingId": { "$ref": "#/$defs/OpaqueIdentifier" }
      }
    },
    "RecordingNoticeAction": {
      "oneOf": [
        {
          "type": "object",
          "required": ["kind", "permission"],
          "additionalProperties": false,
          "properties": {
            "kind": { "const": "request-permission" },
            "permission": { "enum": ["microphone", "systemAudio"] }
          }
        },
        {
          "type": "object",
          "required": ["kind", "permission"],
          "additionalProperties": false,
          "properties": {
            "kind": { "const": "open-system-settings" },
            "permission": { "enum": ["microphone", "systemAudio"] }
          }
        },
        {
          "type": "object",
          "required": ["kind"],
          "additionalProperties": false,
          "properties": { "kind": { "const": "retry-stop" } }
        },
        {
          "type": "object",
          "required": ["kind"],
          "additionalProperties": false,
          "properties": { "kind": { "const": "recheck-audio" } }
        }
      ]
    },
    "RecordingNotice": {
      "type": "object",
      "required": ["kind", "message", "action"],
      "additionalProperties": false,
      "properties": {
        "kind": { "enum": ["permission-required", "permission-denied", "recording-unavailable", "finalization-failed", "companion-unavailable"] },
        "message": { "type": "string", "minLength": 1, "maxLength": 256 },
        "action": { "anyOf": [{ "$ref": "#/$defs/RecordingNoticeAction" }, { "type": "null" }] }
      },
      "allOf": [
        {
          "if": { "properties": { "kind": { "const": "permission-required" } } },
          "then": {
            "properties": {
              "action": { "type": "object", "properties": { "kind": { "const": "request-permission" } } }
            }
          }
        },
        {
          "if": { "properties": { "kind": { "const": "permission-denied" } } },
          "then": {
            "properties": {
              "action": { "type": "object", "properties": { "kind": { "const": "open-system-settings" } } }
            }
          }
        },
        {
          "if": { "properties": { "kind": { "const": "finalization-failed" } } },
          "then": {
            "properties": {
              "action": { "type": "object", "properties": { "kind": { "const": "retry-stop" } } }
            }
          }
        },
        {
          "if": { "properties": { "kind": { "const": "recording-unavailable" } } },
          "then": { "properties": { "action": { "anyOf": [{ "type": "null" }, { "type": "object", "properties": { "kind": { "const": "recheck-audio" } } }] } } }
        },
        {
          "if": { "properties": { "kind": { "const": "companion-unavailable" } } },
          "then": { "properties": { "action": { "type": "null" } } }
        }
      ]
    },
    "AudioSourceStatus": {
      "type": "string",
      "enum": ["ready", "device-absent", "permission-denied", "permission-required", "unavailable"]
    },
    "AudioSources": {
      "type": "object",
      "required": ["microphone", "systemAudio", "warning"],
      "additionalProperties": false,
      "properties": {
        "microphone": { "$ref": "#/$defs/AudioSourceStatus" },
        "systemAudio": { "$ref": "#/$defs/AudioSourceStatus" },
        "warning": { "anyOf": [{ "type": "string", "minLength": 1, "maxLength": 256 }, { "type": "null" }] }
      }
    },
    "RecordingPresentation": {
      "type": "object",
      "required": ["phase", "session", "controls", "permissions", "notice"],
      "additionalProperties": false,
      "properties": {
        "phase": { "enum": ["idle", "starting", "recording", "stopping", "unavailable"] },
        "session": { "anyOf": [{ "$ref": "#/$defs/RecordingSession" }, { "type": "null" }] },
        "controls": {
          "type": "object",
          "required": ["start", "stop"],
          "additionalProperties": false,
          "properties": {
            "start": { "$ref": "#/$defs/StartControl" },
            "stop": { "$ref": "#/$defs/StopControl" }
          }
        },
        "permissions": {
          "type": "object",
          "required": ["microphone", "systemAudio"],
          "additionalProperties": false,
          "properties": {
            "microphone": { "$ref": "#/$defs/Permission" },
            "systemAudio": { "$ref": "#/$defs/Permission" }
          }
        },
        "notice": { "anyOf": [{ "$ref": "#/$defs/RecordingNotice" }, { "type": "null" }] },
        "audioSources": { "$ref": "#/$defs/AudioSources" }
      },
      "allOf": [
        {
          "if": { "required": ["audioSources"], "properties": { "controls": { "properties": { "start": { "properties": { "enabled": { "const": true } } } } } } },
          "then": { "properties": { "audioSources": { "oneOf": [
            { "properties": { "microphone": { "const": "ready" }, "systemAudio": { "const": "ready" } } },
            { "properties": { "microphone": { "const": "ready" }, "systemAudio": { "const": "device-absent" } } },
            { "properties": { "microphone": { "const": "device-absent" }, "systemAudio": { "const": "ready" } } }
          ] } } }
        },
        {
          "if": { "properties": { "controls": { "properties": { "stop": { "properties": { "enabled": { "const": true } } } } } } },
          "then": { "properties": { "session": { "$ref": "#/$defs/RecordingSession" } } }
        },
        {
          "if": { "properties": { "phase": { "const": "idle" } } },
          "then": {
            "properties": {
              "session": { "type": "null" },
              "controls": { "properties": { "stop": { "properties": { "enabled": { "const": false } } } } }
            }
          }
        },
        {
          "if": { "properties": { "phase": { "const": "starting" } } },
          "then": {
            "properties": {
              "controls": {
                "properties": {
                  "start": { "properties": { "enabled": { "const": false } } },
                  "stop": { "properties": { "enabled": { "const": false } } }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "phase": { "const": "recording" } } },
          "then": {
            "properties": {
              "session": { "$ref": "#/$defs/RecordingSession" },
              "controls": {
                "properties": {
                  "start": { "properties": { "enabled": { "const": false }, "disabledReason": { "const": "recording-active" } } },
                  "stop": { "properties": { "enabled": { "const": true } } }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "phase": { "const": "stopping" } } },
          "then": {
            "properties": {
              "session": { "$ref": "#/$defs/RecordingSession" },
              "controls": {
                "properties": {
                  "start": { "properties": { "enabled": { "const": false }, "disabledReason": { "const": "recording-active" } } }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "phase": { "const": "unavailable" } } },
          "then": {
            "properties": {
              "session": { "type": "null" },
              "controls": {
                "properties": {
                  "start": { "properties": { "enabled": { "const": false } } },
                  "stop": { "properties": { "enabled": { "const": false } } }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "controls": { "properties": { "start": { "properties": { "enabled": { "const": true } } } } } } },
          "then": { "properties": { "phase": { "const": "idle" } } }
        },
        {
          "if": {
            "properties": {
              "notice": {
                "type": "object",
                "properties": { "kind": { "const": "finalization-failed" } }
              }
            }
          },
          "then": {
            "properties": {
              "phase": { "const": "stopping" },
              "session": { "$ref": "#/$defs/RecordingSession" },
              "controls": { "properties": { "stop": { "properties": { "enabled": { "const": true } } } } }
            }
          }
        }
      ]
    },
    "ReplacementAvailability": {
      "oneOf": [
        {
          "type": "object",
          "required": ["allowed", "blockedReason"],
          "additionalProperties": false,
          "properties": { "allowed": { "const": true }, "blockedReason": { "type": "null" } }
        },
        {
          "type": "object",
          "required": ["allowed", "blockedReason"],
          "additionalProperties": false,
          "properties": {
            "allowed": { "const": false },
            "blockedReason": { "enum": ["recording-active", "recording-starting", "recording-stopping", "owner-unavailable"] }
          }
        }
      ]
    },
    "RecordingSummary": {
      "type": "object",
      "required": ["total", "capturing", "stopped", "waitingForAuth", "creatingStream", "streaming", "finalizing", "delivered", "blocked"],
      "additionalProperties": false,
      "properties": {
        "total": { "$ref": "#/$defs/SafeInteger" },
        "capturing": { "$ref": "#/$defs/SafeInteger" },
        "stopped": { "$ref": "#/$defs/SafeInteger" },
        "waitingForAuth": { "$ref": "#/$defs/SafeInteger" },
        "creatingStream": { "$ref": "#/$defs/SafeInteger" },
        "streaming": { "$ref": "#/$defs/SafeInteger" },
        "finalizing": { "$ref": "#/$defs/SafeInteger" },
        "delivered": { "$ref": "#/$defs/SafeInteger" },
        "blocked": { "$ref": "#/$defs/SafeInteger" }
      }
    },
    "UploadPhase": {
      "enum": ["idle", "uploading", "uploaded", "needs-sign-in", "failed"]
    },
    "UploadFailureStage": {
      "enum": ["session-create", "stream-resume", "audio-delivery", "finalization", "full-audio-upload", "receipt-validation", "local-recovery"]
    },
    "UploadFailureCategory": {
      "enum": ["invalid-request", "invalid-credential", "authorization-changed", "buffer-full", "session-closed", "offline", "timeout", "tls", "http-rejected", "invalid-response", "protocol-violation", "cancelled", "internal", "encryption-key-missing", "decryption-failed", "database-too-new", "missing-audio", "corrupt-audio", "unsafe-audio", "invalid-receipt", "invalid-acknowledgment", "unknown"]
    },
    "UploadFailure": {
      "type": "object",
      "required": ["stage", "category", "attempt", "retryable"],
      "additionalProperties": false,
      "properties": {
        "stage": { "$ref": "#/$defs/UploadFailureStage" },
        "category": { "$ref": "#/$defs/UploadFailureCategory" },
        "httpStatus": { "type": "integer", "minimum": 100, "maximum": 599 },
        "attempt": { "type": "integer", "minimum": 0, "maximum": 9999 },
        "retryable": { "type": "boolean" }
      }
    },
    "UploadItem": {
      "type": "object",
      "required": ["recordingId", "phase", "createdAt", "audioDurationMs", "audioBytes", "canRetry"],
      "additionalProperties": false,
      "properties": {
        "recordingId": { "$ref": "#/$defs/UploadRecordingId" },
        "phase": { "$ref": "#/$defs/UploadPhase" },
        "createdAt": { "$ref": "#/$defs/Timestamp" },
        "audioDurationMs": { "$ref": "#/$defs/SafeInteger" },
        "audioBytes": { "$ref": "#/$defs/SafeInteger" },
        "canRetry": { "type": "boolean" },
        "failure": { "$ref": "#/$defs/UploadFailure" },
        "memoryOnly": { "type": "boolean" }
      }
    },
    "UploadQueue": {
      "type": "object",
      "required": ["items", "totalCount", "nextOffset", "revision", "hasFailedUploads", "hasUploadsNeedingSignIn"],
      "additionalProperties": false,
      "properties": {
        "items": { "type": "array", "maxItems": 24, "items": { "$ref": "#/$defs/UploadItem" } },
        "totalCount": { "$ref": "#/$defs/SafeInteger" },
        "nextOffset": { "anyOf": [{ "$ref": "#/$defs/SafeInteger" }, { "type": "null" }] },
        "revision": { "type": "string", "minLength": 64, "maxLength": 64, "pattern": "^[a-f0-9]{64}$" },
        "historyFailure": { "$ref": "#/$defs/UploadFailure" },
        "hasFailedUploads": { "type": "boolean" },
        "hasUploadsNeedingSignIn": { "type": "boolean" }
      }
    },
    "UploadsResult": {
      "type": "object",
      "required": ["accountScopeFingerprint", "queue"],
      "additionalProperties": false,
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
        "queue": { "$ref": "#/$defs/UploadQueue" }
      }
    },
    "RetryUploadResult": {
      "type": "object",
      "required": ["accepted"],
      "additionalProperties": false,
      "properties": { "accepted": { "const": true } }
    },
    "EligibilityUpdateStatus": {
      "enum": [
        "none",
        "warning",
        "required"
      ]
    },
    "EligibilityUpdate": {
      "type": "object",
      "required": [
        "status",
        "currentVersion",
        "minimumVersion",
        "warningVersion"
      ],
      "additionalProperties": false,
      "properties": {
        "status": {
          "$ref": "#/$defs/EligibilityUpdateStatus"
        },
        "currentVersion": {
          "type": "string",
          "maxLength": 128
        },
        "minimumVersion": {
          "type": "string",
          "maxLength": 128
        },
        "warningVersion": {
          "type": "string",
          "maxLength": 128
        }
      }
    },
    "EligibilityUpdates": {
      "type": "object",
      "required": [
        "app",
        "plugin",
        "codex"
      ],
      "additionalProperties": false,
      "properties": {
        "app": {
          "$ref": "#/$defs/EligibilityUpdate"
        },
        "plugin": {
          "$ref": "#/$defs/EligibilityUpdate"
        },
        "codex": {
          "$ref": "#/$defs/EligibilityUpdate"
        }
      }
    },
    "EligibilityCapacity": {
      "enum": [
        "off",
        "warning",
        "blocked"
      ]
    },
    "EligibilityAvailability": {
      "enum": [
        "available",
        "coming_soon"
      ]
    },
    "EligibilityReason": {
      "enum": [
        "capacity",
        "availability",
        "app_update",
        "codex_update",
        "plugin_update",
        "context_unavailable"
      ]
    },
    "EligibilityClient": {
      "type": "object",
      "required": [
        "pluginVersion"
      ],
      "additionalProperties": false,
      "properties": {
        "pluginVersion": {
          "type": "string",
          "maxLength": 128
        },
        "codexVersion": {
          "type": "string",
          "maxLength": 128
        }
      }
    },
    "MeetingsEligibilityDecision": {
      "type": "object",
      "required": [
        "canUseMeetings",
        "serviceCapacity",
        "pluginAvailability",
        "requiredUpdates",
        "platform",
        "client"
      ],
      "additionalProperties": false,
      "properties": {
        "canUseMeetings": {
          "type": "boolean"
        },
        "reason": {
          "$ref": "#/$defs/EligibilityReason"
        },
        "serviceCapacity": {
          "$ref": "#/$defs/EligibilityCapacity"
        },
        "pluginAvailability": {
          "$ref": "#/$defs/EligibilityAvailability"
        },
        "requiredUpdates": {
          "$ref": "#/$defs/EligibilityUpdates"
        },
        "platform": {
          "enum": [
            "macos",
            "windows"
          ]
        },
        "client": {
          "$ref": "#/$defs/EligibilityClient"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "canUseMeetings": {
                "const": true
              }
            }
          },
          "then": {
            "not": {
              "required": [
                "reason"
              ]
            }
          },
          "else": {
            "required": [
              "reason"
            ]
          }
        }
      ]
    },
    "EligibilityStatus": {
      "enum": [
        "unresolved",
        "resolved",
        "error"
      ]
    },
    "MeetingsEligibility": {
      "type": "object",
      "required": [
        "status"
      ],
      "additionalProperties": false,
      "properties": {
        "status": {
          "$ref": "#/$defs/EligibilityStatus"
        },
        "decision": {
          "$ref": "#/$defs/MeetingsEligibilityDecision"
        }
      },
      "description": "Native accepted policy only, independent of audio and recording state. Error may retain a last accepted decision for the same authenticated account. Never performs network I/O when read.",
      "allOf": [
        {
          "if": {
            "properties": {
              "status": {
                "const": "resolved"
              }
            }
          },
          "then": {
            "required": [
              "decision"
            ]
          }
        },
        {
          "if": {
            "properties": {
              "status": {
                "const": "unresolved"
              }
            }
          },
          "then": {
            "not": {
              "required": [
                "decision"
              ]
            }
          }
        }
      ]
    },
    "CompanionState": {
      "type": "object",
      "required": ["revision", "accountScopeFingerprint", "recording", "lifecycle"],
      "additionalProperties": false,
      "properties": {
        "revision": { "$ref": "#/$defs/SafeInteger" },
        "accountScopeFingerprint": { "anyOf": [{ "$ref": "#/$defs/AccountScopeFingerprint" }, { "type": "null" }] },
        "recording": { "$ref": "#/$defs/RecordingPresentation" },
        "recordingSummary": { "$ref": "#/$defs/RecordingSummary" },
        "meetingsEligibility": { "$ref": "#/$defs/MeetingsEligibility" },
        "lifecycle": {
          "type": "object",
          "required": ["replacement"],
          "additionalProperties": false,
          "properties": {
            "replacement": { "$ref": "#/$defs/ReplacementAvailability" },
            "bootstrapRecovery": { "$ref": "#/$defs/BootstrapRecovery" }
          }
        }
      },
      "allOf": [
        { "if": { "required": ["meetingsEligibility"], "properties": { "meetingsEligibility": { "required": ["decision"] } } }, "then": { "properties": { "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" } } } },
        {
          "if": { "properties": { "recording": { "properties": { "phase": { "const": "starting" } } } } },
          "then": {
            "properties": {
              "lifecycle": {
                "properties": {
                  "replacement": {
                    "properties": { "allowed": { "const": false }, "blockedReason": { "const": "recording-starting" } }
                  }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "recording": { "properties": { "phase": { "const": "recording" } } } } },
          "then": {
            "properties": {
              "lifecycle": {
                "properties": {
                  "replacement": {
                    "properties": { "allowed": { "const": false }, "blockedReason": { "const": "recording-active" } }
                  }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "recording": { "properties": { "phase": { "const": "stopping" } } } } },
          "then": {
            "properties": {
              "lifecycle": {
                "properties": {
                  "replacement": {
                    "properties": { "allowed": { "const": false }, "blockedReason": { "const": "recording-stopping" } }
                  }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "recording": { "properties": { "phase": { "const": "unavailable" } } } } },
          "then": {
            "properties": {
              "lifecycle": {
                "properties": {
                  "replacement": {
                    "properties": { "allowed": { "const": false }, "blockedReason": { "const": "owner-unavailable" } }
                  }
                }
              }
            }
          }
        },
        {
          "if": { "properties": { "lifecycle": { "required": ["bootstrapRecovery"] } } },
          "then": {
            "properties": {
              "recordingSummary": { "properties": { "capturing": { "const": 0 } } },
              "recording": {
                "properties": {
                  "phase": { "const": "unavailable" },
                  "session": { "type": "null" },
                  "controls": {
                    "properties": {
                      "start": { "properties": { "enabled": { "const": false } } },
                      "stop": { "properties": { "enabled": { "const": false } } }
                    }
                  }
                }
              },
              "lifecycle": { "properties": { "replacement": { "properties": { "allowed": { "const": false } } } } }
            }
          }
        }
      ]
    },
    "InitializeResult": {
      "type": "object",
      "required": ["protocolVersion", "ownerEpoch", "companionVersion", "capabilities", "state"],
      "additionalProperties": false,
      "properties": {
        "protocolVersion": { "const": 2 },
        "ownerEpoch": { "$ref": "#/$defs/OpaqueIdentifier" },
        "companionVersion": { "type": "string", "minLength": 1, "maxLength": 64 },
        "capabilities": { "$ref": "#/$defs/CapabilityList" },
        "state": { "$ref": "#/$defs/CompanionState" }
      }
    },
    "SettingsState": {
      "type": "object",
      "required": ["accountScopeFingerprint", "revision", "status", "canUpdate", "values", "availability"],
      "additionalProperties": false,
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
        "revision": { "$ref": "#/$defs/SafeInteger" },
        "status": { "enum": ["ready", "saving", "unavailable"] },
        "canUpdate": { "type": "boolean" },
        "values": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "calendarRemindersEnabled": { "type": "boolean" },
            "meetingDetectionEnabled": { "type": "boolean" },
            "soundEffectsEnabled": { "type": "boolean" }
          }
        },
        "availability": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "reminders": { "type": "boolean" },
            "meetingDetection": { "type": "boolean" },
            "soundEffects": { "type": "boolean" }
          }
        }
      },
      "if": { "properties": { "status": { "enum": ["saving", "unavailable"] } } },
      "then": { "properties": { "canUpdate": { "const": false } } }
    },
    "MeetingUrl": {
      "type": "string",
      "minLength": 9,
      "maxLength": 2048,
      "pattern": "^https://"
    },
    "CalendarEvent": {
      "type": "object",
      "required": ["id", "title", "startAtMillis", "endAtMillis", "meetingUrl", "responseStatus"],
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 512,
          "description": "Exact upstream hosted Calendar event identifier; never replace it with a synthetic or hashed ID."
        },
        "title": { "type": "string", "maxLength": 512 },
        "startAtMillis": { "$ref": "#/$defs/SafeInteger" },
        "endAtMillis": { "$ref": "#/$defs/SafeInteger" },
        "meetingUrl": { "anyOf": [{ "$ref": "#/$defs/MeetingUrl" }, { "type": "null" }] },
        "responseStatus": { "enum": ["accepted", "tentative", "declined", "unknown"] }
      }
    },
    "CalendarSnapshot": {
      "type": "object",
      "required": ["fetchedAt", "generatedAt", "truncated", "stale", "events"],
      "additionalProperties": false,
      "properties": {
        "fetchedAt": { "$ref": "#/$defs/Timestamp" },
        "generatedAt": { "$ref": "#/$defs/Timestamp" },
        "truncated": { "type": "boolean" },
        "stale": { "type": "boolean" },
        "events": { "type": "array", "maxItems": 100, "items": { "$ref": "#/$defs/CalendarEvent" } }
      }
    },
    "MeetingNote": {
      "type": "object",
      "required": ["id", "title", "startedAt", "endedAt", "status", "isEmpty", "numShareRecipients"],
      "additionalProperties": false,
      "properties": {
        "id": { "type": "string", "minLength": 1, "maxLength": 512 },
        "title": { "type": "string", "maxLength": 512 },
        "startedAt": { "$ref": "#/$defs/Timestamp" },
        "endedAt": { "anyOf": [{ "$ref": "#/$defs/Timestamp" }, { "type": "null" }] },
        "status": { "enum": ["ready", "joining", "waiting", "recording", "uploading", "processing", "failed"] },
        "isEmpty": { "type": "boolean" },
        "numShareRecipients": { "$ref": "#/$defs/SafeInteger" },
        "summaryPageId": { "type": "string", "pattern": "^page_[0-9a-f]{32}$" },
        "recordSource": { "type": "string", "minLength": 1, "maxLength": 256 },
        "devicePlatform": { "enum": ["ios", "android"] }
      }
    },
    "NotesSnapshot": {
      "type": "object",
      "required": ["fetchedAt", "items"],
      "additionalProperties": false,
      "properties": {
        "source": { "enum": ["meetings", "private-notes"] },
        "fetchedAt": { "$ref": "#/$defs/Timestamp" },
        "items": { "type": "array", "maxItems": 20, "items": { "$ref": "#/$defs/MeetingNote" } }
      }
    },
    "HomeSnapshot": {
      "type": "object",
      "required": ["accountScopeFingerprint", "calendar", "notes"],
      "additionalProperties": false,
      "properties": {
        "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" },
        "calendar": { "anyOf": [{ "$ref": "#/$defs/CalendarSnapshot" }, { "type": "null" }] },
        "notes": { "anyOf": [{ "$ref": "#/$defs/NotesSnapshot" }, { "type": "null" }] }
      }
    },
    "RecordingCompletion": {
      "type": "object",
      "required": ["sessionId", "outcome"],
      "additionalProperties": false,
      "properties": {
        "sessionId": { "$ref": "#/$defs/OpaqueIdentifier" },
        "outcome": { "const": "saved" }
      }
    },
    "StopRecordingResult": {
      "type": "object",
      "required": ["state"],
      "additionalProperties": false,
      "properties": {
        "state": { "$ref": "#/$defs/CompanionState" },
        "completion": { "$ref": "#/$defs/RecordingCompletion" }
      }
    },
    "QuitForUpdateResult": {
      "oneOf": [
        {
          "type": "object",
          "required": ["disposition", "handoffId", "ownerEpoch", "captureAdmissionFenced"],
          "additionalProperties": false,
          "properties": {
            "disposition": { "const": "accepted" },
            "handoffId": { "$ref": "#/$defs/OpaqueIdentifier" },
            "ownerEpoch": { "$ref": "#/$defs/OpaqueIdentifier" },
            "captureAdmissionFenced": { "const": true }
          }
        },
        {
          "type": "object",
          "required": ["disposition", "reason"],
          "additionalProperties": false,
          "properties": {
            "disposition": { "const": "blocked" },
            "reason": { "enum": ["recording-active", "recording-starting", "recording-stopping", "owner-unavailable"] }
          }
        }
      ]
    },
    "SuccessResult": {
      "oneOf": [
        { "$ref": "#/$defs/InitializeResult" },
        { "$ref": "#/$defs/CompanionState" },
        { "$ref": "#/$defs/SettingsState" },
        { "$ref": "#/$defs/HomeSnapshot" },
        { "$ref": "#/$defs/StopRecordingResult" },
        { "$ref": "#/$defs/UploadsResult" },
        { "$ref": "#/$defs/RetryUploadResult" },
        { "$ref": "#/$defs/QuitForUpdateResult" }
      ]
    },
    "ErrorKind": {
      "enum": [
        "unsupported-protocol",
        "unsupported-capability",
        "invalid-arguments",
        "owner-changed",
        "account-changed",
        "session-mismatch",
        "recording-active",
        "recording-unavailable",
        "permission-required",
        "permission-denied",
        "settings-unavailable",
        "update-blocked",
        "operation-cancelled",
        "operation-ambiguous"
      ]
    },
    "JsonRpcError": {
      "type": "object",
      "required": ["code", "message", "data"],
      "additionalProperties": false,
      "properties": {
        "code": { "type": "integer", "minimum": -32768, "maximum": -32000 },
        "message": { "type": "string", "minLength": 1, "maxLength": 256 },
        "data": {
          "type": "object",
          "required": ["kind"],
          "additionalProperties": false,
          "properties": { "kind": { "$ref": "#/$defs/ErrorKind" } }
        }
      }
    },
    "Response": {
      "oneOf": [
        {
          "type": "object",
          "required": ["jsonrpc", "id", "result"],
          "additionalProperties": false,
          "properties": {
            "jsonrpc": { "const": "2.0" },
            "id": { "$ref": "#/$defs/OpaqueIdentifier" },
            "result": { "$ref": "#/$defs/SuccessResult" }
          }
        },
        {
          "type": "object",
          "required": ["jsonrpc", "id", "error"],
          "additionalProperties": false,
          "properties": {
            "jsonrpc": { "const": "2.0" },
            "id": { "$ref": "#/$defs/OpaqueIdentifier" },
            "error": { "$ref": "#/$defs/JsonRpcError" }
          }
        }
      ]
    },
    "StateChangedNotification": {
      "type": "object",
      "required": ["jsonrpc", "method", "params"],
      "additionalProperties": false,
      "properties": {
        "jsonrpc": { "const": "2.0" },
        "method": { "const": "companion.stateChanged" },
        "params": { "$ref": "#/$defs/CompanionState" }
      }
    },
    "RecordingCompletedNotification": {
      "type": "object",
      "required": ["jsonrpc", "method", "params"],
      "additionalProperties": false,
      "properties": {
        "jsonrpc": { "const": "2.0" },
        "method": { "const": "recording.completed" },
        "params": { "$ref": "#/$defs/RecordingCompletion" }
      }
    },
    "WorkspaceChangedNotification": {
      "type": "object",
      "required": ["jsonrpc", "method", "params"],
      "additionalProperties": false,
      "properties": {
        "jsonrpc": { "const": "2.0" },
        "method": { "const": "workspace.changed" },
        "params": {
          "type": "object",
          "required": ["resource", "accountScopeFingerprint"],
          "additionalProperties": false,
          "properties": {
            "resource": { "enum": ["calendar", "notes"] },
            "accountScopeFingerprint": { "$ref": "#/$defs/AccountScopeFingerprint" }
          }
        }
      }
    },
    "Notification": {
      "oneOf": [
        { "$ref": "#/$defs/StateChangedNotification" },
        { "$ref": "#/$defs/RecordingCompletedNotification" },
        { "$ref": "#/$defs/WorkspaceChangedNotification" }
      ]
    }
  }
}

SHA-256: d6309d1d21648be83e96580befd92a276d925d355f0fc962c421b0156f58d0e1