{
  "asyncapi": "3.0.0",
  "info": {
    "title": "AIM Platform Event API",
    "version": "1.0.0"
  },
  "servers": {
    "production": {
      "host": "a-im.cn",
      "protocol": "https"
    }
  },
  "channels": {
    "realtimeControl": {
      "address": "/v1/realtime/sessions/{session_id}/events",
      "parameters": {"session_id": {"description": "Authorized realtime session UUID"}},
      "messages": {
        "realtimeAuth": {"$ref": "#/components/messages/realtimeAuth"},
        "realtimeReady": {"$ref": "#/components/messages/realtimeReady"},
        "realtimeEvent": {"$ref": "#/components/messages/realtimeEvent"},
        "realtimeTransient": {"$ref": "#/components/messages/realtimeTransient"},
        "realtimeHeartbeat": {"$ref": "#/components/messages/realtimeHeartbeat"}
      },
      "x-aim-websocket-subprotocol": "aim-realtime-v1"
    },
    "runEvents": {
      "address": "/v1/runs/{run_id}/events",
      "parameters": {
        "run_id": {
          "description": "Authorized run UUID"
        }
      },
      "messages": {
        "runEvent": {
          "$ref": "#/components/messages/runEvent"
        },
        "streamClosed": {
          "$ref": "#/components/messages/streamClosed"
        }
      }
    }
  },
  "operations": {
    "receiveRealtimeControl": {
      "action": "receive",
      "channel": {"$ref": "#/channels/realtimeControl"},
      "security": [{"$ref": "#/components/securitySchemes/realtimeControlToken"}],
      "description": "First frame authenticates a five-minute AIM control token; ready includes current session snapshot and cursor. Client heartbeat is required every five seconds, with a fifteen-second grace period. Reconnect obtains a fresh JoinResult control token."
    },
    "receiveRunEvents": {
      "action": "receive",
      "channel": {
        "$ref": "#/channels/runEvents"
      },
      "security": [
        {
          "$ref": "#/components/securitySchemes/humanJwt"
        }
      ]
    }
  },
  "components": {
    "securitySchemes": {
      "realtimeControlToken": {
        "type": "http", "scheme": "bearer", "bearerFormat": "AIM short control JWT",
        "description": "Sent in first WebSocket auth frame rather than URL or subprotocol."
      },
      "humanJwt": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "messages": {
      "realtimeAuth": {"name":"auth","contentType":"application/json","payload":{"type":"object","required":["type","token"],"properties":{"type":{"const":"auth"},"token":{"type":"string"},"cursor":{"type":"string"}},"additionalProperties":false}},
      "realtimeReady": {"name":"ready","contentType":"application/json","payload":{"type":"object","required":["type","sessionId","sessionEpoch","connectionEpoch","snapshotSeq","resumeCursor","session"],"properties":{"type":{"const":"ready"},"sessionId":{"type":"string","format":"uuid"},"sessionEpoch":{"type":"integer","minimum":1},"connectionEpoch":{"type":"integer","minimum":1},"snapshotSeq":{"type":"integer","minimum":0},"resumeCursor":{"type":"string"},"session":{"type":"object"}},"additionalProperties":false}},
      "realtimeEvent": {"name":"event","contentType":"application/json","payload":{"type":"object","required":["type","eventId","sequence","cursor","eventType","payload"],"properties":{"type":{"const":"event"},"eventId":{"type":"string","format":"uuid"},"sequence":{"type":"integer","minimum":1},"cursor":{"type":"string"},"eventType":{"enum":["event.redacted","input.accepted","response.started","response.completed","response.interrupt","operation.updated","operation.cancel_requested","media.request_updated","media.permission_revoked","track.updated","visual.focus_updated","room.reconnecting","runtime.reconnecting","session.ending","session.ended","device.assignment_created","device.assignment_revoked","device.revoked"]},"payload":{"type":"object"}},"additionalProperties":false}},
      "realtimeTransient": {"name":"transient","contentType":"application/json","payload":{"type":"object","required":["type","eventType","payload"],"properties":{"type":{"const":"transient"},"eventType":{"enum":["transcript.partial","response.text.delta","response.text.replace"]},"payload":{"type":"object"}},"additionalProperties":false}},
      "realtimeHeartbeat": {"name":"heartbeat","contentType":"application/json","payload":{"oneOf":[{"type":"object","required":["type","connectionEpoch","nonce"],"properties":{"type":{"const":"heartbeat"},"connectionEpoch":{"type":"integer","minimum":1},"nonce":{"type":"string","minLength":1,"maxLength":64}},"additionalProperties":false},{"type":"object","required":["type","connectionEpoch","nonce","serverTime","authorizedUntil","sessionEpoch"],"properties":{"type":{"const":"heartbeat.ack"},"connectionEpoch":{"type":"integer","minimum":1},"nonce":{"type":"string"},"serverTime":{"type":"string","format":"date-time"},"authorizedUntil":{"type":"string","format":"date-time"},"sessionEpoch":{"type":"integer","minimum":1}},"additionalProperties":false}]}},
      "runEvent": {
        "name": "run.event",
        "contentType": "application/json",
        "headers": {
          "type": "object",
          "properties": {
            "Last-Event-ID": {
              "type": "string",
              "description": "Signed caller/run-bound resume cursor"
            }
          }
        },
        "payload": {
          "type": "object",
          "required": [
            "api_version",
            "event_id",
            "run_id",
            "sequence",
            "type",
            "payload",
            "created_at"
          ],
          "properties": {
            "api_version": {
              "const": "1.0"
            },
            "event_id": {
              "type": "string",
              "format": "uuid"
            },
            "run_id": {
              "type": "string",
              "format": "uuid"
            },
            "sequence": {
              "type": "integer",
              "minimum": 1
            },
            "type": {
              "type": "string"
            },
            "payload": {
              "type": "object"
            },
            "created_at": {
              "type": "string",
              "format": "date-time"
            }
          },
          "additionalProperties": false
        }
      },
      "streamClosed": {
        "name": "stream.closed",
        "payload": {
          "type": "object",
          "required": [
            "code"
          ],
          "properties": {
            "code": {
              "enum": [
                "authorization_revoked",
                "run_unavailable"
              ]
            }
          },
          "additionalProperties": false
        }
      }
    }
  }
}
