definitions:
  accounts.Account:
    properties:
      avatar_url:
        type: string
      created_at:
        type: string
      display_name:
        type: string
      email:
        type: string
      id:
        type: string
      is_active:
        type: boolean
      last_login_at:
        type: string
      role:
        type: string
      updated_at:
        type: string
      username:
        type: string
    type: object
  accounts.CreateAccountRequest:
    properties:
      avatar_url:
        type: string
      display_name:
        type: string
      email:
        type: string
      is_active:
        type: boolean
      password:
        type: string
      role:
        type: string
      username:
        type: string
    type: object
  accounts.ListAccountsResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/accounts.Account'
        type: array
    type: object
  accounts.ResetPasswordRequest:
    properties:
      new_password:
        type: string
    type: object
  accounts.UpdateAccountRequest:
    properties:
      avatar_url:
        type: string
      display_name:
        type: string
      is_active:
        type: boolean
      role:
        type: string
    type: object
  accounts.UpdatePasswordRequest:
    properties:
      current_password:
        type: string
      new_password:
        type: string
    type: object
  accounts.UpdateProfileRequest:
    properties:
      avatar_url:
        type: string
      display_name:
        type: string
    type: object
  bots.Bot:
    properties:
      allow_guest:
        type: boolean
      avatar_url:
        type: string
      check_issue_count:
        type: integer
      check_state:
        type: string
      created_at:
        type: string
      display_name:
        type: string
      id:
        type: string
      is_active:
        type: boolean
      metadata:
        additionalProperties: {}
        type: object
      owner_user_id:
        type: string
      status:
        type: string
      type:
        type: string
      updated_at:
        type: string
    type: object
  bots.BotCheck:
    properties:
      detail:
        type: string
      id:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      status:
        type: string
      subtitle:
        type: string
      summary:
        type: string
      title_key:
        type: string
      type:
        type: string
    type: object
  bots.BotMember:
    properties:
      bot_id:
        type: string
      created_at:
        type: string
      role:
        type: string
      user_id:
        type: string
    type: object
  bots.CreateBotRequest:
    properties:
      avatar_url:
        type: string
      display_name:
        type: string
      is_active:
        type: boolean
      metadata:
        additionalProperties: {}
        type: object
      type:
        type: string
    type: object
  bots.ListBotsResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/bots.Bot'
        type: array
    type: object
  bots.ListChecksResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/bots.BotCheck'
        type: array
    type: object
  bots.ListMembersResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/bots.BotMember'
        type: array
    type: object
  bots.TransferBotRequest:
    properties:
      owner_user_id:
        type: string
    type: object
  bots.UpdateBotRequest:
    properties:
      avatar_url:
        type: string
      display_name:
        type: string
      is_active:
        type: boolean
      metadata:
        additionalProperties: {}
        type: object
    type: object
  bots.UpsertMemberRequest:
    properties:
      role:
        type: string
      user_id:
        type: string
    type: object
  channel.Action:
    properties:
      label:
        type: string
      type:
        type: string
      url:
        type: string
      value:
        type: string
    type: object
  channel.Attachment:
    properties:
      base64:
        description: data URL for agent delivery
        type: string
      caption:
        type: string
      content_hash:
        type: string
      duration_ms:
        type: integer
      height:
        type: integer
      metadata:
        additionalProperties: {}
        type: object
      mime:
        type: string
      name:
        type: string
      platform_key:
        type: string
      size:
        type: integer
      source_platform:
        type: string
      thumbnail_url:
        type: string
      type:
        $ref: '#/definitions/channel.AttachmentType'
      url:
        type: string
      width:
        type: integer
    type: object
  channel.AttachmentType:
    enum:
    - image
    - audio
    - video
    - voice
    - file
    - gif
    type: string
    x-enum-varnames:
    - AttachmentImage
    - AttachmentAudio
    - AttachmentVideo
    - AttachmentVoice
    - AttachmentFile
    - AttachmentGIF
  channel.ChannelCapabilities:
    properties:
      attachments:
        type: boolean
      block_streaming:
        type: boolean
      buttons:
        type: boolean
      chat_types:
        items:
          type: string
        type: array
      edit:
        type: boolean
      markdown:
        type: boolean
      media:
        type: boolean
      native_commands:
        type: boolean
      polls:
        type: boolean
      reactions:
        type: boolean
      reply:
        type: boolean
      rich_text:
        type: boolean
      streaming:
        type: boolean
      text:
        type: boolean
      threads:
        type: boolean
      unsend:
        type: boolean
    type: object
  channel.ChannelConfig:
    properties:
      bot_id:
        type: string
      channel_type:
        type: string
      created_at:
        type: string
      credentials:
        additionalProperties: {}
        type: object
      disabled:
        type: boolean
      external_identity:
        type: string
      id:
        type: string
      routing:
        additionalProperties: {}
        type: object
      self_identity:
        additionalProperties: {}
        type: object
      updated_at:
        type: string
      verified_at:
        type: string
    type: object
  channel.ChannelIdentityBinding:
    properties:
      channel_identity_id:
        type: string
      channel_type:
        type: string
      config:
        additionalProperties: {}
        type: object
      created_at:
        type: string
      id:
        type: string
      updated_at:
        type: string
    type: object
  channel.ConfigSchema:
    properties:
      fields:
        additionalProperties:
          $ref: '#/definitions/channel.FieldSchema'
        type: object
      version:
        type: integer
    type: object
  channel.FieldSchema:
    properties:
      description:
        type: string
      enum:
        items:
          type: string
        type: array
      example: {}
      required:
        type: boolean
      title:
        type: string
      type:
        $ref: '#/definitions/channel.FieldType'
    type: object
  channel.FieldType:
    enum:
    - string
    - secret
    - bool
    - number
    - enum
    type: string
    x-enum-varnames:
    - FieldString
    - FieldSecret
    - FieldBool
    - FieldNumber
    - FieldEnum
  channel.Message:
    properties:
      actions:
        items:
          $ref: '#/definitions/channel.Action'
        type: array
      attachments:
        items:
          $ref: '#/definitions/channel.Attachment'
        type: array
      format:
        $ref: '#/definitions/channel.MessageFormat'
      id:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      parts:
        items:
          $ref: '#/definitions/channel.MessagePart'
        type: array
      reply:
        $ref: '#/definitions/channel.ReplyRef'
      text:
        type: string
      thread:
        $ref: '#/definitions/channel.ThreadRef'
    type: object
  channel.MessageFormat:
    enum:
    - plain
    - markdown
    - rich
    type: string
    x-enum-varnames:
    - MessageFormatPlain
    - MessageFormatMarkdown
    - MessageFormatRich
  channel.MessagePart:
    properties:
      channel_identity_id:
        type: string
      emoji:
        type: string
      language:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      styles:
        items:
          $ref: '#/definitions/channel.MessageTextStyle'
        type: array
      text:
        type: string
      type:
        $ref: '#/definitions/channel.MessagePartType'
      url:
        type: string
    type: object
  channel.MessagePartType:
    enum:
    - text
    - link
    - code_block
    - mention
    - emoji
    type: string
    x-enum-varnames:
    - MessagePartText
    - MessagePartLink
    - MessagePartCodeBlock
    - MessagePartMention
    - MessagePartEmoji
  channel.MessageTextStyle:
    enum:
    - bold
    - italic
    - strikethrough
    - code
    type: string
    x-enum-varnames:
    - MessageStyleBold
    - MessageStyleItalic
    - MessageStyleStrikethrough
    - MessageStyleCode
  channel.ReplyRef:
    properties:
      message_id:
        type: string
      target:
        type: string
    type: object
  channel.SendRequest:
    properties:
      channel_identity_id:
        type: string
      message:
        $ref: '#/definitions/channel.Message'
      target:
        type: string
    type: object
  channel.TargetHint:
    properties:
      example:
        type: string
      label:
        type: string
    type: object
  channel.TargetSpec:
    properties:
      format:
        type: string
      hints:
        items:
          $ref: '#/definitions/channel.TargetHint'
        type: array
    type: object
  channel.ThreadRef:
    properties:
      id:
        type: string
    type: object
  channel.UpdateChannelStatusRequest:
    properties:
      disabled:
        type: boolean
    type: object
  channel.UpsertChannelIdentityConfigRequest:
    properties:
      config:
        additionalProperties: {}
        type: object
    type: object
  channel.UpsertConfigRequest:
    properties:
      credentials:
        additionalProperties: {}
        type: object
      disabled:
        type: boolean
      external_identity:
        type: string
      routing:
        additionalProperties: {}
        type: object
      self_identity:
        additionalProperties: {}
        type: object
      verified_at:
        type: string
    type: object
  email.BindingResponse:
    properties:
      bot_id:
        type: string
      can_delete:
        type: boolean
      can_read:
        type: boolean
      can_write:
        type: boolean
      config:
        additionalProperties: {}
        type: object
      created_at:
        type: string
      email_address:
        type: string
      email_provider_id:
        type: string
      id:
        type: string
      updated_at:
        type: string
    type: object
  email.ConfigSchema:
    properties:
      fields:
        items:
          $ref: '#/definitions/email.FieldSchema'
        type: array
    type: object
  email.CreateBindingRequest:
    properties:
      can_delete:
        type: boolean
      can_read:
        type: boolean
      can_write:
        type: boolean
      config:
        additionalProperties: {}
        type: object
      email_address:
        type: string
      email_provider_id:
        type: string
    type: object
  email.CreateProviderRequest:
    properties:
      config:
        additionalProperties: {}
        type: object
      name:
        type: string
      provider:
        type: string
    type: object
  email.FieldSchema:
    properties:
      description:
        type: string
      enum:
        items:
          type: string
        type: array
      example: {}
      key:
        type: string
      order:
        type: integer
      required:
        type: boolean
      title:
        type: string
      type:
        type: string
    type: object
  email.OutboxItemResponse:
    properties:
      attachments:
        items: {}
        type: array
      body_html:
        type: string
      body_text:
        type: string
      bot_id:
        type: string
      created_at:
        type: string
      error:
        type: string
      from:
        type: string
      id:
        type: string
      message_id:
        type: string
      provider_id:
        type: string
      sent_at:
        type: string
      status:
        type: string
      subject:
        type: string
      to:
        items:
          type: string
        type: array
    type: object
  email.ProviderMeta:
    properties:
      config_schema:
        $ref: '#/definitions/email.ConfigSchema'
      display_name:
        type: string
      provider:
        type: string
    type: object
  email.ProviderResponse:
    properties:
      config:
        additionalProperties: {}
        type: object
      created_at:
        type: string
      id:
        type: string
      name:
        type: string
      provider:
        type: string
      updated_at:
        type: string
    type: object
  email.UpdateBindingRequest:
    properties:
      can_delete:
        type: boolean
      can_read:
        type: boolean
      can_write:
        type: boolean
      config:
        additionalProperties: {}
        type: object
      email_address:
        type: string
    type: object
  email.UpdateProviderRequest:
    properties:
      config:
        additionalProperties: {}
        type: object
      name:
        type: string
      provider:
        type: string
    type: object
  github_com_memohai_memoh_internal_mcp.Connection:
    properties:
      bot_id:
        type: string
      config:
        additionalProperties: {}
        type: object
      created_at:
        type: string
      id:
        type: string
      is_active:
        type: boolean
      name:
        type: string
      type:
        type: string
      updated_at:
        type: string
    type: object
  handlers.BatchDeleteRequest:
    properties:
      ids:
        items:
          type: string
        type: array
    type: object
  handlers.ChannelMeta:
    properties:
      capabilities:
        $ref: '#/definitions/channel.ChannelCapabilities'
      config_schema:
        $ref: '#/definitions/channel.ConfigSchema'
      configless:
        type: boolean
      display_name:
        type: string
      target_spec:
        $ref: '#/definitions/channel.TargetSpec'
      type:
        type: string
      user_config_schema:
        $ref: '#/definitions/channel.ConfigSchema'
    type: object
  handlers.CreateContainerRequest:
    properties:
      snapshotter:
        type: string
    type: object
  handlers.CreateContainerResponse:
    properties:
      container_id:
        type: string
      image:
        type: string
      snapshotter:
        type: string
      started:
        type: boolean
    type: object
  handlers.CreateSnapshotRequest:
    properties:
      snapshot_name:
        type: string
    type: object
  handlers.CreateSnapshotResponse:
    properties:
      container_id:
        type: string
      snapshot_name:
        type: string
      snapshotter:
        type: string
      source:
        type: string
      version:
        type: integer
    type: object
  handlers.DailyTokenUsage:
    properties:
      cache_read_tokens:
        type: integer
      cache_write_tokens:
        type: integer
      day:
        type: string
      input_tokens:
        type: integer
      output_tokens:
        type: integer
      reasoning_tokens:
        type: integer
    type: object
  handlers.EmbeddingsInput:
    properties:
      image_url:
        type: string
      text:
        type: string
      video_url:
        type: string
    type: object
  handlers.EmbeddingsRequest:
    properties:
      dimensions:
        type: integer
      input:
        $ref: '#/definitions/handlers.EmbeddingsInput'
      model:
        type: string
      provider:
        type: string
      type:
        type: string
    type: object
  handlers.EmbeddingsResponse:
    properties:
      dimensions:
        type: integer
      embedding:
        items:
          type: number
        type: array
      message:
        type: string
      model:
        type: string
      provider:
        type: string
      type:
        type: string
      usage:
        $ref: '#/definitions/handlers.EmbeddingsUsage'
    type: object
  handlers.EmbeddingsUsage:
    properties:
      duration:
        type: integer
      image_tokens:
        type: integer
      input_tokens:
        type: integer
    type: object
  handlers.ErrorResponse:
    properties:
      message:
        type: string
    type: object
  handlers.FSDeleteRequest:
    properties:
      path:
        type: string
      recursive:
        type: boolean
    type: object
  handlers.FSFileInfo:
    properties:
      isDir:
        type: boolean
      modTime:
        type: string
      mode:
        type: string
      name:
        type: string
      path:
        type: string
      size:
        type: integer
    type: object
  handlers.FSListResponse:
    properties:
      entries:
        items:
          $ref: '#/definitions/handlers.FSFileInfo'
        type: array
      path:
        type: string
    type: object
  handlers.FSMkdirRequest:
    properties:
      path:
        type: string
    type: object
  handlers.FSReadResponse:
    properties:
      content:
        type: string
      path:
        type: string
      size:
        type: integer
    type: object
  handlers.FSRenameRequest:
    properties:
      newPath:
        type: string
      oldPath:
        type: string
    type: object
  handlers.FSUploadResponse:
    properties:
      path:
        type: string
      size:
        type: integer
    type: object
  handlers.FSWriteRequest:
    properties:
      content:
        type: string
      path:
        type: string
    type: object
  handlers.GetContainerResponse:
    properties:
      container_id:
        type: string
      container_path:
        type: string
      created_at:
        type: string
      host_path:
        type: string
      image:
        type: string
      namespace:
        type: string
      status:
        type: string
      task_running:
        type: boolean
      updated_at:
        type: string
    type: object
  handlers.ListSnapshotsResponse:
    properties:
      snapshots:
        items:
          $ref: '#/definitions/handlers.SnapshotInfo'
        type: array
      snapshotter:
        type: string
    type: object
  handlers.LocalChannelMessageRequest:
    properties:
      message:
        $ref: '#/definitions/channel.Message'
    type: object
  handlers.LoginRequest:
    properties:
      password:
        type: string
      username:
        type: string
    type: object
  handlers.LoginResponse:
    properties:
      access_token:
        type: string
      display_name:
        type: string
      expires_at:
        type: string
      role:
        type: string
      token_type:
        type: string
      user_id:
        type: string
      username:
        type: string
    type: object
  handlers.MCPStdioRequest:
    properties:
      args:
        items:
          type: string
        type: array
      command:
        type: string
      cwd:
        type: string
      env:
        additionalProperties:
          type: string
        type: object
      name:
        type: string
    type: object
  handlers.MCPStdioResponse:
    properties:
      connection_id:
        type: string
      tools:
        items:
          type: string
        type: array
      url:
        type: string
    type: object
  handlers.ModelTokenUsage:
    properties:
      input_tokens:
        type: integer
      model_id:
        type: string
      model_name:
        type: string
      model_slug:
        type: string
      output_tokens:
        type: integer
      provider_name:
        type: string
    type: object
  handlers.PingResponse:
    properties:
      container_backend:
        type: string
      snapshot_supported:
        type: boolean
      status:
        type: string
    type: object
  handlers.RefreshResponse:
    properties:
      access_token:
        type: string
      expires_at:
        type: string
      token_type:
        type: string
    type: object
  handlers.SkillItem:
    properties:
      content:
        type: string
      description:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
      raw:
        type: string
    type: object
  handlers.SkillsDeleteRequest:
    properties:
      names:
        items:
          type: string
        type: array
    type: object
  handlers.SkillsResponse:
    properties:
      skills:
        items:
          $ref: '#/definitions/handlers.SkillItem'
        type: array
    type: object
  handlers.SkillsUpsertRequest:
    properties:
      skills:
        items:
          type: string
        type: array
    type: object
  handlers.SnapshotInfo:
    properties:
      created_at:
        type: string
      kind:
        type: string
      labels:
        additionalProperties:
          type: string
        type: object
      managed:
        type: boolean
      name:
        type: string
      parent:
        type: string
      snapshotter:
        type: string
      source:
        type: string
      updated_at:
        type: string
      version:
        type: integer
    type: object
  handlers.TokenUsageResponse:
    properties:
      by_model:
        items:
          $ref: '#/definitions/handlers.ModelTokenUsage'
        type: array
      chat:
        items:
          $ref: '#/definitions/handlers.DailyTokenUsage'
        type: array
      heartbeat:
        items:
          $ref: '#/definitions/handlers.DailyTokenUsage'
        type: array
    type: object
  handlers.fsOpResponse:
    properties:
      ok:
        type: boolean
    type: object
  handlers.listMyIdentitiesResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/identities.ChannelIdentity'
        type: array
      user_id:
        type: string
    type: object
  handlers.markReadRequest:
    properties:
      ids:
        items:
          type: string
        type: array
    type: object
  handlers.memoryAddPayload:
    properties:
      embedding_enabled:
        type: boolean
      filters:
        additionalProperties: {}
        type: object
      infer:
        type: boolean
      message:
        type: string
      messages:
        items:
          $ref: '#/definitions/memory.Message'
        type: array
      metadata:
        additionalProperties: {}
        type: object
      namespace:
        type: string
      run_id:
        type: string
    type: object
  handlers.memoryCompactPayload:
    properties:
      decay_days:
        type: integer
      ratio:
        type: number
    type: object
  handlers.memoryDeletePayload:
    properties:
      memory_ids:
        items:
          type: string
        type: array
    type: object
  handlers.memorySearchPayload:
    properties:
      embedding_enabled:
        type: boolean
      filters:
        additionalProperties: {}
        type: object
      limit:
        type: integer
      no_stats:
        type: boolean
      query:
        type: string
      run_id:
        type: string
      sources:
        items:
          type: string
        type: array
    type: object
  handlers.skillsOpResponse:
    properties:
      ok:
        type: boolean
    type: object
  heartbeat.ListLogsResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/heartbeat.Log'
        type: array
    type: object
  heartbeat.Log:
    properties:
      bot_id:
        type: string
      completed_at:
        type: string
      error_message:
        type: string
      id:
        type: string
      result_text:
        type: string
      started_at:
        type: string
      status:
        type: string
      usage: {}
    type: object
  identities.ChannelIdentity:
    properties:
      avatar_url:
        type: string
      channel:
        type: string
      channel_subject_id:
        type: string
      created_at:
        type: string
      display_name:
        type: string
      id:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      updated_at:
        type: string
      user_id:
        type: string
    type: object
  inbox.CountResult:
    properties:
      total:
        type: integer
      unread:
        type: integer
    type: object
  inbox.CreateRequest:
    properties:
      action:
        type: string
      bot_id:
        type: string
      content:
        type: string
      header:
        additionalProperties: {}
        type: object
      source:
        type: string
    type: object
  inbox.Item:
    properties:
      action:
        type: string
      bot_id:
        type: string
      content:
        type: string
      created_at:
        type: string
      header:
        additionalProperties: {}
        type: object
      id:
        type: string
      is_read:
        type: boolean
      read_at:
        type: string
      source:
        type: string
    type: object
  mcp.ExportResponse:
    properties:
      mcpServers:
        additionalProperties:
          $ref: '#/definitions/mcp.MCPServerEntry'
        type: object
    type: object
  mcp.ImportRequest:
    properties:
      mcpServers:
        additionalProperties:
          $ref: '#/definitions/mcp.MCPServerEntry'
        type: object
    type: object
  mcp.ListResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
        type: array
    type: object
  mcp.MCPServerEntry:
    properties:
      args:
        items:
          type: string
        type: array
      command:
        type: string
      cwd:
        type: string
      env:
        additionalProperties:
          type: string
        type: object
      headers:
        additionalProperties:
          type: string
        type: object
      transport:
        type: string
      url:
        type: string
    type: object
  mcp.UpsertRequest:
    properties:
      args:
        items:
          type: string
        type: array
      command:
        type: string
      cwd:
        type: string
      env:
        additionalProperties:
          type: string
        type: object
      headers:
        additionalProperties:
          type: string
        type: object
      is_active:
        type: boolean
      name:
        type: string
      transport:
        type: string
      url:
        type: string
    type: object
  memory.CDFPoint:
    properties:
      cumulative:
        description: cumulative weight fraction [0.0, 1.0]
        type: number
      k:
        description: rank position (1-based, sorted by value desc)
        type: integer
    type: object
  memory.CompactResult:
    properties:
      after_count:
        type: integer
      before_count:
        type: integer
      ratio:
        type: number
      results:
        items:
          $ref: '#/definitions/memory.MemoryItem'
        type: array
    type: object
  memory.DeleteResponse:
    properties:
      message:
        type: string
    type: object
  memory.MemoryItem:
    properties:
      agent_id:
        type: string
      bot_id:
        type: string
      cdf_curve:
        items:
          $ref: '#/definitions/memory.CDFPoint'
        type: array
      created_at:
        type: string
      hash:
        type: string
      id:
        type: string
      memory:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      run_id:
        type: string
      score:
        type: number
      top_k_buckets:
        items:
          $ref: '#/definitions/memory.TopKBucket'
        type: array
      updated_at:
        type: string
    type: object
  memory.Message:
    properties:
      content:
        type: string
      role:
        type: string
    type: object
  memory.RebuildResult:
    properties:
      fs_count:
        type: integer
      missing_count:
        type: integer
      qdrant_count:
        type: integer
      restored_count:
        type: integer
    type: object
  memory.SearchResponse:
    properties:
      relations:
        items: {}
        type: array
      results:
        items:
          $ref: '#/definitions/memory.MemoryItem'
        type: array
    type: object
  memory.TopKBucket:
    properties:
      index:
        description: sparse dimension index (term hash)
        type: integer
      value:
        description: weight (term frequency)
        type: number
    type: object
  memory.UsageResponse:
    properties:
      avg_text_bytes:
        type: integer
      count:
        type: integer
      estimated_storage_bytes:
        type: integer
      total_text_bytes:
        type: integer
    type: object
  message.Message:
    properties:
      assets:
        items:
          $ref: '#/definitions/message.MessageAsset'
        type: array
      bot_id:
        type: string
      content:
        items:
          type: integer
        type: array
      created_at:
        type: string
      external_message_id:
        type: string
      id:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      platform:
        type: string
      role:
        type: string
      route_id:
        type: string
      sender_avatar_url:
        type: string
      sender_channel_identity_id:
        type: string
      sender_display_name:
        type: string
      sender_user_id:
        type: string
      source_reply_to_message_id:
        type: string
      usage:
        items:
          type: integer
        type: array
    type: object
  message.MessageAsset:
    properties:
      content_hash:
        type: string
      mime:
        type: string
      ordinal:
        type: integer
      role:
        type: string
      size_bytes:
        type: integer
      storage_key:
        type: string
    type: object
  models.AddRequest:
    properties:
      client_type:
        $ref: '#/definitions/models.ClientType'
      dimensions:
        type: integer
      input_modalities:
        items:
          type: string
        type: array
      llm_provider_id:
        type: string
      model_id:
        type: string
      name:
        type: string
      supports_reasoning:
        type: boolean
      type:
        $ref: '#/definitions/models.ModelType'
    type: object
  models.AddResponse:
    properties:
      id:
        type: string
      model_id:
        type: string
    type: object
  models.ClientType:
    enum:
    - openai-responses
    - openai-completions
    - anthropic-messages
    - google-generative-ai
    type: string
    x-enum-varnames:
    - ClientTypeOpenAIResponses
    - ClientTypeOpenAICompletions
    - ClientTypeAnthropicMessages
    - ClientTypeGoogleGenerativeAI
  models.CountResponse:
    properties:
      count:
        type: integer
    type: object
  models.GetResponse:
    properties:
      client_type:
        $ref: '#/definitions/models.ClientType'
      dimensions:
        type: integer
      id:
        type: string
      input_modalities:
        items:
          type: string
        type: array
      llm_provider_id:
        type: string
      model_id:
        type: string
      name:
        type: string
      supports_reasoning:
        type: boolean
      type:
        $ref: '#/definitions/models.ModelType'
    type: object
  models.ModelType:
    enum:
    - chat
    - embedding
    type: string
    x-enum-varnames:
    - ModelTypeChat
    - ModelTypeEmbedding
  models.UpdateRequest:
    properties:
      client_type:
        $ref: '#/definitions/models.ClientType'
      dimensions:
        type: integer
      input_modalities:
        items:
          type: string
        type: array
      llm_provider_id:
        type: string
      model_id:
        type: string
      name:
        type: string
      supports_reasoning:
        type: boolean
      type:
        $ref: '#/definitions/models.ModelType'
    type: object
  providers.CheckResult:
    properties:
      latency_ms:
        type: integer
      message:
        type: string
      status:
        $ref: '#/definitions/providers.CheckStatus'
      status_code:
        type: integer
    type: object
  providers.CheckStatus:
    enum:
    - supported
    - auth_error
    - unsupported
    - error
    type: string
    x-enum-varnames:
    - CheckStatusSupported
    - CheckStatusAuthError
    - CheckStatusUnsupported
    - CheckStatusError
  providers.CountResponse:
    properties:
      count:
        type: integer
    type: object
  providers.CreateRequest:
    properties:
      api_key:
        type: string
      base_url:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
    required:
    - base_url
    - name
    type: object
  providers.GetResponse:
    properties:
      api_key:
        description: masked in response
        type: string
      base_url:
        type: string
      created_at:
        type: string
      id:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
      updated_at:
        type: string
    type: object
  providers.TestResponse:
    properties:
      checks:
        additionalProperties:
          $ref: '#/definitions/providers.CheckResult'
        type: object
      latency_ms:
        type: integer
      message:
        type: string
      reachable:
        type: boolean
    type: object
  providers.UpdateRequest:
    properties:
      api_key:
        type: string
      base_url:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
    type: object
  schedule.CreateRequest:
    properties:
      command:
        type: string
      description:
        type: string
      enabled:
        type: boolean
      max_calls:
        $ref: '#/definitions/schedule.NullableInt'
      name:
        type: string
      pattern:
        type: string
    type: object
  schedule.ListResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/schedule.Schedule'
        type: array
    type: object
  schedule.NullableInt:
    properties:
      set:
        type: boolean
      value:
        type: integer
    type: object
  schedule.Schedule:
    properties:
      bot_id:
        type: string
      command:
        type: string
      created_at:
        type: string
      current_calls:
        type: integer
      description:
        type: string
      enabled:
        type: boolean
      id:
        type: string
      max_calls:
        type: integer
      name:
        type: string
      pattern:
        type: string
      updated_at:
        type: string
    type: object
  schedule.UpdateRequest:
    properties:
      command:
        type: string
      description:
        type: string
      enabled:
        type: boolean
      max_calls:
        $ref: '#/definitions/schedule.NullableInt'
      name:
        type: string
      pattern:
        type: string
    type: object
  searchproviders.CreateRequest:
    properties:
      config:
        additionalProperties: {}
        type: object
      name:
        type: string
      provider:
        $ref: '#/definitions/searchproviders.ProviderName'
    type: object
  searchproviders.GetResponse:
    properties:
      config:
        additionalProperties: {}
        type: object
      created_at:
        type: string
      id:
        type: string
      name:
        type: string
      provider:
        type: string
      updated_at:
        type: string
    type: object
  searchproviders.ProviderConfigSchema:
    properties:
      fields:
        additionalProperties:
          $ref: '#/definitions/searchproviders.ProviderFieldSchema'
        type: object
    type: object
  searchproviders.ProviderFieldSchema:
    properties:
      description:
        type: string
      enum:
        items:
          type: string
        type: array
      example: {}
      required:
        type: boolean
      title:
        type: string
      type:
        type: string
    type: object
  searchproviders.ProviderMeta:
    properties:
      config_schema:
        $ref: '#/definitions/searchproviders.ProviderConfigSchema'
      display_name:
        type: string
      provider:
        type: string
    type: object
  searchproviders.ProviderName:
    enum:
    - brave
    - bing
    - google
    - tavily
    - sogou
    - serper
    - searxng
    - jina
    - exa
    - bocha
    - duckduckgo
    - yandex
    type: string
    x-enum-varnames:
    - ProviderBrave
    - ProviderBing
    - ProviderGoogle
    - ProviderTavily
    - ProviderSogou
    - ProviderSerper
    - ProviderSearXNG
    - ProviderJina
    - ProviderExa
    - ProviderBocha
    - ProviderDuckDuckGo
    - ProviderYandex
  searchproviders.UpdateRequest:
    properties:
      config:
        additionalProperties: {}
        type: object
      name:
        type: string
      provider:
        $ref: '#/definitions/searchproviders.ProviderName'
    type: object
  settings.Settings:
    properties:
      allow_guest:
        type: boolean
      chat_model_id:
        type: string
      embedding_model_id:
        type: string
      heartbeat_enabled:
        type: boolean
      heartbeat_interval:
        type: integer
      heartbeat_model_id:
        type: string
      language:
        type: string
      max_context_load_time:
        type: integer
      max_context_tokens:
        type: integer
      max_inbox_items:
        type: integer
      memory_model_id:
        type: string
      reasoning_effort:
        type: string
      reasoning_enabled:
        type: boolean
      search_provider_id:
        type: string
    type: object
  settings.UpsertRequest:
    properties:
      allow_guest:
        type: boolean
      chat_model_id:
        type: string
      embedding_model_id:
        type: string
      heartbeat_enabled:
        type: boolean
      heartbeat_interval:
        type: integer
      heartbeat_model_id:
        type: string
      language:
        type: string
      max_context_load_time:
        type: integer
      max_context_tokens:
        type: integer
      max_inbox_items:
        type: integer
      memory_model_id:
        type: string
      reasoning_effort:
        type: string
      reasoning_enabled:
        type: boolean
      search_provider_id:
        type: string
    type: object
  subagent.AddSkillsRequest:
    properties:
      skills:
        items:
          type: string
        type: array
    type: object
  subagent.ContextResponse:
    properties:
      messages:
        items:
          additionalProperties: {}
          type: object
        type: array
      usage:
        additionalProperties: {}
        type: object
    type: object
  subagent.CreateRequest:
    properties:
      description:
        type: string
      messages:
        items:
          additionalProperties: {}
          type: object
        type: array
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
      skills:
        items:
          type: string
        type: array
    type: object
  subagent.ListResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/subagent.Subagent'
        type: array
    type: object
  subagent.SkillsResponse:
    properties:
      skills:
        items:
          type: string
        type: array
    type: object
  subagent.Subagent:
    properties:
      bot_id:
        type: string
      created_at:
        type: string
      deleted:
        type: boolean
      deleted_at:
        type: string
      description:
        type: string
      id:
        type: string
      messages:
        items:
          additionalProperties: {}
          type: object
        type: array
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
      skills:
        items:
          type: string
        type: array
      updated_at:
        type: string
      usage:
        additionalProperties: {}
        type: object
    type: object
  subagent.UpdateContextRequest:
    properties:
      messages:
        items:
          additionalProperties: {}
          type: object
        type: array
      usage:
        additionalProperties: {}
        type: object
    type: object
  subagent.UpdateRequest:
    properties:
      description:
        type: string
      metadata:
        additionalProperties: {}
        type: object
      name:
        type: string
    type: object
  subagent.UpdateSkillsRequest:
    properties:
      skills:
        items:
          type: string
        type: array
    type: object
