type AboutServerPayload {
  buildTime: LongString!

  buildType: String!

  discord: String!

  github: String!

  name: String!

  revision: String!

  version: String!
}

type AboutWebUI {
  channel: String!

  tag: String!
}

enum BackupRestoreState {
  IDLE

  SUCCESS

  FAILURE

  RESTORING_CATEGORIES

  RESTORING_MANGA
}

type BackupRestoreStatus {
  mangaProgress: Int!

  state: BackupRestoreState!

  totalManga: Int!
}

input BindTrackInput {
  clientMutationId: String

  mangaId: Int!

  remoteId: LongString!

  trackerId: Int!
}

type BindTrackPayload {
  clientMutationId: String

  trackRecord: TrackRecordType!
}

input BooleanFilterInput {
  distinctFrom: Boolean

  equalTo: Boolean

  greaterThan: Boolean

  greaterThanOrEqualTo: Boolean

  in: [Boolean!]

  isNull: Boolean

  lessThan: Boolean

  lessThanOrEqualTo: Boolean

  notDistinctFrom: Boolean

  notEqualTo: Boolean

  notIn: [Boolean!]
}

input CategoryConditionInput {
  default: Boolean

  id: Int

  name: String

  order: Int
}

type CategoryEdge implements Edge {
  cursor: Cursor!

  node: CategoryType!
}

input CategoryFilterInput {
  and: [CategoryFilterInput!]

  default: BooleanFilterInput

  id: IntFilterInput

  name: StringFilterInput

  not: CategoryFilterInput

  or: [CategoryFilterInput!]

  order: IntFilterInput
}

type CategoryMetaType implements MetaType {
  categoryId: Int!

  key: String!

  value: String!

  category: CategoryType!
}

input CategoryMetaTypeInput {
  categoryId: Int!

  key: String!

  value: String!
}