info:
  contact: {}
  title: Memoh API
  version: 1.0.0
paths:
  /auth/login:
    post:
      description: Validate user credentials and issue a JWT
      parameters:
      - description: Login request
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.LoginRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.LoginResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Login
      tags:
      - auth
  /auth/refresh:
    post:
      description: Issue a new JWT using the existing claims with updated expiration
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.RefreshResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      security:
      - BearerAuth: []
      summary: Refresh Token
      tags:
      - auth
  /bots:
    get:
      description: List bots accessible to current user (admin can specify owner_id)
      parameters:
      - description: Owner user ID (admin only)
        in: query
        name: owner_id
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.ListBotsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List bots
      tags:
      - bots
    post:
      description: Create a bot user owned by current user (or admin-specified owner)
      parameters:
      - description: Bot payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/bots.CreateBotRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/bots.Bot'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create bot user
      tags:
      - bots
  /bots/{bot_id}/cli/messages:
    post:
      consumes:
      - application/json
      description: Post a user message (with optional attachments) through the local
        channel pipeline.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Message payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.LocalChannelMessageRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Send a message to a local channel
      tags:
      - local-channel
  /bots/{bot_id}/cli/stream:
    get:
      description: Open a persistent SSE connection to receive real-time stream events
        for the given bot.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      produces:
      - text/event-stream
      responses:
        "200":
          description: SSE stream
          schema:
            type: string
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Subscribe to local channel events via SSE
      tags:
      - local-channel
  /bots/{bot_id}/container:
    delete:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete MCP container for bot
      tags:
      - containerd
    get:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.GetContainerResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get container info for bot
      tags:
      - containerd
    post:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Create container payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.CreateContainerRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.CreateContainerResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create and start MCP container for bot
      tags:
      - containerd
  /bots/{bot_id}/container/fs:
    get:
      description: Returns metadata about a file or directory at the given container
        path
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Container path
        in: query
        name: path
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.FSFileInfo'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get file or directory info
      tags:
      - containerd
  /bots/{bot_id}/container/fs/delete:
    post:
      description: Deletes a file or directory at the given container path
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Delete request
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.FSDeleteRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.fsOpResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete a file or directory
      tags:
      - containerd
  /bots/{bot_id}/container/fs/download:
    get:
      description: Downloads a file from the container with appropriate Content-Type
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Container file path
        in: query
        name: path
        required: true
        type: string
      produces:
      - application/octet-stream
      responses:
        "200":
          description: OK
          schema:
            type: file
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Download a file as binary stream
      tags:
      - containerd
  /bots/{bot_id}/container/fs/list:
    get:
      description: Lists files and directories at the given container path
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Container directory path
        in: query
        name: path
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.FSListResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List directory contents
      tags:
      - containerd
  /bots/{bot_id}/container/fs/mkdir:
    post:
      description: Creates a directory (and parents) at the given container path
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Mkdir request
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.FSMkdirRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.fsOpResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create a directory
      tags:
      - containerd
  /bots/{bot_id}/container/fs/read:
    get:
      description: Reads the content of a file and returns it as a JSON string
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Container file path
        in: query
        name: path
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.FSReadResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Read file content as text
      tags:
      - containerd
  /bots/{bot_id}/container/fs/rename:
    post:
      description: Renames or moves a file/directory from oldPath to newPath
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Rename request
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.FSRenameRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.fsOpResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Rename or move a file/directory
      tags:
      - containerd
  /bots/{bot_id}/container/fs/upload:
    post:
      consumes:
      - multipart/form-data
      description: Uploads a binary file to the given container path
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Destination container path
        in: formData
        name: path
        required: true
        type: string
      - description: File to upload
        in: formData
        name: file
        required: true
        type: file
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.FSUploadResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Upload a file via multipart form
      tags:
      - containerd
  /bots/{bot_id}/container/fs/write:
    post:
      description: Creates or overwrites a file with the provided text content
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Write request
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.FSWriteRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.fsOpResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Write text content to a file
      tags:
      - containerd
  /bots/{bot_id}/container/skills:
    delete:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Delete skills payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.SkillsDeleteRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.skillsOpResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete skills from data directory
      tags:
      - containerd
    get:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.SkillsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List skills from data directory
      tags:
      - containerd
    post:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Skills payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.SkillsUpsertRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.skillsOpResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Upload skills into data directory
      tags:
      - containerd
  /bots/{bot_id}/container/snapshots:
    get:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Snapshotter name
        in: query
        name: snapshotter
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.ListSnapshotsResponse'
        "501":
          description: Snapshots currently not supported on this backend
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List snapshots
      tags:
      - containerd
    post:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Create snapshot payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.CreateSnapshotRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.CreateSnapshotResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "501":
          description: Snapshots currently not supported on this backend
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create container snapshot for bot
      tags:
      - containerd
  /bots/{bot_id}/container/start:
    post:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            type: object
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Start container task for bot
      tags:
      - containerd
  /bots/{bot_id}/container/stop:
    post:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            type: object
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Stop container task for bot
      tags:
      - containerd
  /bots/{bot_id}/email-bindings:
    get:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/email.BindingResponse'
            type: array
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List email bindings for a bot
      tags:
      - email-bindings
    post:
      consumes:
      - application/json
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Binding configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/email.CreateBindingRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/email.BindingResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Bind an email provider to a bot
      tags:
      - email-bindings
  /bots/{bot_id}/email-bindings/{id}:
    delete:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Binding ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Remove an email binding
      tags:
      - email-bindings
    put:
      consumes:
      - application/json
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Binding ID
        in: path
        name: id
        required: true
        type: string
      - description: Updated binding
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/email.UpdateBindingRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/email.BindingResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update an email binding
      tags:
      - email-bindings
  /bots/{bot_id}/email-outbox:
    get:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - default: 20
        description: Limit
        in: query
        name: limit
        type: integer
      - default: 0
        description: Offset
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties: true
            type: object
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List outbox emails for a bot (audit)
      tags:
      - email-outbox
  /bots/{bot_id}/email-outbox/{id}:
    get:
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Email ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/email.OutboxItemResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get outbox email detail
      tags:
      - email-outbox
  /bots/{bot_id}/heartbeat/logs:
    delete:
      description: Delete all heartbeat execution logs for a bot
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete heartbeat logs
      tags:
      - heartbeat
    get:
      description: List heartbeat execution logs for a bot
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Before timestamp (RFC3339)
        in: query
        name: before
        type: string
      - default: 50
        description: Limit
        in: query
        name: limit
        type: integer
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/heartbeat.ListLogsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List heartbeat logs
      tags:
      - heartbeat
  /bots/{bot_id}/inbox:
    get:
      description: List inbox items for a bot with optional filters
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Filter by read status (true/false)
        in: query
        name: is_read
        type: string
      - description: Filter by source
        in: query
        name: source
        type: string
      - default: 50
        description: Max items to return
        in: query
        name: limit
        type: integer
      - default: 0
        description: Offset for pagination
        in: query
        name: offset
        type: integer
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/inbox.Item'
            type: array
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List inbox items
      tags:
      - inbox
    post:
      description: Create a new inbox item (for external integrations)
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Inbox item payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/inbox.CreateRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/inbox.Item'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create inbox item
      tags:
      - inbox
  /bots/{bot_id}/inbox/{id}:
    delete:
      description: Delete a single inbox item
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Inbox item ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete inbox item
      tags:
      - inbox
    get:
      description: Get a single inbox item by ID
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Inbox item ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/inbox.Item'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get inbox item
      tags:
      - inbox
  /bots/{bot_id}/inbox/count:
    get:
      description: Count unread and total inbox items
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/inbox.CountResult'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Count inbox items
      tags:
      - inbox
  /bots/{bot_id}/inbox/mark-read:
    post:
      description: Batch mark inbox items as read
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Item IDs to mark as read
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.markReadRequest'
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Mark inbox items as read
      tags:
      - inbox
  /bots/{bot_id}/mcp:
    get:
      description: List MCP connections for a bot
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/mcp.ListResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List MCP connections
      tags:
      - mcp
    post:
      description: Create a MCP connection for a bot
      parameters:
      - description: MCP payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/mcp.UpsertRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create MCP connection
      tags:
      - mcp
  /bots/{bot_id}/mcp-ops/batch-delete:
    post:
      description: Delete multiple MCP connections by IDs.
      parameters:
      - description: IDs to delete
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.BatchDeleteRequest'
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Batch delete MCP connections
      tags:
      - mcp
  /bots/{bot_id}/mcp-stdio:
    post:
      description: Start a stdio MCP process in the bot container and expose it as
        MCP HTTP endpoint.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Stdio MCP payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.MCPStdioRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.MCPStdioResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create MCP stdio proxy
      tags:
      - containerd
  /bots/{bot_id}/mcp-stdio/{connection_id}:
    post:
      description: Proxies MCP JSON-RPC requests to a stdio MCP process in the container.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Connection ID
        in: path
        name: connection_id
        required: true
        type: string
      - description: JSON-RPC request
        in: body
        name: payload
        required: true
        schema:
          type: object
      responses:
        "200":
          description: 'JSON-RPC response: {jsonrpc,id,result|error}'
          schema:
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: MCP stdio proxy (JSON-RPC)
      tags:
      - containerd
  /bots/{bot_id}/mcp/{id}:
    delete:
      description: Delete a MCP connection by ID
      parameters:
      - description: MCP ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete MCP connection
      tags:
      - mcp
    get:
      description: Get a MCP connection by ID
      parameters:
      - description: MCP ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get MCP connection
      tags:
      - mcp
    put:
      description: Update a MCP connection by ID
      parameters:
      - description: MCP ID
        in: path
        name: id
        required: true
        type: string
      - description: MCP payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/mcp.UpsertRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/github_com_memohai_memoh_internal_mcp.Connection'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update MCP connection
      tags:
      - mcp
  /bots/{bot_id}/mcp/export:
    get:
      description: Export all MCP connections for a bot in standard mcpServers format.
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/mcp.ExportResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Export MCP connections
      tags:
      - mcp
  /bots/{bot_id}/mcp/import:
    put:
      description: Batch import MCP connections from standard mcpServers format. Existing
        connections (matched by name) get config updated with is_active preserved.
        New connections are created as active.
      parameters:
      - description: mcpServers dict
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/mcp.ImportRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/mcp.ListResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Import MCP connections
      tags:
      - mcp
  /bots/{bot_id}/memory:
    delete:
      consumes:
      - application/json
      description: Delete specific memories by IDs, or delete all memories if no IDs
        are provided
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: 'Optional: specify memory_ids to delete; if omitted, deletes
          all'
        in: body
        name: payload
        schema:
          $ref: '#/definitions/handlers.memoryDeletePayload'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.DeleteResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete memories
      tags:
      - memory
    get:
      description: List all memories in the bot-shared namespace
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Skip sparse vector stats (top_k_buckets, cdf_curve) to reduce
          overhead
        in: query
        name: no_stats
        type: boolean
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.SearchResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get all memories
      tags:
      - memory
    post:
      consumes:
      - application/json
      description: Add memory into the bot-shared namespace
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Memory add payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.memoryAddPayload'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.SearchResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Add memory
      tags:
      - memory
  /bots/{bot_id}/memory/{id}:
    delete:
      description: Delete a single memory by its ID
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Memory ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.DeleteResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete a single memory
      tags:
      - memory
  /bots/{bot_id}/memory/compact:
    post:
      consumes:
      - application/json
      description: |-
        Consolidate memories by merging similar/redundant entries using LLM.

        **ratio** (required, range (0,1]):
        - 0.8 = light compression, mostly dedup, keep ~80% of entries
        - 0.5 = moderate compression, merge similar facts, keep ~50%
        - 0.3 = aggressive compression, heavily consolidate, keep ~30%

        **decay_days** (optional): enable time decay — memories older than N days are treated as low priority and more likely to be merged/dropped.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: ratio (0,1] required; decay_days optional
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.memoryCompactPayload'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.CompactResult'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Compact memories
      tags:
      - memory
  /bots/{bot_id}/memory/rebuild:
    post:
      description: Read memory files from the container filesystem (source of truth)
        and restore missing entries to Qdrant
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.RebuildResult'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Rebuild memories from filesystem
      tags:
      - memory
  /bots/{bot_id}/memory/search:
    post:
      consumes:
      - application/json
      description: Search memory in the bot-shared namespace
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Memory search payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.memorySearchPayload'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.SearchResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Search memory
      tags:
      - memory
  /bots/{bot_id}/memory/usage:
    get:
      description: Query the estimated storage usage of current memories
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/memory.UsageResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "503":
          description: Service Unavailable
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get memory usage
      tags:
      - memory
  /bots/{bot_id}/messages:
    delete:
      description: Clear all persisted bot-level history messages
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete all bot history messages
      tags:
      - messages
    get:
      description: List messages for a bot history with optional pagination
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Limit
        in: query
        name: limit
        type: integer
      - description: Before
        in: query
        name: before
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              items:
                $ref: '#/definitions/message.Message'
              type: array
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List bot history messages
      tags:
      - messages
  /bots/{bot_id}/schedule:
    get:
      description: List schedules for current user
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/schedule.ListResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List schedules
      tags:
      - schedule
    post:
      description: Create a schedule for current user
      parameters:
      - description: Schedule payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/schedule.CreateRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/schedule.Schedule'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create schedule
      tags:
      - schedule
  /bots/{bot_id}/schedule/{id}:
    delete:
      description: Delete a schedule by ID
      parameters:
      - description: Schedule ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete schedule
      tags:
      - schedule
    get:
      description: Get a schedule by ID
      parameters:
      - description: Schedule ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/schedule.Schedule'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get schedule
      tags:
      - schedule
    put:
      description: Update a schedule by ID
      parameters:
      - description: Schedule ID
        in: path
        name: id
        required: true
        type: string
      - description: Schedule payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/schedule.UpdateRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/schedule.Schedule'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update schedule
      tags:
      - schedule
  /bots/{bot_id}/settings:
    delete:
      description: Remove agent settings for current user
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete user settings
      tags:
      - settings
    get:
      description: Get agent settings for current user
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/settings.Settings'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get user settings
      tags:
      - settings
    post:
      description: Update or create agent settings for current user
      parameters:
      - description: Settings payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/settings.UpsertRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/settings.Settings'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update user settings
      tags:
      - settings
    put:
      description: Update or create agent settings for current user
      parameters:
      - description: Settings payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/settings.UpsertRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/settings.Settings'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update user settings
      tags:
      - settings
  /bots/{bot_id}/subagents:
    get:
      description: List subagents for current user
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.ListResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List subagents
      tags:
      - subagent
    post:
      description: Create a subagent for current user
      parameters:
      - description: Subagent payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/subagent.CreateRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/subagent.Subagent'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create subagent
      tags:
      - subagent
  /bots/{bot_id}/subagents/{id}:
    delete:
      description: Delete a subagent by ID
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete subagent
      tags:
      - subagent
    get:
      description: Get a subagent by ID
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.Subagent'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get subagent
      tags:
      - subagent
    put:
      description: Update a subagent by ID
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      - description: Subagent payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/subagent.UpdateRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.Subagent'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update subagent
      tags:
      - subagent
  /bots/{bot_id}/subagents/{id}/context:
    get:
      description: Get a subagent's message context
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.ContextResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get subagent context
      tags:
      - subagent
    put:
      description: Update a subagent's message context
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      - description: Context payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/subagent.UpdateContextRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.ContextResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update subagent context
      tags:
      - subagent
  /bots/{bot_id}/subagents/{id}/skills:
    get:
      description: Get a subagent's skills
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.SkillsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get subagent skills
      tags:
      - subagent
    post:
      description: Add skills to a subagent
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      - description: Skills payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/subagent.AddSkillsRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.SkillsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Add subagent skills
      tags:
      - subagent
    put:
      description: Replace a subagent's skills
      parameters:
      - description: Subagent ID
        in: path
        name: id
        required: true
        type: string
      - description: Skills payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/subagent.UpdateSkillsRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/subagent.SkillsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update subagent skills
      tags:
      - subagent
  /bots/{bot_id}/token-usage:
    get:
      description: Get daily aggregated token usage for a bot, split by chat and heartbeat,
        with optional model filter and per-model breakdown
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Start date (YYYY-MM-DD)
        in: query
        name: from
        required: true
        type: string
      - description: End date exclusive (YYYY-MM-DD)
        in: query
        name: to
        required: true
        type: string
      - description: Optional model UUID to filter by
        in: query
        name: model_id
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.TokenUsageResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get token usage statistics
      tags:
      - token-usage
  /bots/{bot_id}/tools:
    post:
      description: MCP endpoint for tool discovery and invocation.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: JSON-RPC request
        in: body
        name: payload
        required: true
        schema:
          type: object
      responses:
        "200":
          description: 'JSON-RPC response: {jsonrpc,id,result|error}'
          schema:
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Unified MCP tools gateway
      tags:
      - containerd
  /bots/{bot_id}/web/messages:
    post:
      consumes:
      - application/json
      description: Post a user message (with optional attachments) through the local
        channel pipeline.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      - description: Message payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.LocalChannelMessageRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Send a message to a local channel
      tags:
      - local-channel
  /bots/{bot_id}/web/stream:
    get:
      description: Open a persistent SSE connection to receive real-time stream events
        for the given bot.
      parameters:
      - description: Bot ID
        in: path
        name: bot_id
        required: true
        type: string
      produces:
      - text/event-stream
      responses:
        "200":
          description: SSE stream
          schema:
            type: string
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Subscribe to local channel events via SSE
      tags:
      - local-channel
  /bots/{id}:
    delete:
      description: Delete a bot user (owner/admin only)
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "202":
          description: Accepted
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete bot
      tags:
      - bots
    get:
      description: Get a bot by ID (owner/admin only)
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.Bot'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get bot details
      tags:
      - bots
    put:
      description: Update bot profile (owner/admin only)
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Bot update payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/bots.UpdateBotRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.Bot'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update bot details
      tags:
      - bots
  /bots/{id}/channel/{platform}:
    delete:
      description: Remove bot channel configuration
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete bot channel config
      tags:
      - bots
    get:
      description: Get bot channel configuration
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.ChannelConfig'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get bot channel config
      tags:
      - bots
    put:
      description: Update bot channel configuration
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      - description: Channel config payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/channel.UpsertConfigRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.ChannelConfig'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update bot channel config
      tags:
      - bots
  /bots/{id}/channel/{platform}/send:
    post:
      description: Send a message using bot channel configuration
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      - description: Send payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/channel.SendRequest'
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Send message via bot channel
      tags:
      - bots
  /bots/{id}/channel/{platform}/send_chat:
    post:
      description: Send a message using a session-scoped token (reply only)
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      - description: Send payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/channel.SendRequest'
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Send message via bot channel session token
      tags:
      - bots
  /bots/{id}/channel/{platform}/status:
    patch:
      description: Update bot channel enabled/disabled status
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      - description: Channel status payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/channel.UpdateChannelStatusRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.ChannelConfig'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update bot channel status
      tags:
      - bots
  /bots/{id}/checks:
    get:
      description: Evaluate bot attached resource checks in runtime
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.ListChecksResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List bot runtime checks
      tags:
      - bots
  /bots/{id}/members:
    get:
      description: List members for a bot
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.ListMembersResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List bot members
      tags:
      - bots
    put:
      description: Add or update bot member role
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Member payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/bots.UpsertMemberRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.BotMember'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Upsert bot member
      tags:
      - bots
  /bots/{id}/members/{user_id}:
    delete:
      description: Remove a member from a bot
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: User ID
        in: path
        name: user_id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete bot member
      tags:
      - bots
  /bots/{id}/owner:
    put:
      description: Transfer bot ownership to another human user
      parameters:
      - description: Bot ID
        in: path
        name: id
        required: true
        type: string
      - description: Transfer payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/bots.TransferBotRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bots.Bot'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Transfer bot owner (admin only)
      tags:
      - bots
  /channels:
    get:
      description: List channel meta information including capabilities and schemas
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/handlers.ChannelMeta'
            type: array
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List channel capabilities and schemas
      tags:
      - channel
  /channels/{platform}:
    get:
      description: Get channel meta information including capabilities and schemas
      parameters:
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.ChannelMeta'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get channel capabilities and schemas
      tags:
      - channel
  /email-providers:
    get:
      parameters:
      - description: Provider type filter
        in: query
        name: provider
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/email.ProviderResponse'
            type: array
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List email providers
      tags:
      - email-providers
    post:
      consumes:
      - application/json
      parameters:
      - description: Email provider configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/email.CreateProviderRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/email.ProviderResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create an email provider
      tags:
      - email-providers
  /email-providers/{id}:
    delete:
      parameters:
      - description: Provider ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete an email provider
      tags:
      - email-providers
    get:
      parameters:
      - description: Provider ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/email.ProviderResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get an email provider
      tags:
      - email-providers
    put:
      consumes:
      - application/json
      parameters:
      - description: Provider ID
        in: path
        name: id
        required: true
        type: string
      - description: Updated configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/email.UpdateProviderRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/email.ProviderResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update an email provider
      tags:
      - email-providers
  /email-providers/meta:
    get:
      description: List available email provider types and config schemas
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/email.ProviderMeta'
            type: array
      summary: List email provider metadata
      tags:
      - email-providers
  /email/mailgun/webhook/{config_id}:
    post:
      description: Receives inbound emails from Mailgun
      parameters:
      - description: Email provider config ID
        in: path
        name: config_id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Mailgun inbound email webhook
      tags:
      - email-webhook
  /embeddings:
    post:
      description: Create text or multimodal embeddings
      parameters:
      - description: Embeddings request
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/handlers.EmbeddingsRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.EmbeddingsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "501":
          description: Not Implemented
          schema:
            $ref: '#/definitions/handlers.EmbeddingsResponse'
      summary: Create embeddings
      tags:
      - embeddings
  /models:
    get:
      description: Get a list of all configured models, optionally filtered by type
        or client type
      parameters:
      - description: Model type (chat, embedding)
        in: query
        name: type
        type: string
      - description: Client type (openai-responses, openai-completions, anthropic-messages,
          google-generative-ai)
        in: query
        name: client_type
        type: string
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/models.GetResponse'
            type: array
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List all models
      tags:
      - models
    post:
      description: Create a new model configuration
      parameters:
      - description: Model configuration
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/models.AddRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/models.AddResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create a new model
      tags:
      - models
  /models/{id}:
    delete:
      description: Delete a model configuration by its internal UUID
      parameters:
      - description: Model internal ID (UUID)
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete model by internal ID
      tags:
      - models
    get:
      description: Get a model configuration by its internal UUID
      parameters:
      - description: Model internal ID (UUID)
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get model by internal ID
      tags:
      - models
    put:
      description: Update a model configuration by its internal UUID
      parameters:
      - description: Model internal ID (UUID)
        in: path
        name: id
        required: true
        type: string
      - description: Updated model configuration
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/models.UpdateRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update model by internal ID
      tags:
      - models
  /models/count:
    get:
      description: Get the total count of models, optionally filtered by type
      parameters:
      - description: Model type (chat, embedding)
        in: query
        name: type
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.CountResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get model count
      tags:
      - models
  /models/model/{modelId}:
    delete:
      description: Delete a model configuration by its model_id field (e.g., gpt-4)
      parameters:
      - description: Model ID (e.g., gpt-4)
        in: path
        name: modelId
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete model by model ID
      tags:
      - models
    get:
      description: Get a model configuration by its model_id field (e.g., gpt-4)
      parameters:
      - description: Model ID (e.g., gpt-4)
        in: path
        name: modelId
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get model by model ID
      tags:
      - models
    put:
      description: Update a model configuration by its model_id field (e.g., gpt-4)
      parameters:
      - description: Model ID (e.g., gpt-4)
        in: path
        name: modelId
        required: true
        type: string
      - description: Updated model configuration
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/models.UpdateRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/models.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update model by model ID
      tags:
      - models
  /ping:
    get:
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.PingResponse'
      summary: Health check with server capabilities
      tags:
      - system
  /providers:
    get:
      consumes:
      - application/json
      description: Get a list of all configured LLM providers
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/providers.GetResponse'
            type: array
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List all LLM providers
      tags:
      - providers
    post:
      consumes:
      - application/json
      description: Create a new LLM provider configuration
      parameters:
      - description: Provider configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/providers.CreateRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/providers.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create a new LLM provider
      tags:
      - providers
  /providers/{id}:
    delete:
      consumes:
      - application/json
      description: Delete a provider configuration
      parameters:
      - description: Provider ID (UUID)
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete provider
      tags:
      - providers
    get:
      consumes:
      - application/json
      description: Get a provider configuration by its ID
      parameters:
      - description: Provider ID (UUID)
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/providers.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get provider by ID
      tags:
      - providers
    put:
      consumes:
      - application/json
      description: Update an existing provider configuration
      parameters:
      - description: Provider ID (UUID)
        in: path
        name: id
        required: true
        type: string
      - description: Updated provider configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/providers.UpdateRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/providers.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update provider
      tags:
      - providers
  /providers/{id}/models:
    get:
      description: Get models for a provider by id, optionally filtered by type
      parameters:
      - description: Provider ID (UUID)
        in: path
        name: id
        required: true
        type: string
      - description: Model type (chat, embedding)
        in: query
        name: type
        type: string
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/models.GetResponse'
            type: array
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List provider models
      tags:
      - providers
  /providers/{id}/test:
    post:
      consumes:
      - application/json
      description: Probe a provider's base URL to check reachability, supported client
        types, and embedding support
      parameters:
      - description: Provider ID (UUID)
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/providers.TestResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Test provider connectivity
      tags:
      - providers
  /providers/count:
    get:
      consumes:
      - application/json
      description: Get the total count of providers
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/providers.CountResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Count providers
      tags:
      - providers
  /providers/name/{name}:
    get:
      consumes:
      - application/json
      description: Get a provider configuration by its name
      parameters:
      - description: Provider name
        in: path
        name: name
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/providers.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get provider by name
      tags:
      - providers
  /search-providers:
    get:
      consumes:
      - application/json
      description: List configured search providers
      parameters:
      - description: Provider filter (brave)
        in: query
        name: provider
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/searchproviders.GetResponse'
            type: array
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List search providers
      tags:
      - search-providers
    post:
      consumes:
      - application/json
      description: Create a search provider configuration
      parameters:
      - description: Search provider configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/searchproviders.CreateRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/searchproviders.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create a search provider
      tags:
      - search-providers
  /search-providers/{id}:
    delete:
      consumes:
      - application/json
      description: Delete search provider by ID
      parameters:
      - description: Provider ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Delete a search provider
      tags:
      - search-providers
    get:
      consumes:
      - application/json
      description: Get search provider by ID
      parameters:
      - description: Provider ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/searchproviders.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get a search provider
      tags:
      - search-providers
    put:
      consumes:
      - application/json
      description: Update search provider by ID
      parameters:
      - description: Provider ID
        in: path
        name: id
        required: true
        type: string
      - description: Updated configuration
        in: body
        name: request
        required: true
        schema:
          $ref: '#/definitions/searchproviders.UpdateRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/searchproviders.GetResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update a search provider
      tags:
      - search-providers
  /search-providers/meta:
    get:
      description: List available search provider types and config schemas
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/searchproviders.ProviderMeta'
            type: array
      summary: List search provider metadata
      tags:
      - search-providers
  /users:
    get:
      description: List users
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/accounts.ListAccountsResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List users (admin only)
      tags:
      - users
    post:
      description: Create a new human user account
      parameters:
      - description: User payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/accounts.CreateAccountRequest'
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/accounts.Account'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Create human user (admin only)
      tags:
      - users
  /users/{id}:
    get:
      description: Get user details (self or admin only)
      parameters:
      - description: User ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/accounts.Account'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get user by ID
      tags:
      - users
    put:
      description: Update user profile and status
      parameters:
      - description: User ID
        in: path
        name: id
        required: true
        type: string
      - description: User update payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/accounts.UpdateAccountRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/accounts.Account'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update user (admin only)
      tags:
      - users
  /users/{id}/password:
    put:
      description: Reset a user password
      parameters:
      - description: User ID
        in: path
        name: id
        required: true
        type: string
      - description: Password payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/accounts.ResetPasswordRequest'
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Reset user password (admin only)
      tags:
      - users
  /users/me:
    get:
      description: Get current user profile
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/accounts.Account'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get current user
      tags:
      - users
    put:
      description: Update current user display name or avatar
      parameters:
      - description: Profile payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/accounts.UpdateProfileRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/accounts.Account'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update current user profile
      tags:
      - users
  /users/me/channels/{platform}:
    get:
      description: Get channel binding configuration for current user
      parameters:
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.ChannelIdentityBinding'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Get channel user config
      tags:
      - channel
    put:
      description: Update channel binding configuration for current user
      parameters:
      - description: Channel platform
        in: path
        name: platform
        required: true
        type: string
      - description: Channel user config payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/channel.UpsertChannelIdentityConfigRequest'
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.ChannelIdentityBinding'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update channel user config
      tags:
      - channel
  /users/me/identities:
    get:
      description: List all channel identities linked to current user
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/handlers.listMyIdentitiesResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "404":
          description: Not Found
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: List current user's channel identities
      tags:
      - users
  /users/me/password:
    put:
      description: Update current user password with current password check
      parameters:
      - description: Password payload
        in: body
        name: payload
        required: true
        schema:
          $ref: '#/definitions/accounts.UpdatePasswordRequest'
      responses:
        "204":
          description: No Content
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/handlers.ErrorResponse'
      summary: Update current user password
      tags:
      - users
swagger: "2.0"