type CategoryNodeList implements NodeList {
  edges: [CategoryEdge!]!

  nodes: [CategoryType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum CategoryOrderBy {
  ID

  NAME

  ORDER
}

type CategoryType {
  default: Boolean!

  id: Int!

  includeInDownload: IncludeOrExclude!

  includeInUpdate: IncludeOrExclude!

  name: String!

  order: Int!

  mangas: MangaNodeList!

  meta: [CategoryMetaType!]!
}

input ChapterConditionInput {
  chapterNumber: Float

  fetchedAt: LongString

  id: Int

  isBookmarked: Boolean

  isDownloaded: Boolean

  isRead: Boolean

  lastPageRead: Int

  lastReadAt: LongString

  mangaId: Int

  name: String

  pageCount: Int

  realUrl: String

  scanlator: String

  sourceOrder: Int

  uploadDate: LongString

  url: String
}

type ChapterEdge implements Edge {
  cursor: Cursor!

  node: ChapterType!
}

input ChapterFilterInput {
  and: [ChapterFilterInput!]

  chapterNumber: FloatFilterInput

  fetchedAt: LongFilterInput

  id: IntFilterInput

  inLibrary: BooleanFilterInput

  isBookmarked: BooleanFilterInput

  isDownloaded: BooleanFilterInput

  isRead: BooleanFilterInput

  lastPageRead: IntFilterInput

  lastReadAt: LongFilterInput

  mangaId: IntFilterInput

  name: StringFilterInput

  not: ChapterFilterInput

  or: [ChapterFilterInput!]

  pageCount: IntFilterInput

  realUrl: StringFilterInput

  scanlator: StringFilterInput

  sourceOrder: IntFilterInput

  uploadDate: LongFilterInput

  url: StringFilterInput
}

type ChapterMetaType implements MetaType {
  chapterId: Int!

  key: String!

  value: String!

  chapter: ChapterType!
}

input ChapterMetaTypeInput {
  chapterId: Int!

  key: String!

  value: String!
}

type ChapterNodeList implements NodeList {
  edges: [ChapterEdge!]!

  nodes: [ChapterType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum ChapterOrderBy {
  ID

  SOURCE_ORDER

  NAME

  UPLOAD_DATE

  CHAPTER_NUMBER

  LAST_READ_AT

  FETCHED_AT
}

type ChapterType {
  chapterNumber: Float!

  fetchedAt: LongString!

  id: Int!

  isBookmarked: Boolean!

  isDownloaded: Boolean!

  isRead: Boolean!

  lastPageRead: Int!

  lastReadAt: LongString!

  mangaId: Int!

  name: String!

  pageCount: Int!

  realUrl: String

  scanlator: String

  sourceOrder: Int!

  uploadDate: LongString!

  url: String!

  manga: MangaType!

  meta: [ChapterMetaType!]!
}

type CheckBoxFilter {
  default: Boolean!

  name: String!
}

type CheckBoxPreference {
  currentValue: Boolean

  default: Boolean!

  key: String!

  summary: String

  title: String!

  visible: Boolean!
}

type CheckForServerUpdatesPayload {
  channel: String!

  tag: String!

  url: String!
}

input ClearCachedImagesInput {
  cachedPages: Boolean

  cachedThumbnails: Boolean

  clientMutationId: String

  downloadedThumbnails: Boolean
}

type ClearCachedImagesPayload {
  cachedPages: Boolean

  cachedThumbnails: Boolean

  clientMutationId: String

  downloadedThumbnails: Boolean
}

input ClearDownloaderInput {
  clientMutationId: String
}

type ClearDownloaderPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input CreateBackupInput {
  clientMutationId: String

  includeCategories: Boolean

  includeChapters: Boolean
}

type CreateBackupPayload {
  clientMutationId: String

  url: String!
}

input CreateCategoryInput {
  clientMutationId: String

  default: Boolean

  includeInDownload: IncludeOrExclude

  includeInUpdate: IncludeOrExclude

  name: String!

  order: Int
}

type CreateCategoryPayload {
  category: CategoryType!

  clientMutationId: String
}

"""
A location in a connection that can be used for resuming pagination.
"""
scalar Cursor

input DeleteCategoryInput {
  categoryId: Int!

  clientMutationId: String
}

input DeleteCategoryMetaInput {
  categoryId: Int!

  clientMutationId: String

  key: String!
}

type DeleteCategoryMetaPayload {
  category: CategoryType!

  clientMutationId: String

  meta: CategoryMetaType
}

type DeleteCategoryPayload {
  category: CategoryType

  clientMutationId: String

  mangas: [MangaType!]!
}

input DeleteChapterMetaInput {
  chapterId: Int!

  clientMutationId: String

  key: String!
}

type DeleteChapterMetaPayload {
  chapter: ChapterType!

  clientMutationId: String

  meta: ChapterMetaType
}

input DeleteDownloadedChapterInput {
  clientMutationId: String

  id: Int!
}

type DeleteDownloadedChapterPayload {
  chapters: ChapterType!

  clientMutationId: String
}

input DeleteDownloadedChaptersInput {
  clientMutationId: String

  ids: [Int!]!
}

type DeleteDownloadedChaptersPayload {
  chapters: [ChapterType!]!

  clientMutationId: String
}

input DeleteGlobalMetaInput {
  clientMutationId: String

  key: String!
}

type DeleteGlobalMetaPayload {
  clientMutationId: String

  meta: GlobalMetaType
}

input DeleteMangaMetaInput {
  clientMutationId: String

  key: String!

  mangaId: Int!
}

type DeleteMangaMetaPayload {
  clientMutationId: String

  manga: MangaType!

  meta: MangaMetaType
}

input DeleteSourceMetaInput {
  clientMutationId: String

  key: String!

  sourceId: LongString!
}

type DeleteSourceMetaPayload {
  clientMutationId: String

  meta: SourceMetaType

  source: SourceType
}

input DequeueChapterDownloadInput {
  clientMutationId: String

  id: Int!
}

type DequeueChapterDownloadPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input DequeueChapterDownloadsInput {
  clientMutationId: String

  ids: [Int!]!
}

type DequeueChapterDownloadsPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input DoubleFilterInput {
  distinctFrom: Float

  equalTo: Float

  greaterThan: Float

  greaterThanOrEqualTo: Float

  in: [Float!]

  isNull: Boolean

  lessThan: Float

  lessThanOrEqualTo: Float

  notDistinctFrom: Float

  notEqualTo: Float

  notIn: [Float!]
}

type DownloadEdge implements Edge {
  cursor: Cursor!

  node: DownloadType!
}

type DownloadNodeList implements NodeList {
  edges: [DownloadEdge!]!

  nodes: [DownloadType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum DownloadState {
  QUEUED

  DOWNLOADING

  FINISHED

  ERROR
}

type DownloadStatus {
  queue: [DownloadType!]!

  state: DownloaderState!
}

type DownloadType {
  progress: Float!

  state: DownloadState!

  tries: Int!

  chapter: ChapterType!

  manga: MangaType!
}

enum DownloaderState {
  STARTED

  STOPPED
}

interface Edge {
  """
  A cursor for use in pagination.
  """
  cursor: Cursor!

  """
  The [T] at the end of the edge.
  """
  node: Node!
}

type EditTextPreference {
  currentValue: String

  default: String

  dialogMessage: String

  dialogTitle: String

  key: String!

  summary: String

  text: String

  title: String

  visible: Boolean!
}

input EnqueueChapterDownloadInput {
  clientMutationId: String

  id: Int!
}

type EnqueueChapterDownloadPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input EnqueueChapterDownloadsInput {
  clientMutationId: String

  ids: [Int!]!
}

type EnqueueChapterDownloadsPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input ExtensionConditionInput {
  apkName: String

  hasUpdate: Boolean

  iconUrl: String

  isInstalled: Boolean

  isNsfw: Boolean

  isObsolete: Boolean

  lang: String

  name: String

  pkgName: String

  repo: String

  versionCode: Int

  versionName: String
}

type ExtensionEdge implements Edge {
  cursor: Cursor!

  node: ExtensionType!
}

input ExtensionFilterInput {
  and: [ExtensionFilterInput!]

  apkName: StringFilterInput

  hasUpdate: BooleanFilterInput

  iconUrl: StringFilterInput

  isInstalled: BooleanFilterInput

  isNsfw: BooleanFilterInput

  isObsolete: BooleanFilterInput

  lang: StringFilterInput

  name: StringFilterInput

  not: ExtensionFilterInput

  or: [ExtensionFilterInput!]

  pkgName: StringFilterInput

  repo: StringFilterInput

  versionCode: IntFilterInput

  versionName: StringFilterInput
}

type ExtensionNodeList implements NodeList {
  edges: [ExtensionEdge!]!

  nodes: [ExtensionType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum ExtensionOrderBy {
  PKG_NAME

  NAME

  APK_NAME
}

type ExtensionType {
  apkName: String!

  hasUpdate: Boolean!

  iconUrl: String!

  isInstalled: Boolean!

  isNsfw: Boolean!

  isObsolete: Boolean!

  lang: String!

  name: String!

  pkgName: String!

  repo: String

  versionCode: Int!

  versionName: String!

  source: SourceNodeList!
}

input FetchChapterPagesInput {
  chapterId: Int!

  clientMutationId: String
}

type FetchChapterPagesPayload {
  chapter: ChapterType!

  clientMutationId: String

  pages: [String!]!
}

input FetchChaptersInput {
  clientMutationId: String

  mangaId: Int!
}

type FetchChaptersPayload {
  chapters: [ChapterType!]!

  clientMutationId: String
}

input FetchExtensionsInput {
  clientMutationId: String
}

type FetchExtensionsPayload {
  clientMutationId: String

  extensions: [ExtensionType!]!
}

input FetchMangaInput {
  clientMutationId: String

  id: Int!
}

type FetchMangaPayload {
  clientMutationId: String

  manga: MangaType!
}

input FetchSourceMangaInput {
  clientMutationId: String

  filters: [FilterChangeInput!]

  page: Int!

  query: String

  source: LongString!

  type: FetchSourceMangaType!
}

type FetchSourceMangaPayload {
  clientMutationId: String

  hasNextPage: Boolean!

  mangas: [MangaType!]!
}

enum FetchSourceMangaType {
  SEARCH

  POPULAR

  LATEST
}

union Filter = CheckBoxFilter|GroupFilter|HeaderFilter|SelectFilter|SeparatorFilter|SortFilter|TextFilter|TriStateFilter

input FilterChangeInput {
  checkBoxState: Boolean

  groupChange: FilterChangeInput

  position: Int!

  selectState: Int

  sortState: SortSelectionInput

  textState: String

  triState: TriState
}

input FloatFilterInput {
  distinctFrom: Float

  equalTo: Float

  greaterThan: Float

  greaterThanOrEqualTo: Float

  in: [Float!]

  isNull: Boolean

  lessThan: Float

  lessThanOrEqualTo: Float

  notDistinctFrom: Float

  notEqualTo: Float

  notIn: [Float!]
}

type GlobalMetaNodeList implements NodeList {
  edges: [MetaEdge!]!

  nodes: [GlobalMetaType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

type GlobalMetaType implements MetaType {
  key: String!

  value: String!
}

input GlobalMetaTypeInput {
  key: String!

  value: String!
}

type GroupFilter {
  filters: [Filter!]!

  name: String!
}

type HeaderFilter {
  name: String!
}

enum IncludeOrExclude {
  EXCLUDE

  INCLUDE

  UNSET
}

input InstallExternalExtensionInput {
  clientMutationId: String

  extensionFile: Upload!
}

type InstallExternalExtensionPayload {
  clientMutationId: String

  extension: ExtensionType!
}

input IntFilterInput {
  distinctFrom: Int

  equalTo: Int

  greaterThan: Int

  greaterThanOrEqualTo: Int

  in: [Int!]

  isNull: Boolean

  lessThan: Int

  lessThanOrEqualTo: Int

  notDistinctFrom: Int

  notEqualTo: Int

  notIn: [Int!]
}

type LastUpdateTimestampPayload {
  timestamp: LongString!
}

type ListPreference {
  currentValue: String

  default: String

  entries: [String!]!

  entryValues: [String!]!

  key: String!

  summary: String

  title: String

  visible: Boolean!
}

input LoginTrackerCredentialsInput {
  clientMutationId: String

  password: String!

  trackerId: Int!

  username: String!
}

type LoginTrackerCredentialsPayload {
  clientMutationId: String

  isLoggedIn: Boolean!

  tracker: TrackerType!
}

input LoginTrackerOAuthInput {
  callbackUrl: String!

  clientMutationId: String

  trackerId: Int!
}

type LoginTrackerOAuthPayload {
  clientMutationId: String

  isLoggedIn: Boolean!

  tracker: TrackerType!
}

input LogoutTrackerInput {
  clientMutationId: String

  trackerId: Int!
}

type LogoutTrackerPayload {
  clientMutationId: String

  isLoggedIn: Boolean!

  tracker: TrackerType!
}

input LongFilterInput {
  distinctFrom: LongString

  equalTo: LongString

  greaterThan: LongString

  greaterThanOrEqualTo: LongString

  in: [LongString!]

  isNull: Boolean

  lessThan: LongString

  lessThanOrEqualTo: LongString

  notDistinctFrom: LongString

  notEqualTo: LongString

  notIn: [LongString!]
}

"""
A 64-bit signed integer as a String
"""
scalar LongString

input MangaConditionInput {
  artist: String

  author: String

  categoryIds: [Int!]

  chaptersLastFetchedAt: LongString

  description: String

  genre: [String!]

  id: Int

  inLibrary: Boolean

  inLibraryAt: LongString

  initialized: Boolean

  lastFetchedAt: LongString

  realUrl: String

  sourceId: LongString

  status: MangaStatus

  thumbnailUrl: String

  title: String

  url: String
}

type MangaEdge implements Edge {
  cursor: Cursor!

  node: MangaType!
}

input MangaFilterInput {
  and: [MangaFilterInput!]

  artist: StringFilterInput

  author: StringFilterInput

  categoryId: IntFilterInput

  chaptersLastFetchedAt: LongFilterInput

  description: StringFilterInput

  genre: StringFilterInput

  id: IntFilterInput

  inLibrary: BooleanFilterInput

  inLibraryAt: LongFilterInput

  initialized: BooleanFilterInput

  lastFetchedAt: LongFilterInput

  not: MangaFilterInput

  or: [MangaFilterInput!]

  realUrl: StringFilterInput

  sourceId: LongFilterInput

  status: MangaStatusFilterInput

  thumbnailUrl: StringFilterInput

  title: StringFilterInput

  url: StringFilterInput
}

type MangaMetaType implements MetaType {
  key: String!

  mangaId: Int!

  value: String!

  manga: MangaType!
}

input MangaMetaTypeInput {
  key: String!

  mangaId: Int!

  value: String!
}

type MangaNodeList implements NodeList {
  edges: [MangaEdge!]!

  nodes: [MangaType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum MangaOrderBy {
  ID

  TITLE

  IN_LIBRARY_AT

  LAST_FETCHED_AT
}

enum MangaStatus {
  UNKNOWN

  ONGOING

  COMPLETED

  LICENSED

  PUBLISHING_FINISHED

  CANCELLED

  ON_HIATUS
}

input MangaStatusFilterInput {
  distinctFrom: MangaStatus

  equalTo: MangaStatus

  greaterThan: MangaStatus

  greaterThanOrEqualTo: MangaStatus

  in: [MangaStatus!]

  isNull: Boolean

  lessThan: MangaStatus

  lessThanOrEqualTo: MangaStatus

  notDistinctFrom: MangaStatus

  notEqualTo: MangaStatus

  notIn: [MangaStatus!]
}

type MangaType {
  artist: String

  author: String

  chaptersLastFetchedAt: LongString

  description: String

  genre: [String!]!

  id: Int!

  inLibrary: Boolean!

  inLibraryAt: LongString!

  initialized: Boolean!

  lastFetchedAt: LongString

  realUrl: String

  sourceId: LongString!

  status: MangaStatus!

  thumbnailUrl: String

  thumbnailUrlLastFetched: LongString

  title: String!

  updateStrategy: UpdateStrategy!

  url: String!

  age: LongString

  categories: CategoryNodeList!

  chapters: ChapterNodeList!

  chaptersAge: LongString

  downloadCount: Int!

  lastReadChapter: ChapterType

  latestFetchedChapter: ChapterType

  latestReadChapter: ChapterType

  latestUploadedChapter: ChapterType

  meta: [MangaMetaType!]!

  source: SourceType

  trackRecords: TrackRecordNodeList!

  unreadCount: Int!
}

input MetaConditionInput {
  key: String

  value: String
}

type MetaEdge implements Edge {
  cursor: Cursor!

  node: GlobalMetaType!
}

input MetaFilterInput {
  and: [MetaFilterInput!]

  key: StringFilterInput

  not: MetaFilterInput

  or: [MetaFilterInput!]

  value: StringFilterInput
}

enum MetaOrderBy {
  KEY

  VALUE
}

interface MetaType {
  key: String!

  value: String!
}

type MultiSelectListPreference {
  currentValue: [String!]

  default: [String!]

  dialogMessage: String

  dialogTitle: String

  entries: [String!]!

  entryValues: [String!]!

  key: String!

  summary: String

  title: String

  visible: Boolean!
}

type Mutation {
  createBackup(input: CreateBackupInput): CreateBackupPayload!

  restoreBackup(input: RestoreBackupInput!): RestoreBackupPayload!

  createCategory(input: CreateCategoryInput!): CreateCategoryPayload!

  deleteCategory(input: DeleteCategoryInput!): DeleteCategoryPayload!

  deleteCategoryMeta(input: DeleteCategoryMetaInput!): DeleteCategoryMetaPayload!

  setCategoryMeta(input: SetCategoryMetaInput!): SetCategoryMetaPayload!

  updateCategories(input: UpdateCategoriesInput!): UpdateCategoriesPayload!

  updateCategory(input: UpdateCategoryInput!): UpdateCategoryPayload!

  updateCategoryOrder(input: UpdateCategoryOrderInput!): UpdateCategoryOrderPayload!

  updateMangaCategories(input: UpdateMangaCategoriesInput!): UpdateMangaCategoriesPayload!

  updateMangasCategories(input: UpdateMangasCategoriesInput!): UpdateMangasCategoriesPayload!

  deleteChapterMeta(input: DeleteChapterMetaInput!): DeleteChapterMetaPayload!

  fetchChapterPages(input: FetchChapterPagesInput!): FetchChapterPagesPayload!

  fetchChapters(input: FetchChaptersInput!): FetchChaptersPayload!

  setChapterMeta(input: SetChapterMetaInput!): SetChapterMetaPayload!

  updateChapter(input: UpdateChapterInput!): UpdateChapterPayload!

  updateChapters(input: UpdateChaptersInput!): UpdateChaptersPayload!

  clearDownloader(input: ClearDownloaderInput!): ClearDownloaderPayload!

  deleteDownloadedChapter(input: DeleteDownloadedChapterInput!): DeleteDownloadedChapterPayload!

  deleteDownloadedChapters(input: DeleteDownloadedChaptersInput!): DeleteDownloadedChaptersPayload!

  dequeueChapterDownload(input: DequeueChapterDownloadInput!): DequeueChapterDownloadPayload!

  dequeueChapterDownloads(input: DequeueChapterDownloadsInput!): DequeueChapterDownloadsPayload!

  enqueueChapterDownload(input: EnqueueChapterDownloadInput!): EnqueueChapterDownloadPayload!

  enqueueChapterDownloads(input: EnqueueChapterDownloadsInput!): EnqueueChapterDownloadsPayload!

  reorderChapterDownload(input: ReorderChapterDownloadInput!): ReorderChapterDownloadPayload!

  startDownloader(input: StartDownloaderInput!): StartDownloaderPayload!

  stopDownloader(input: StopDownloaderInput!): StopDownloaderPayload!

  fetchExtensions(input: FetchExtensionsInput!): FetchExtensionsPayload!

  installExternalExtension(input: InstallExternalExtensionInput!): InstallExternalExtensionPayload!

  updateExtension(input: UpdateExtensionInput!): UpdateExtensionPayload!

  updateExtensions(input: UpdateExtensionsInput!): UpdateExtensionsPayload!

  clearCachedImages(input: ClearCachedImagesInput!): ClearCachedImagesPayload!

  resetWebUIUpdateStatus: WebUIUpdateStatus!

  updateWebUI(input: WebUIUpdateInput!): WebUIUpdatePayload!

  deleteMangaMeta(input: DeleteMangaMetaInput!): DeleteMangaMetaPayload!

  fetchManga(input: FetchMangaInput!): FetchMangaPayload!

  setMangaMeta(input: SetMangaMetaInput!): SetMangaMetaPayload!

  updateManga(input: UpdateMangaInput!): UpdateMangaPayload!

  updateMangas(input: UpdateMangasInput!): UpdateMangasPayload!

  deleteGlobalMeta(input: DeleteGlobalMetaInput!): DeleteGlobalMetaPayload!

  setGlobalMeta(input: SetGlobalMetaInput!): SetGlobalMetaPayload!

  resetSettings(input: ResetSettingsInput!): ResetSettingsPayload!

  setSettings(input: SetSettingsInput!): SetSettingsPayload!

  deleteSourceMeta(input: DeleteSourceMetaInput!): DeleteSourceMetaPayload!

  fetchSourceManga(input: FetchSourceMangaInput!): FetchSourceMangaPayload!

  setSourceMeta(input: SetSourceMetaInput!): SetSourceMetaPayload!

  updateSourcePreference(input: UpdateSourcePreferenceInput!): UpdateSourcePreferencePayload!

  bindTrack(input: BindTrackInput!): BindTrackPayload!

  loginTrackerCredentials(input: LoginTrackerCredentialsInput!): LoginTrackerCredentialsPayload!

  loginTrackerOAuth(input: LoginTrackerOAuthInput!): LoginTrackerOAuthPayload!

  logoutTracker(input: LogoutTrackerInput!): LogoutTrackerPayload!

  updateTrack(input: UpdateTrackInput!): UpdateTrackPayload!

  updateCategoryManga(input: UpdateCategoryMangaInput!): UpdateCategoryMangaPayload!

  updateLibraryManga(input: UpdateLibraryMangaInput!): UpdateLibraryMangaPayload!

  updateStop(input: UpdateStopInput!): UpdateStopPayload!
}

union Node = CategoryMetaType|CategoryType|ChapterMetaType|ChapterType|DownloadType|ExtensionType|GlobalMetaType|MangaMetaType|MangaType|PartialSettingsType|SettingsType|SourceMetaType|SourceType|TrackRecordType|TrackerType

interface NodeList {
  """
  A list of edges which contains the [T] and cursor to aid in pagination.
  """
  edges: [Edge!]!

  """
  A list of [T] objects.
  """
  nodes: [Node!]!

  """
  Information to aid in pagination.
  """
  pageInfo: PageInfo!

  """
  The count of all nodes you could get from the connection.
  """
  totalCount: Int!
}

type PageInfo {
  """
  When paginating forwards, the cursor to continue.
  """
  endCursor: Cursor

  """
  When paginating forwards, are there more items?
  """
  hasNextPage: Boolean!

  """
  When paginating backwards, are there more items?
  """
  hasPreviousPage: Boolean!

  """
  When paginating backwards, the cursor to continue.
  """
  startCursor: Cursor
}

type PartialSettingsType implements Settings {
  autoDownloadAheadLimit: Int @deprecated(reason: "Replaced with autoDownloadNewChaptersLimit, replace with autoDownloadNewChaptersLimit")

  autoDownloadNewChapters: Boolean

  autoDownloadNewChaptersLimit: Int

  backupInterval: Int

  backupPath: String

  backupTTL: Int

  backupTime: String

  basicAuthEnabled: Boolean

  basicAuthPassword: String

  basicAuthUsername: String

  debugLogsEnabled: Boolean

  downloadAsCbz: Boolean

  downloadsPath: String

  electronPath: String

  excludeCompleted: Boolean

  excludeEntryWithUnreadChapters: Boolean

  excludeNotStarted: Boolean

  excludeUnreadChapters: Boolean

  extensionRepos: [String!]

  flareSolverrEnabled: Boolean

  flareSolverrSessionName: String

  flareSolverrSessionTtl: Int

  flareSolverrTimeout: Int

  flareSolverrUrl: String

  globalUpdateInterval: Float

  gqlDebugLogsEnabled: Boolean

  initialOpenInBrowserEnabled: Boolean

  ip: String

  localSourcePath: String

  maxSourcesInParallel: Int

  port: Int

  socksProxyEnabled: Boolean

  socksProxyHost: String

  socksProxyPassword: String

  socksProxyPort: String

  socksProxyUsername: String

  socksProxyVersion: Int

  systemTrayEnabled: Boolean

  updateMangas: Boolean

  webUIChannel: WebUIChannel

  webUIFlavor: WebUIFlavor

  webUIInterface: WebUIInterface

  webUIUpdateCheckInterval: Float
}

input PartialSettingsTypeInput {
  autoDownloadAheadLimit: Int @deprecated(reason: "Replaced with autoDownloadNewChaptersLimit, replace with autoDownloadNewChaptersLimit")

  autoDownloadNewChapters: Boolean

  autoDownloadNewChaptersLimit: Int

  backupInterval: Int

  backupPath: String

  backupTTL: Int

  backupTime: String

  basicAuthEnabled: Boolean

  basicAuthPassword: String

  basicAuthUsername: String

  debugLogsEnabled: Boolean

  downloadAsCbz: Boolean

  downloadsPath: String

  electronPath: String

  excludeCompleted: Boolean

  excludeEntryWithUnreadChapters: Boolean

  excludeNotStarted: Boolean

  excludeUnreadChapters: Boolean

  extensionRepos: [String!]

  flareSolverrEnabled: Boolean

  flareSolverrSessionName: String

  flareSolverrSessionTtl: Int

  flareSolverrTimeout: Int

  flareSolverrUrl: String

  globalUpdateInterval: Float

  gqlDebugLogsEnabled: Boolean

  initialOpenInBrowserEnabled: Boolean

  ip: String

  localSourcePath: String

  maxSourcesInParallel: Int

  port: Int

  socksProxyEnabled: Boolean

  socksProxyHost: String

  socksProxyPassword: String

  socksProxyPort: String

  socksProxyUsername: String

  socksProxyVersion: Int

  systemTrayEnabled: Boolean

  updateMangas: Boolean

  webUIChannel: WebUIChannel

  webUIFlavor: WebUIFlavor

  webUIInterface: WebUIInterface

  webUIUpdateCheckInterval: Float
}

union Preference = CheckBoxPreference|EditTextPreference|ListPreference|MultiSelectListPreference|SwitchPreference

type Query {
  restoreStatus(id: String!): BackupRestoreStatus

  validateBackup(input: ValidateBackupInput!): ValidateBackupResult!

  categories(condition: CategoryConditionInput, filter: CategoryFilterInput, orderBy: CategoryOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): CategoryNodeList!

  category(id: Int!): CategoryType!

  chapter(id: Int!): ChapterType!

  chapters(condition: ChapterConditionInput, filter: ChapterFilterInput, orderBy: ChapterOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): ChapterNodeList!

  downloadStatus: DownloadStatus!

  extension(pkgName: String!): ExtensionType!

  extensions(condition: ExtensionConditionInput, filter: ExtensionFilterInput, orderBy: ExtensionOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): ExtensionNodeList!

  aboutServer: AboutServerPayload!

  aboutWebUI: AboutWebUI!

  checkForServerUpdates: [CheckForServerUpdatesPayload!]!

  checkForWebUIUpdate: WebUIUpdateCheck!

  getWebUIUpdateStatus: WebUIUpdateStatus!

  manga(id: Int!): MangaType!

  mangas(condition: MangaConditionInput, filter: MangaFilterInput, orderBy: MangaOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): MangaNodeList!

  meta(key: String!): GlobalMetaType!

  metas(condition: MetaConditionInput, filter: MetaFilterInput, orderBy: MetaOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): GlobalMetaNodeList!

  settings: SettingsType!

  source(id: LongString!): SourceType!

  sources(condition: SourceConditionInput, filter: SourceFilterInput, orderBy: SourceOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): SourceNodeList!

  searchTracker(input: SearchTrackerInput!): SearchTrackerPayload!

  trackRecord(id: Int!): TrackRecordType!

  trackRecords(condition: TrackRecordConditionInput, filter: TrackRecordFilterInput, orderBy: TrackRecordOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): TrackRecordNodeList!

  tracker(id: Int!): TrackerType!

  trackers(condition: TrackerConditionInput, orderBy: TrackerOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): TrackerNodeList!

  lastUpdateTimestamp: LastUpdateTimestampPayload!

  updateStatus: UpdateStatus!
}

input ReorderChapterDownloadInput {
  chapterId: Int!

  clientMutationId: String

  to: Int!
}

type ReorderChapterDownloadPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input ResetSettingsInput {
  clientMutationId: String
}

type ResetSettingsPayload {
  clientMutationId: String

  settings: SettingsType!
}

input RestoreBackupInput {
  backup: Upload!

  clientMutationId: String
}

type RestoreBackupPayload {
  clientMutationId: String

  id: String!

  status: BackupRestoreStatus
}

input SearchTrackerInput {
  query: String!

  trackerId: Int!
}

type SearchTrackerPayload {
  trackSearches: [TrackSearchType!]!
}

type SelectFilter {
  default: Int!

  name: String!

  values: [String!]!
}

type SeparatorFilter {
  name: String!
}

input SetCategoryMetaInput {
  clientMutationId: String

  meta: CategoryMetaTypeInput!
}

type SetCategoryMetaPayload {
  clientMutationId: String

  meta: CategoryMetaType!
}

input SetChapterMetaInput {
  clientMutationId: String

  meta: ChapterMetaTypeInput!
}

type SetChapterMetaPayload {
  clientMutationId: String

  meta: ChapterMetaType!
}

input SetGlobalMetaInput {
  clientMutationId: String

  meta: GlobalMetaTypeInput!
}

type SetGlobalMetaPayload {
  clientMutationId: String

  meta: GlobalMetaType!
}

input SetMangaMetaInput {
  clientMutationId: String

  meta: MangaMetaTypeInput!
}

type SetMangaMetaPayload {
  clientMutationId: String

  meta: MangaMetaType!
}

input SetSettingsInput {
  clientMutationId: String

  settings: PartialSettingsTypeInput!
}

type SetSettingsPayload {
  clientMutationId: String

  settings: SettingsType!
}

input SetSourceMetaInput {
  clientMutationId: String

  meta: SourceMetaTypeInput!
}

type SetSourceMetaPayload {
  clientMutationId: String

  meta: SourceMetaType!
}

interface Settings {
  autoDownloadAheadLimit: Int @deprecated(reason: "Replaced with autoDownloadNewChaptersLimit, replace with autoDownloadNewChaptersLimit")

  autoDownloadNewChapters: Boolean

  autoDownloadNewChaptersLimit: Int

  backupInterval: Int

  backupPath: String

  backupTTL: Int

  backupTime: String

  basicAuthEnabled: Boolean

  basicAuthPassword: String

  basicAuthUsername: String

  debugLogsEnabled: Boolean

  downloadAsCbz: Boolean

  downloadsPath: String

  electronPath: String

  excludeCompleted: Boolean

  excludeEntryWithUnreadChapters: Boolean

  excludeNotStarted: Boolean

  excludeUnreadChapters: Boolean

  extensionRepos: [String!]

  flareSolverrEnabled: Boolean

  flareSolverrSessionName: String

  flareSolverrSessionTtl: Int

  flareSolverrTimeout: Int

  flareSolverrUrl: String

  globalUpdateInterval: Float

  gqlDebugLogsEnabled: Boolean

  initialOpenInBrowserEnabled: Boolean

  ip: String

  localSourcePath: String

  maxSourcesInParallel: Int

  port: Int

  socksProxyEnabled: Boolean

  socksProxyHost: String

  socksProxyPassword: String

  socksProxyPort: String

  socksProxyUsername: String

  socksProxyVersion: Int

  systemTrayEnabled: Boolean

  updateMangas: Boolean

  webUIChannel: WebUIChannel

  webUIFlavor: WebUIFlavor

  webUIInterface: WebUIInterface

  webUIUpdateCheckInterval: Float
}

type SettingsType implements Settings {
  autoDownloadAheadLimit: Int! @deprecated(reason: "Replaced with autoDownloadNewChaptersLimit, replace with autoDownloadNewChaptersLimit")

  autoDownloadNewChapters: Boolean!

  autoDownloadNewChaptersLimit: Int!

  backupInterval: Int!

  backupPath: String!

  backupTTL: Int!

  backupTime: String!

  basicAuthEnabled: Boolean!

  basicAuthPassword: String!

  basicAuthUsername: String!

  debugLogsEnabled: Boolean!

  downloadAsCbz: Boolean!

  downloadsPath: String!

  electronPath: String!

  excludeCompleted: Boolean!

  excludeEntryWithUnreadChapters: Boolean!

  excludeNotStarted: Boolean!

  excludeUnreadChapters: Boolean!

  extensionRepos: [String!]!

  flareSolverrEnabled: Boolean!

  flareSolverrSessionName: String!

  flareSolverrSessionTtl: Int!

  flareSolverrTimeout: Int!

  flareSolverrUrl: String!

  globalUpdateInterval: Float!

  gqlDebugLogsEnabled: Boolean!

  initialOpenInBrowserEnabled: Boolean!

  ip: String!

  localSourcePath: String!

  maxSourcesInParallel: Int!

  port: Int!

  socksProxyEnabled: Boolean!

  socksProxyHost: String!

  socksProxyPassword: String!

  socksProxyPort: String!

  socksProxyUsername: String!

  socksProxyVersion: Int!

  systemTrayEnabled: Boolean!

  updateMangas: Boolean!

  webUIChannel: WebUIChannel!

  webUIFlavor: WebUIFlavor!

  webUIInterface: WebUIInterface!

  webUIUpdateCheckInterval: Float!
}

type SortFilter {
  default: SortSelection

  name: String!

  values: [String!]!
}

enum SortOrder {
  ASC

  DESC

  ASC_NULLS_FIRST

  DESC_NULLS_FIRST

  ASC_NULLS_LAST

  DESC_NULLS_LAST
}

type SortSelection {
  ascending: Boolean!

  index: Int!
}

input SortSelectionInput {
  ascending: Boolean!

  index: Int!
}

input SourceConditionInput {
  id: LongString

  isNsfw: Boolean

  lang: String

  name: String
}

type SourceEdge implements Edge {
  cursor: Cursor!

  node: SourceType!
}

input SourceFilterInput {
  and: [SourceFilterInput!]

  id: LongFilterInput

  isNsfw: BooleanFilterInput

  lang: StringFilterInput

  name: StringFilterInput

  not: SourceFilterInput

  or: [SourceFilterInput!]
}

type SourceMetaType implements MetaType {
  key: String!

  sourceId: LongString!

  value: String!

  source: SourceType!
}

input SourceMetaTypeInput {
  key: String!

  sourceId: LongString!

  value: String!
}

type SourceNodeList implements NodeList {
  edges: [SourceEdge!]!

  nodes: [SourceType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum SourceOrderBy {
  ID

  NAME

  LANG
}

input SourcePreferenceChangeInput {
  checkBoxState: Boolean

  editTextState: String

  listState: String

  multiSelectState: [String!]

  position: Int!

  switchState: Boolean
}

type SourceType {
  displayName: String!

  iconUrl: String!

  id: LongString!

  isConfigurable: Boolean!

  isNsfw: Boolean!

  lang: String!

  name: String!

  supportsLatest: Boolean!

  extension: ExtensionType!

  filters: [Filter!]!

  manga: MangaNodeList!

  meta: [SourceMetaType!]!

  preferences: [Preference!]!
}

input StartDownloaderInput {
  clientMutationId: String
}

type StartDownloaderPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input StopDownloaderInput {
  clientMutationId: String
}

type StopDownloaderPayload {
  clientMutationId: String

  downloadStatus: DownloadStatus!
}

input StringFilterInput {
  distinctFrom: String

  distinctFromInsensitive: String

  endsWith: String

  endsWithInsensitive: String

  equalTo: String

  greaterThan: String

  greaterThanInsensitive: String

  greaterThanOrEqualTo: String

  greaterThanOrEqualToInsensitive: String

  in: [String!]

  inInsensitive: [String!]

  includes: String

  includesInsensitive: String

  isNull: Boolean

  lessThan: String

  lessThanInsensitive: String

  lessThanOrEqualTo: String

  lessThanOrEqualToInsensitive: String

  like: String

  likeInsensitive: String

  notDistinctFrom: String

  notDistinctFromInsensitive: String

  notEndsWith: String

  notEndsWithInsensitive: String

  notEqualTo: String

  notIn: [String!]

  notInInsensitive: [String!]

  notIncludes: String

  notIncludesInsensitive: String

  notLike: String

  notLikeInsensitive: String

  notStartsWith: String

  notStartsWithInsensitive: String

  startsWith: String

  startsWithInsensitive: String
}

type Subscription {
  downloadChanged: DownloadStatus!

  webUIUpdateStatusChange: WebUIUpdateStatus!

  updateStatusChanged: UpdateStatus!
}

type SwitchPreference {
  currentValue: Boolean

  default: Boolean!

  key: String!

  summary: String

  title: String!

  visible: Boolean!
}

type TextFilter {
  default: String!

  name: String!
}

input TrackRecordConditionInput {
  finishDate: LongString

  id: Int

  lastChapterRead: Float

  libraryId: LongString

  mangaId: Int

  remoteId: LongString

  remoteUrl: String

  score: Float

  startDate: LongString

  status: Int

  title: String

  totalChapters: Int

  trackerId: Int
}

type TrackRecordEdge implements Edge {
  cursor: Cursor!

  node: TrackRecordType!
}

input TrackRecordFilterInput {
  and: [TrackRecordFilterInput!]

  finishDate: LongFilterInput

  id: IntFilterInput

  lastChapterRead: DoubleFilterInput

  libraryId: LongFilterInput

  mangaId: IntFilterInput

  not: TrackRecordFilterInput

  or: [TrackRecordFilterInput!]

  remoteId: LongFilterInput

  remoteUrl: StringFilterInput

  score: DoubleFilterInput

  startDate: LongFilterInput

  status: IntFilterInput

  title: StringFilterInput

  totalChapters: IntFilterInput

  trackerId: IntFilterInput
}

type TrackRecordNodeList implements NodeList {
  edges: [TrackRecordEdge!]!

  nodes: [TrackRecordType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum TrackRecordOrderBy {
  ID

  MANGA_ID

  TRACKER_ID

  REMOTE_ID

  TITLE

  LAST_CHAPTER_READ

  TOTAL_CHAPTERS

  SCORE

  START_DATE

  FINISH_DATE
}

type TrackRecordType {
  finishDate: LongString!

  id: Int!

  lastChapterRead: Float!

  libraryId: LongString

  mangaId: Int!

  remoteId: LongString!

  remoteUrl: String!

  score: Float!

  startDate: LongString!

  status: Int!

  title: String!

  totalChapters: Int!

  trackerId: Int!

  displayScore: String!

  manga: MangaType!

  tracker: TrackerType!
}

type TrackSearchType {
  coverUrl: String!

  id: Int!

  publishingStatus: String!

  publishingType: String!

  remoteId: LongString!

  startDate: String!

  summary: String!

  title: String!

  totalChapters: Int!

  trackerId: Int!

  trackingUrl: String!

  tracker: TrackerType!
}

type TrackStatusType {
  name: String!

  value: Int!
}

input TrackerConditionInput {
  icon: String

  id: Int

  isLoggedIn: Boolean

  name: String
}

type TrackerEdge implements Edge {
  cursor: Cursor!

  node: TrackerType!
}

type TrackerNodeList implements NodeList {
  edges: [TrackerEdge!]!

  nodes: [TrackerType!]!

  pageInfo: PageInfo!

  totalCount: Int!
}

enum TrackerOrderBy {
  ID

  NAME

  IS_LOGGED_IN
}

type TrackerType {
  authUrl: String

  icon: String!

  id: Int!

  isLoggedIn: Boolean!

  name: String!

  isTokenExpired: Boolean!

  scores: [String!]!

  statuses: [TrackStatusType!]!

  trackRecords: TrackRecordNodeList!
}

enum TriState {
  IGNORE

  INCLUDE

  EXCLUDE
}

type TriStateFilter {
  default: TriState!

  name: String!
}

input UpdateCategoriesInput {
  clientMutationId: String

  ids: [Int!]!

  patch: UpdateCategoryPatchInput!
}

type UpdateCategoriesPayload {
  categories: [CategoryType!]!

  clientMutationId: String
}

input UpdateCategoryInput {
  clientMutationId: String

  id: Int!

  patch: UpdateCategoryPatchInput!
}

input UpdateCategoryMangaInput {
  categories: [Int!]!

  clientMutationId: String
}

type UpdateCategoryMangaPayload {
  clientMutationId: String

  updateStatus: UpdateStatus!
}

input UpdateCategoryOrderInput {
  clientMutationId: String

  id: Int!

  position: Int!
}

type UpdateCategoryOrderPayload {
  categories: [CategoryType!]!

  clientMutationId: String
}

input UpdateCategoryPatchInput {
  default: Boolean

  includeInDownload: IncludeOrExclude

  includeInUpdate: IncludeOrExclude

  name: String
}

type UpdateCategoryPayload {
  category: CategoryType!

  clientMutationId: String
}

input UpdateChapterInput {
  clientMutationId: String

  id: Int!

  patch: UpdateChapterPatchInput!
}

input UpdateChapterPatchInput {
  isBookmarked: Boolean

  isRead: Boolean

  lastPageRead: Int
}

type UpdateChapterPayload {
  chapter: ChapterType!

  clientMutationId: String
}

input UpdateChaptersInput {
  clientMutationId: String

  ids: [Int!]!

  patch: UpdateChapterPatchInput!
}

type UpdateChaptersPayload {
  chapters: [ChapterType!]!

  clientMutationId: String
}

input UpdateExtensionInput {
  clientMutationId: String

  id: String!

  patch: UpdateExtensionPatchInput!
}

input UpdateExtensionPatchInput {
  install: Boolean

  uninstall: Boolean

  update: Boolean
}

type UpdateExtensionPayload {
  clientMutationId: String

  extension: ExtensionType
}

input UpdateExtensionsInput {
  clientMutationId: String

  ids: [String!]!

  patch: UpdateExtensionPatchInput!
}

type UpdateExtensionsPayload {
  clientMutationId: String

  extensions: [ExtensionType!]!
}

input UpdateLibraryMangaInput {
  clientMutationId: String
}

type UpdateLibraryMangaPayload {
  clientMutationId: String

  updateStatus: UpdateStatus!
}

input UpdateMangaCategoriesInput {
  clientMutationId: String

  id: Int!

  patch: UpdateMangaCategoriesPatchInput!
}

input UpdateMangaCategoriesPatchInput {
  addToCategories: [Int!]

  clearCategories: Boolean

  removeFromCategories: [Int!]
}

type UpdateMangaCategoriesPayload {
  clientMutationId: String

  manga: MangaType!
}

input UpdateMangaInput {
  clientMutationId: String

  id: Int!

  patch: UpdateMangaPatchInput!
}

input UpdateMangaPatchInput {
  inLibrary: Boolean
}

type UpdateMangaPayload {
  clientMutationId: String

  manga: MangaType!
}

input UpdateMangasCategoriesInput {
  clientMutationId: String

  ids: [Int!]!

  patch: UpdateMangaCategoriesPatchInput!
}

type UpdateMangasCategoriesPayload {
  clientMutationId: String

  mangas: [MangaType!]!
}

input UpdateMangasInput {
  clientMutationId: String

  ids: [Int!]!

  patch: UpdateMangaPatchInput!
}

type UpdateMangasPayload {
  clientMutationId: String

  mangas: [MangaType!]!
}

input UpdateSourcePreferenceInput {
  change: SourcePreferenceChangeInput!

  clientMutationId: String

  source: LongString!
}

type UpdateSourcePreferencePayload {
  clientMutationId: String

  preferences: [Preference!]!

  source: SourceType!
}

enum UpdateState {
  IDLE

  DOWNLOADING

  FINISHED

  ERROR
}

type UpdateStatus {
  completeJobs: UpdateStatusType!

  failedJobs: UpdateStatusType!

  isRunning: Boolean!

  pendingJobs: UpdateStatusType!

  runningJobs: UpdateStatusType!

  skippedCategories: UpdateStatusCategoryType!

  skippedJobs: UpdateStatusType!

  updatingCategories: UpdateStatusCategoryType!
}

type UpdateStatusCategoryType {
  categories: CategoryNodeList!
}

type UpdateStatusType {
  mangas: MangaNodeList!
}

input UpdateStopInput {
  clientMutationId: String
}

type UpdateStopPayload {
  clientMutationId: String
}

enum UpdateStrategy {
  ALWAYS_UPDATE

  ONLY_FETCH_ONCE
}

input UpdateTrackInput {
  clientMutationId: String

  finishDate: LongString

  lastChapterRead: Float

  recordId: Int!

  scoreString: String

  startDate: LongString

  status: Int

  unbind: Boolean
}

type UpdateTrackPayload {
  clientMutationId: String

  trackRecord: TrackRecordType
}

"""
A file part in a multipart request
"""
scalar Upload

input ValidateBackupInput {
  backup: Upload!
}

type ValidateBackupResult {
  missingSources: [ValidateBackupSource!]!
}

type ValidateBackupSource {
  id: LongString!

  name: String!
}

enum WebUIChannel {
  BUNDLED

  STABLE

  PREVIEW
}

enum WebUIFlavor {
  WEBUI

  VUI

  CUSTOM
}

enum WebUIInterface {
  BROWSER

  ELECTRON
}

type WebUIUpdateCheck {
  channel: String!

  tag: String!

  updateAvailable: Boolean!
}

type WebUIUpdateInfo {
  channel: String!

  tag: String!
}

input WebUIUpdateInput {
  clientMutationId: String
}

type WebUIUpdatePayload {
  clientMutationId: String

  updateStatus: WebUIUpdateStatus!
}

type WebUIUpdateStatus {
  info: WebUIUpdateInfo!

  progress: Int!

  state: UpdateState!
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
type __Directive {
  """
  The __Directive type represents a Directive that a server supports.
  """
  name: String!

  description: String

  isRepeatable: Boolean!

  locations: [__DirectiveLocation!]!

  args(includeDeprecated: Boolean = false): [__InputValue!]!
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
An enum describing valid locations where a directive can be placed
"""
enum __DirectiveLocation {
  """
  Indicates the directive is valid on queries.
  """
  QUERY

  """
  Indicates the directive is valid on mutations.
  """
  MUTATION

  """
  Indicates the directive is valid on subscriptions.
  """
  SUBSCRIPTION

  """
  Indicates the directive is valid on fields.
  """
  FIELD

  """
  Indicates the directive is valid on fragment definitions.
  """
  FRAGMENT_DEFINITION

  """
  Indicates the directive is valid on fragment spreads.
  """
  FRAGMENT_SPREAD

  """
  Indicates the directive is valid on inline fragments.
  """
  INLINE_FRAGMENT

  """
  Indicates the directive is valid on variable definitions.
  """
  VARIABLE_DEFINITION

  """
  Indicates the directive is valid on a schema SDL definition.
  """
  SCHEMA

  """
  Indicates the directive is valid on a scalar SDL definition.
  """
  SCALAR

  """
  Indicates the directive is valid on an object SDL definition.
  """
  OBJECT

  """
  Indicates the directive is valid on a field SDL definition.
  """
  FIELD_DEFINITION

  """
  Indicates the directive is valid on a field argument SDL definition.
  """
  ARGUMENT_DEFINITION

  """
  Indicates the directive is valid on an interface SDL definition.
  """
  INTERFACE

  """
  Indicates the directive is valid on an union SDL definition.
  """
  UNION

  """
  Indicates the directive is valid on an enum SDL definition.
  """
  ENUM

  """
  Indicates the directive is valid on an enum value SDL definition.
  """
  ENUM_VALUE

  """
  Indicates the directive is valid on an input object SDL definition.
  """
  INPUT_OBJECT

  """
  Indicates the directive is valid on an input object field SDL definition.
  """
  INPUT_FIELD_DEFINITION
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
type __EnumValue {
  name: String!

  description: String

  isDeprecated: Boolean!

  deprecationReason: String
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
type __Field {
  name: String!

  description: String

  args(includeDeprecated: Boolean = false): [__InputValue!]!

  type: __Type!

  isDeprecated: Boolean!

  deprecationReason: String
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
type __InputValue {
  name: String!

  description: String

  type: __Type!

  defaultValue: String

  isDeprecated: Boolean

  deprecationReason: String
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations.
"""
type __Schema {
  description: String

  """
  A list of all types supported by this server.
  """
  types: [__Type!]!

  """
  The type that query operations will be rooted at.
  """
  queryType: __Type!

  """
  If this server supports mutation, the type that mutation operations will be rooted at.
  """
  mutationType: __Type

  """
  'A list of all directives supported by this server.
  """
  directives: [__Directive!]!

  """
  'If this server support subscription, the type that subscription operations will be rooted at.
  """
  subscriptionType: __Type
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
type __Type {
  kind: __TypeKind!

  name: String

  description: String

  fields(includeDeprecated: Boolean = false): [__Field!]

  interfaces: [__Type!]

  possibleTypes: [__Type!]

  enumValues(includeDeprecated: Boolean = false): [__EnumValue!]

  inputFields(includeDeprecated: Boolean = false): [__InputValue!]

  ofType: __Type

  specifiedByURL: String

  specifiedByUrl: String @deprecated(reason: "This legacy name has been replaced by `specifiedByURL`")
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
An enum describing what kind of type a given __Type is
"""
enum __TypeKind {
  """
  Indicates this type is a scalar. 'specifiedByURL' is a valid field
  """
  SCALAR

  """
  Indicates this type is an object. `fields` and `interfaces` are valid fields.
  """
  OBJECT

  """
  Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.
  """
  INTERFACE

  """
  Indicates this type is a union. `possibleTypes` is a valid field.
  """
  UNION

  """
  Indicates this type is an enum. `enumValues` is a valid field.
  """
  ENUM

  """
  Indicates this type is an input object. `inputFields` is a valid field.
  """
  INPUT_OBJECT

  """
  Indicates this type is a list. `ofType` is a valid field.
  """
  LIST

  """
  Indicates this type is a non-null. `ofType` is a valid field.
  """
  NON_NULL
}

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
Directs the executor to include this field or fragment only when the `if` argument is true
"""
directive @include ("Included when true." if: Boolean!) on FIELD|FRAGMENT_SPREAD|INLINE_FRAGMENT

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
Directs the executor to skip this field or fragment when the `if` argument is true.
"""
directive @skip ("Skipped when true." if: Boolean!) on FIELD|FRAGMENT_SPREAD|INLINE_FRAGMENT

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
Marks the field, argument, input field or enum value as deprecated
"""
directive @deprecated ("The reason for the deprecation" reason: String = "No longer supported") on FIELD_DEFINITION|ARGUMENT_DEFINITION|ENUM_VALUE|INPUT_FIELD_DEFINITION

# See https://github.com/JetBrains/js-graphql-intellij-plugin/issues/665
# noinspection GraphQLTypeRedefinition
"""
Exposes a URL that specifies the behaviour of this scalar.
"""
directive @specifiedBy ("The URL that specifies the behaviour of this scalar." url: String!) on SCALAR

schema {
  query: Query
  mutation: Mutation
  subscription: Subscription
}
