// Code generated by tools/openapigen. DO NOT EDIT.
import { z } from 'zod';
export const GeoKindSchema = z.string();
export type GeoKind = z.infer<typeof GeoKindSchema>;

export const OnlineAPISupportSchema = z.number().int();
export type OnlineAPISupport = z.infer<typeof OnlineAPISupportSchema>;

export const ProcessStateSchema = z.string();
export type ProcessState = z.infer<typeof ProcessStateSchema>;

export const ProtocolSchema = z.string();
export type Protocol = z.infer<typeof ProtocolSchema>;

export const SubLinkProviderSchema = z.unknown();
export type SubLinkProvider = z.infer<typeof SubLinkProviderSchema>;

export const staticEgressResolverSchema = z.string();
export type staticEgressResolver = z.infer<typeof staticEgressResolverSchema>;

export const trafficLocalApplyActionSchema = z.number().int();
export type trafficLocalApplyAction = z.infer<typeof trafficLocalApplyActionSchema>;

export const transportBitsSchema = z.number().int();
export type transportBits = z.infer<typeof transportBitsSchema>;

export const AllSettingSchema = z.object({
  datepicker: z.string(),
  expireDiff: z.number().int().min(0),
  externalTrafficInformEnable: z.boolean(),
  externalTrafficInformURI: z.string(),
  ipLimitAllowlist: z.string(),
  ldapAutoCreate: z.boolean(),
  ldapAutoDelete: z.boolean(),
  ldapBaseDN: z.string(),
  ldapBindDN: z.string(),
  ldapDefaultExpiryDays: z.number().int().min(0),
  ldapDefaultLimitIP: z.number().int().min(0),
  ldapDefaultTotalGB: z.number().int().min(0),
  ldapEnable: z.boolean(),
  ldapFlagField: z.string(),
  ldapHost: z.string(),
  ldapInboundTags: z.string(),
  ldapInsecureSkipVerify: z.boolean(),
  ldapInvertFlag: z.boolean(),
  ldapPassword: z.string(),
  ldapPort: z.number().int().min(0).max(65535),
  ldapSyncCron: z.string(),
  ldapTruthyValues: z.string(),
  ldapUseTLS: z.boolean(),
  ldapUserAttr: z.string(),
  ldapUserFilter: z.string(),
  ldapVlessField: z.string(),
  outboundDownThreshold: z.number().int().min(1).max(100),
  pageSize: z.number().int().min(0).max(1000),
  panelOutbound: z.string(),
  remarkTemplate: z.string(),
  restartXrayOnClientDisable: z.boolean(),
  sessionMaxAge: z.number().int().min(1).max(525600),
  smtpCpu: z.number().int().min(0).max(100),
  smtpEnable: z.boolean(),
  smtpEnabledEvents: z.string(),
  smtpEncryptionType: z.string(),
  smtpFrom: z.string(),
  smtpFromName: z.string(),
  smtpHost: z.string(),
  smtpMemory: z.number().int().min(0).max(100),
  smtpPassword: z.string(),
  smtpPort: z.number().int().min(1).max(65535),
  smtpTo: z.string(),
  smtpUsername: z.string(),
  subAnnounce: z.string(),
  subCertFile: z.string(),
  subClashAutoDetect: z.boolean(),
  subClashEnable: z.boolean(),
  subClashEnableRouting: z.boolean(),
  subClashPath: z.string(),
  subClashRules: z.string(),
  subClashURI: z.string(),
  subClashUserAgentRegex: z.string(),
  subDomain: z.string(),
  subEnable: z.boolean(),
  subEnableRouting: z.boolean(),
  subEncrypt: z.boolean(),
  subHideSettings: z.boolean(),
  subIncyEnableRouting: z.boolean(),
  subIncyRoutingRules: z.string(),
  subJsonAlwaysArray: z.boolean(),
  subJsonAutoDetect: z.boolean(),
  subJsonEnable: z.boolean(),
  subJsonFinalMask: z.string(),
  subJsonMux: z.string(),
  subJsonObservatory: z.string(),
  subJsonPath: z.string(),
  subJsonRules: z.string(),
  subJsonURI: z.string(),
  subJsonUserAgentRegex: z.string(),
  subKeyFile: z.string(),
  subListen: z.string(),
  subPath: z.string(),
  subPort: z.number().int().min(1).max(65535),
  subProfileUrl: z.string(),
  subRoutingRules: z.string(),
  subShowIdentityOnAllLinks: z.boolean(),
  subSupportUrl: z.string(),
  subThemeDir: z.string(),
  subTitle: z.string(),
  subURI: z.string(),
  subUpdates: z.number().int().min(0).max(525600),
  tgBotAPIServer: z.string(),
  tgBotBackup: z.boolean(),
  tgBotChatId: z.string(),
  tgBotEnable: z.boolean(),
  tgBotProxy: z.string(),
  tgBotToken: z.string(),
  tgCpu: z.number().int().min(0).max(100),
  tgEnabledEvents: z.string(),
  tgLang: z.string(),
  tgMemory: z.number().int().min(0).max(100),
  tgRunTime: z.string(),
  timeLocation: z.string(),
  trafficDiff: z.number().int().min(0).max(100),
  trustedProxyCIDRs: z.string(),
  twoFactorEnable: z.boolean(),
  twoFactorToken: z.string(),
  warpUpdateInterval: z.number().int().min(0),
  webBasePath: z.string(),
  webCertFile: z.string(),
  webDomain: z.string(),
  webKeyFile: z.string(),
  webListen: z.string(),
  webPort: z.number().int().min(1).max(65535),
});
export type AllSetting = z.infer<typeof AllSettingSchema>;

export const AllSettingViewSchema = z.object({
  datepicker: z.string(),
  expireDiff: z.number().int().min(0),
  externalTrafficInformEnable: z.boolean(),
  externalTrafficInformURI: z.string(),
  hasApiToken: z.boolean(),
  hasLdapPassword: z.boolean(),
  hasNordSecret: z.boolean(),
  hasSmtpPassword: z.boolean(),
  hasTgBotToken: z.boolean(),
  hasTwoFactorToken: z.boolean(),
  hasWarpSecret: z.boolean(),
  ipLimitAllowlist: z.string(),
  ldapAutoCreate: z.boolean(),
  ldapAutoDelete: z.boolean(),
  ldapBaseDN: z.string(),
  ldapBindDN: z.string(),
  ldapDefaultExpiryDays: z.number().int().min(0),
  ldapDefaultLimitIP: z.number().int().min(0),
  ldapDefaultTotalGB: z.number().int().min(0),
  ldapEnable: z.boolean(),
  ldapFlagField: z.string(),
  ldapHost: z.string(),
  ldapInboundTags: z.string(),
  ldapInsecureSkipVerify: z.boolean(),
  ldapInvertFlag: z.boolean(),
  ldapPassword: z.string(),
  ldapPort: z.number().int().min(0).max(65535),
  ldapSyncCron: z.string(),
  ldapTruthyValues: z.string(),
  ldapUseTLS: z.boolean(),
  ldapUserAttr: z.string(),
  ldapUserFilter: z.string(),
  ldapVlessField: z.string(),
  outboundDownThreshold: z.number().int().min(1).max(100),
  pageSize: z.number().int().min(0).max(1000),
  panelOutbound: z.string(),
  remarkTemplate: z.string(),
  restartXrayOnClientDisable: z.boolean(),
  sessionMaxAge: z.number().int().min(1).max(525600),
  smtpCpu: z.number().int().min(0).max(100),
  smtpEnable: z.boolean(),
  smtpEnabledEvents: z.string(),
  smtpEncryptionType: z.string(),
  smtpFrom: z.string(),
  smtpFromName: z.string(),
  smtpHost: z.string(),
  smtpMemory: z.number().int().min(0).max(100),
  smtpPassword: z.string(),
  smtpPort: z.number().int().min(1).max(65535),
  smtpTo: z.string(),
  smtpUsername: z.string(),
  subAnnounce: z.string(),
  subCertFile: z.string(),
  subClashAutoDetect: z.boolean(),
  subClashEnable: z.boolean(),
  subClashEnableRouting: z.boolean(),
  subClashPath: z.string(),
  subClashRules: z.string(),
  subClashURI: z.string(),
  subClashUserAgentRegex: z.string(),
  subDomain: z.string(),
  subEnable: z.boolean(),
  subEnableRouting: z.boolean(),
  subEncrypt: z.boolean(),
  subHideSettings: z.boolean(),
  subIncyEnableRouting: z.boolean(),
  subIncyRoutingRules: z.string(),
  subJsonAlwaysArray: z.boolean(),
  subJsonAutoDetect: z.boolean(),
  subJsonEnable: z.boolean(),
  subJsonFinalMask: z.string(),
  subJsonMux: z.string(),
  subJsonObservatory: z.string(),
  subJsonPath: z.string(),
  subJsonRules: z.string(),
  subJsonURI: z.string(),
  subJsonUserAgentRegex: z.string(),
  subKeyFile: z.string(),
  subListen: z.string(),
  subPath: z.string(),
  subPort: z.number().int().min(1).max(65535),
  subProfileUrl: z.string(),
  subRoutingRules: z.string(),
  subShowIdentityOnAllLinks: z.boolean(),
  subSupportUrl: z.string(),
  subThemeDir: z.string(),
  subTitle: z.string(),
  subURI: z.string(),
  subUpdates: z.number().int().min(0).max(525600),
  tgBotAPIServer: z.string(),
  tgBotBackup: z.boolean(),
  tgBotChatId: z.string(),
  tgBotEnable: z.boolean(),
  tgBotProxy: z.string(),
  tgBotToken: z.string(),
  tgCpu: z.number().int().min(0).max(100),
  tgEnabledEvents: z.string(),
  tgLang: z.string(),
  tgMemory: z.number().int().min(0).max(100),
  tgRunTime: z.string(),
  timeLocation: z.string(),
  trafficDiff: z.number().int().min(0).max(100),
  trustedProxyCIDRs: z.string(),
  twoFactorEnable: z.boolean(),
  twoFactorToken: z.string(),
  warpUpdateInterval: z.number().int().min(0),
  webBasePath: z.string(),
  webCertFile: z.string(),
  webDomain: z.string(),
  webKeyFile: z.string(),
  webListen: z.string(),
  webPort: z.number().int().min(1).max(65535),
});
export type AllSettingView = z.infer<typeof AllSettingViewSchema>;

export const AmneziaWGLogsSchema = z.object({
  events: z.array(z.string()),
  peers: z.array(z.lazy(() => PeerActivitySchema)),
  running: z.boolean(),
});
export type AmneziaWGLogs = z.infer<typeof AmneziaWGLogsSchema>;

export const ApiTokenSchema = z.object({
  createdAt: z.number().int(),
  enabled: z.boolean(),
  expiresAt: z.number().int(),
  id: z.number().int(),
  name: z.string(),
  scope: z.string(),
  token: z.string(),
});
export type ApiToken = z.infer<typeof ApiTokenSchema>;

export const ApiTokenViewSchema = z.object({
  createdAt: z.number().int(),
  enabled: z.boolean(),
  expiresAt: z.number().int(),
  id: z.number().int(),
  name: z.string(),
  scope: z.string(),
  token: z.string().optional(),
});
export type ApiTokenView = z.infer<typeof ApiTokenViewSchema>;

export const ClientSchema = z.object({
  adTag: z.string().optional(),
  allowedIPs: z.array(z.string()).optional(),
  allowedIPsByInbound: z.record(z.number().int(), z.array(z.string())).optional(),
  auth: z.string().optional(),
  comment: z.string(),
  created_at: z.number().int().optional(),
  email: z.string(),
  enable: z.boolean(),
  expiryTime: z.number().int(),
  flow: z.string().optional(),
  forwardedPorts: z.string().optional(),
  group: z.string().optional(),
  id: z.string().optional(),
  keepAlive: z.number().int().optional(),
  limitIp: z.number().int(),
  password: z.string().optional(),
  preSharedKey: z.string().optional(),
  privateKey: z.string().optional(),
  publicKey: z.string().optional(),
  reset: z.number().int(),
  resetDay: z.number().int(),
  resetMax: z.number().int(),
  reverse: z.lazy(() => ClientReverseSchema).nullable().optional(),
  secret: z.string().optional(),
  security: z.string(),
  subId: z.string(),
  tgId: z.number().int(),
  totalGB: z.number().int(),
  trafficReset: z.enum(['never', 'hourly', 'daily', 'weekly', 'monthly']).optional(),
  trafficResetDay: z.number().int().min(1).max(31).optional(),
  updated_at: z.number().int().optional(),
});
export type Client = z.infer<typeof ClientSchema>;

export const ClientInboundSchema = z.object({
  clientId: z.number().int(),
  createdAt: z.number().int(),
  flowOverride: z.string(),
  inboundId: z.number().int(),
});
export type ClientInbound = z.infer<typeof ClientInboundSchema>;

export const ClientPageResponseSchema = z.object({
  filtered: z.number().int(),
  groups: z.array(z.string()),
  items: z.array(z.lazy(() => ClientSlimSchema)),
  page: z.number().int(),
  pageSize: z.number().int(),
  summary: z.lazy(() => ClientsSummarySchema),
  total: z.number().int(),
});
export type ClientPageResponse = z.infer<typeof ClientPageResponseSchema>;

export const ClientRecordSchema = z.object({
  adTag: z.string(),
  allowedIPs: z.string(),
  auth: z.string(),
  comment: z.string(),
  createdAt: z.number().int(),
  email: z.string(),
  enable: z.boolean(),
  expiryTime: z.number().int(),
  flow: z.string(),
  forwardedPorts: z.string(),
  group: z.string(),
  id: z.number().int(),
  keepAlive: z.number().int(),
  limitHwid: z.number().int(),
  limitIp: z.number().int(),
  password: z.string(),
  preSharedKey: z.string(),
  privateKey: z.string(),
  publicKey: z.string(),
  reset: z.number().int(),
  resetDay: z.number().int(),
  resetMax: z.number().int(),
  reverse: z.unknown(),
  secret: z.string(),
  security: z.string(),
  subId: z.string(),
  tgId: z.number().int(),
  totalGB: z.number().int(),
  trafficReset: z.string(),
  trafficResetDay: z.number().int(),
  updatedAt: z.number().int(),
  uuid: z.string(),
});
export type ClientRecord = z.infer<typeof ClientRecordSchema>;

export const ClientReverseSchema = z.object({
  tag: z.string(),
});
export type ClientReverse = z.infer<typeof ClientReverseSchema>;

export const ClientSlimSchema = z.object({
  comment: z.string().optional(),
  createdAt: z.number().int(),
  email: z.string(),
  enable: z.boolean(),
  expiryTime: z.number().int(),
  group: z.string().optional(),
  inboundIds: z.array(z.number().int()),
  limitHwid: z.number().int(),
  limitIp: z.number().int(),
  reset: z.number().int(),
  resetDay: z.number().int(),
  resetMax: z.number().int(),
  subId: z.string(),
  totalGB: z.number().int(),
  traffic: z.lazy(() => ClientTrafficSchema).nullable().optional(),
  updatedAt: z.number().int(),
});
export type ClientSlim = z.infer<typeof ClientSlimSchema>;

export const ClientTrafficSchema = z.object({
  down: z.number().int(),
  email: z.string(),
  enable: z.boolean(),
  expiryTime: z.number().int(),
  id: z.number().int(),
  inboundId: z.number().int(),
  lastOnline: z.number().int(),
  lastSubFetch: z.number().int(),
  reset: z.number().int(),
  resetCount: z.number().int(),
  resetDay: z.number().int(),
  resetMax: z.number().int(),
  subId: z.string(),
  total: z.number().int(),
  up: z.number().int(),
  uuid: z.string(),
});
export type ClientTraffic = z.infer<typeof ClientTrafficSchema>;

export const ClientsSummarySchema = z.object({
  active: z.number().int(),
  deactive: z.array(z.string()),
  deactiveCount: z.number().int(),
  depleted: z.array(z.string()),
  depletedCount: z.number().int(),
  expiring: z.array(z.string()),
  expiringCount: z.number().int(),
  online: z.array(z.string()),
  onlineCount: z.number().int(),
  total: z.number().int(),
});
export type ClientsSummary = z.infer<typeof ClientsSummarySchema>;

export const FallbackParentInfoSchema = z.object({
  masterId: z.number().int(),
  path: z.string().optional(),
});
export type FallbackParentInfo = z.infer<typeof FallbackParentInfoSchema>;

export const GeoCategorySchema = z.object({
  attributes: z.array(z.string()),
  code: z.string(),
  entries: z.number().int(),
});
export type GeoCategory = z.infer<typeof GeoCategorySchema>;

export const GeoCategoryPageSchema = z.object({
  items: z.array(z.lazy(() => GeoCategorySchema)),
  total: z.number().int(),
});
export type GeoCategoryPage = z.infer<typeof GeoCategoryPageSchema>;

export const GeoEntrySchema = z.object({
  kind: z.string(),
  value: z.string(),
});
export type GeoEntry = z.infer<typeof GeoEntrySchema>;

export const GeoEntryPageSchema = z.object({
  items: z.array(z.lazy(() => GeoEntrySchema)),
  total: z.number().int(),
});
export type GeoEntryPage = z.infer<typeof GeoEntryPageSchema>;

export const GeoFileSchema = z.object({
  categories: z.number().int(),
  error: z.string().optional(),
  kind: z.lazy(() => GeoKindSchema),
  modifiedAt: z.number().int(),
  name: z.string(),
  size: z.number().int(),
});
export type GeoFile = z.infer<typeof GeoFileSchema>;

export const GeodataTokenIssueSchema = z.object({
  code: z.string().optional(),
  file: z.string().optional(),
  reason: z.string(),
  token: z.string(),
});
export type GeodataTokenIssue = z.infer<typeof GeodataTokenIssueSchema>;

export const HistoryOfSeedersSchema = z.object({
  id: z.number().int(),
  seederName: z.string(),
});
export type HistoryOfSeeders = z.infer<typeof HistoryOfSeedersSchema>;

export const HostSchema = z.object({
  address: z.string(),
  allowInsecure: z.boolean(),
  alpn: z.array(z.string()),
  createdAt: z.number().int(),
  echConfigList: z.string(),
  excludeFromSubTypes: z.array(z.string()),
  finalMask: z.string(),
  fingerprint: z.string(),
  groupId: z.string(),
  hostHeader: z.string(),
  id: z.number().int(),
  inboundId: z.number().int(),
  isDisabled: z.boolean(),
  isHidden: z.boolean(),
  keepSniBlank: z.boolean(),
  mihomoIpVersion: z.enum(['dual', 'ipv4', 'ipv6', 'ipv4-prefer', 'ipv6-prefer']),
  mihomoX25519: z.boolean(),
  muxParams: z.unknown(),
  nodeGuids: z.array(z.string()).optional(),
  overrideSniFromAddress: z.boolean(),
  path: z.string(),
  pinnedPeerCertSha256: z.array(z.string()),
  port: z.number().int().min(0).max(65535),
  remark: z.string().max(256),
  security: z.enum(['same', 'tls', 'none', 'reality']),
  serverDescription: z.string().max(64),
  shuffleHost: z.boolean(),
  sni: z.string(),
  sockoptParams: z.unknown(),
  sortOrder: z.number().int(),
  tags: z.array(z.string()),
  updatedAt: z.number().int(),
  verifyPeerCertByName: z.string(),
  vlessRoute: z.string(),
});
export type Host = z.infer<typeof HostSchema>;

export const HostGroupSchema = z.object({
  allowInsecure: z.boolean(),
  alpn: z.array(z.string()),
  echConfigList: z.string(),
  excludeFromSubTypes: z.array(z.string()),
  finalMask: z.string(),
  fingerprint: z.string(),
  groupId: z.string(),
  hostHeader: z.string(),
  hosts: z.array(z.string()),
  inboundIds: z.array(z.number().int()),
  isDisabled: z.boolean(),
  isHidden: z.boolean(),
  keepSniBlank: z.boolean(),
  mihomoIpVersion: z.enum(['dual', 'ipv4', 'ipv6', 'ipv4-prefer', 'ipv6-prefer']),
  mihomoX25519: z.boolean(),
  muxParams: z.string(),
  nodeGuids: z.array(z.string()),
  overrideSniFromAddress: z.boolean(),
  path: z.string(),
  pinnedPeerCertSha256: z.array(z.string()),
  port: z.number().int().min(0).max(65535),
  remark: z.string().max(256),
  security: z.enum(['same', 'tls', 'none', 'reality']),
  serverDescription: z.string().max(64),
  shuffleHost: z.boolean(),
  sni: z.string(),
  sockoptParams: z.string(),
  sortOrder: z.number().int(),
  tags: z.array(z.string()),
  verifyPeerCertByName: z.string(),
  vlessRoute: z.string(),
});
export type HostGroup = z.infer<typeof HostGroupSchema>;

export const InboundSchema = z.object({
  clientStats: z.array(z.lazy(() => ClientTrafficSchema)),
  disableFlow: z.boolean(),
  down: z.number().int(),
  enable: z.boolean(),
  expiryTime: z.number().int(),
  fallbackParent: z.lazy(() => FallbackParentInfoSchema).nullable().optional(),
  id: z.number().int(),
  lastTrafficResetTime: z.number().int(),
  listen: z.string(),
  nodeId: z.number().int().nullable().optional(),
  originNodeGuid: z.string().optional(),
  port: z.number().int().min(0).max(65535),
  protocol: z.enum(['vmess', 'vless', 'trojan', 'shadowsocks', 'wireguard', 'hysteria', 'http', 'mixed', 'tunnel', 'tun', 'mtproto', 'amneziawg']),
  remark: z.string(),
  settings: z.unknown(),
  shareAddr: z.string(),
  shareAddrStrategy: z.enum(['node', 'listen', 'custom']),
  sniffing: z.unknown(),
  streamSettings: z.unknown(),
  subSortIndex: z.number().int().min(1),
  tag: z.string(),
  total: z.number().int(),
  trafficReset: z.enum(['never', 'hourly', 'daily', 'weekly', 'monthly']),
  trafficResetDay: z.number().int().min(1).max(31),
  up: z.number().int(),
});
export type Inbound = z.infer<typeof InboundSchema>;

export const InboundClientIpsSchema = z.object({
  clientEmail: z.string(),
  id: z.number().int(),
  ips: z.unknown(),
});
export type InboundClientIps = z.infer<typeof InboundClientIpsSchema>;

export const InboundFallbackSchema = z.object({
  alpn: z.string(),
  childId: z.number().int(),
  dest: z.string(),
  id: z.number().int(),
  masterId: z.number().int(),
  name: z.string(),
  path: z.string(),
  sortOrder: z.number().int(),
  xver: z.number().int(),
});
export type InboundFallback = z.infer<typeof InboundFallbackSchema>;

export const InboundOptionSchema = z.object({
  awgServer: z.lazy(() => ServerSettingsSchema).nullable().optional(),
  enable: z.boolean(),
  id: z.number().int(),
  listen: z.string().optional(),
  mtprotoDomain: z.string().optional(),
  nodeAddress: z.string().optional(),
  nodeId: z.number().int().nullable().optional(),
  port: z.number().int(),
  protocol: z.string(),
  remark: z.string(),
  shareAddr: z.string().optional(),
  shareAddrStrategy: z.string().optional(),
  ssMethod: z.string(),
  tag: z.string(),
  tlsFlowCapable: z.boolean(),
  wgDns: z.string().optional(),
  wgMtu: z.number().int().optional(),
  wgPublicKey: z.string().optional(),
});
export type InboundOption = z.infer<typeof InboundOptionSchema>;

export const InboundTrafficSummarySchema = z.object({
  down: z.number().int(),
  enable: z.boolean(),
  id: z.number().int(),
  total: z.number().int(),
  up: z.number().int(),
});
export type InboundTrafficSummary = z.infer<typeof InboundTrafficSummarySchema>;

export const LogEntrySchema = z.object({
  DateTime: z.string(),
  Email: z.string(),
  Event: z.number().int(),
  FromAddress: z.string(),
  Inbound: z.string(),
  Outbound: z.string(),
  ToAddress: z.string(),
});
export type LogEntry = z.infer<typeof LogEntrySchema>;

export const MLDSA65ResponseSchema = z.object({
  seed: z.string(),
  verify: z.string(),
});
export type MLDSA65Response = z.infer<typeof MLDSA65ResponseSchema>;

export const MLKEM768ResponseSchema = z.object({
  client: z.string(),
  seed: z.string(),
});
export type MLKEM768Response = z.infer<typeof MLKEM768ResponseSchema>;

export const MsgSchema = z.object({
  msg: z.string(),
  obj: z.unknown(),
  success: z.boolean(),
});
export type Msg = z.infer<typeof MsgSchema>;

export const NewUUIDResponseSchema = z.object({
  uuid: z.string(),
});
export type NewUUIDResponse = z.infer<typeof NewUUIDResponseSchema>;

export const NodeSchema = z.object({
  activeCount: z.number().int(),
  address: z.string(),
  allowPrivateAddress: z.boolean(),
  basePath: z.string(),
  clientCount: z.number().int(),
  configDirty: z.boolean(),
  configDirtyAt: z.number().int(),
  cpuPct: z.number(),
  createdAt: z.number().int(),
  depletedCount: z.number().int(),
  disabledCount: z.number().int(),
  enable: z.boolean(),
  guid: z.string(),
  id: z.number().int(),
  inboundCount: z.number().int(),
  inboundSyncMode: z.enum(['all', 'selected']),
  inboundTags: z.array(z.string()),
  lastError: z.string(),
  lastHeartbeat: z.number().int(),
  latencyMs: z.number().int(),
  memPct: z.number(),
  name: z.string(),
  netDown: z.number().int(),
  netUp: z.number().int(),
  onlineCount: z.number().int(),
  outboundTag: z.string(),
  panelVersion: z.string(),
  parentGuid: z.string().optional(),
  pinnedCertSha256: z.string(),
  port: z.number().int().min(1).max(65535),
  remark: z.string(),
  scheme: z.enum(['http', 'https']),
  status: z.string(),
  tlsVerifyMode: z.enum(['verify', 'skip', 'pin', 'mtls']),
  transitive: z.boolean().optional(),
  updatedAt: z.number().int(),
  uptimeSecs: z.number().int(),
  xrayError: z.string(),
  xrayState: z.string(),
  xrayVersion: z.string(),
});
export type Node = z.infer<typeof NodeSchema>;

export const NodeMutationRequestSchema = z.object({
  address: z.string(),
  allowPrivateAddress: z.boolean(),
  apiToken: z.string().nullable().optional(),
  basePath: z.string(),
  clearApiToken: z.boolean().optional(),
  enable: z.boolean(),
  id: z.number().int(),
  inboundSyncMode: z.enum(['all', 'selected']),
  inboundTags: z.array(z.string()),
  name: z.string(),
  outboundTag: z.string(),
  pinnedCertSha256: z.string(),
  port: z.number().int().min(1).max(65535),
  remark: z.string(),
  scheme: z.enum(['http', 'https']),
  tlsVerifyMode: z.enum(['verify', 'skip', 'pin', 'mtls']),
});
export type NodeMutationRequest = z.infer<typeof NodeMutationRequestSchema>;

export const NodeViewSchema = z.object({
  activeCount: z.number().int(),
  address: z.string(),
  allowPrivateAddress: z.boolean(),
  basePath: z.string(),
  clientCount: z.number().int(),
  configDirty: z.boolean(),
  configDirtyAt: z.number().int(),
  cpuPct: z.number(),
  createdAt: z.number().int(),
  depletedCount: z.number().int(),
  disabledCount: z.number().int(),
  enable: z.boolean(),
  guid: z.string(),
  hasApiToken: z.boolean(),
  id: z.number().int(),
  inboundCount: z.number().int(),
  inboundSyncMode: z.string(),
  inboundTags: z.array(z.string()),
  lastError: z.string(),
  lastHeartbeat: z.number().int(),
  latencyMs: z.number().int(),
  memPct: z.number(),
  name: z.string(),
  netDown: z.number().int(),
  netUp: z.number().int(),
  onlineCount: z.number().int(),
  outboundTag: z.string(),
  panelVersion: z.string(),
  parentGuid: z.string().optional(),
  pinnedCertSha256: z.string(),
  port: z.number().int(),
  remark: z.string(),
  scheme: z.string(),
  status: z.string(),
  tlsVerifyMode: z.string(),
  transitive: z.boolean().optional(),
  updatedAt: z.number().int(),
  uptimeSecs: z.number().int(),
  xrayError: z.string(),
  xrayState: z.string(),
  xrayVersion: z.string(),
});
export type NodeView = z.infer<typeof NodeViewSchema>;

export const OutboundTrafficsSchema = z.object({
  down: z.number().int(),
  id: z.number().int(),
  tag: z.string(),
  total: z.number().int(),
  up: z.number().int(),
});
export type OutboundTraffics = z.infer<typeof OutboundTrafficsSchema>;

export const PanelUpdateStatusSchema = z.object({
  exitCode: z.number().int(),
  finishedAt: z.number().int(),
  runId: z.string(),
  state: z.string(),
});
export type PanelUpdateStatus = z.infer<typeof PanelUpdateStatusSchema>;

export const PeerActivitySchema = z.object({
  allowedIPs: z.string(),
  down: z.number().int(),
  email: z.string(),
  endpoint: z.string(),
  handshake: z.number().int(),
  inboundId: z.number().int(),
  interface: z.string(),
  online: z.boolean(),
  tag: z.string(),
  up: z.number().int(),
});
export type PeerActivity = z.infer<typeof PeerActivitySchema>;

export const ProbeResultUISchema = z.object({
  cpuPct: z.number(),
  error: z.string(),
  latencyMs: z.number().int(),
  memPct: z.number(),
  panelVersion: z.string(),
  status: z.string(),
  uptimeSecs: z.number().int(),
  xrayError: z.string(),
  xrayState: z.string(),
  xrayVersion: z.string(),
});
export type ProbeResultUI = z.infer<typeof ProbeResultUISchema>;

export const RealityScanResultSchema = z.object({
  alpn: z.string(),
  certChainValid: z.boolean(),
  certIssuer: z.string(),
  certSubject: z.string(),
  certValid: z.boolean(),
  curveID: z.string(),
  feasible: z.boolean(),
  h2: z.boolean(),
  host: z.string(),
  ip: z.string(),
  latencyMs: z.number().int(),
  notAfter: z.string(),
  port: z.number().int(),
  privateTarget: z.boolean(),
  reason: z.string(),
  serverNames: z.array(z.string()),
  target: z.string(),
  tls13: z.boolean(),
  tlsVersion: z.string(),
  x25519: z.boolean(),
});
export type RealityScanResult = z.infer<typeof RealityScanResultSchema>;

export const ServerSettingsSchema = z.object({
  contentPaddingAddition: z.string().optional(),
  disableCookies: z.boolean(),
  externalInterface: z.string().optional(),
  h1: z.string(),
  h2: z.string(),
  h3: z.string(),
  h4: z.string(),
  headerProtectionKey: z.string().optional(),
  i1: z.string().optional(),
  i2: z.string().optional(),
  i3: z.string().optional(),
  i4: z.string().optional(),
  i5: z.string().optional(),
  ipv6Enabled: z.boolean().optional(),
  ipv6ExternalInterface: z.string().optional(),
  ipv6Subnet: z.string().optional(),
  jc: z.number().int(),
  jmax: z.number().int(),
  jmin: z.number().int(),
  keepaliveTimeout: z.string().optional(),
  maxHandshakeAttempts: z.string().optional(),
  mtu: z.number().int().optional(),
  primaryDns: z.string(),
  privateKey: z.string(),
  publicKey: z.string(),
  randomTrailers: z.boolean(),
  rejectAfterTime: z.string().optional(),
  rekeyAfterTime: z.string().optional(),
  rekeyTimeout: z.string().optional(),
  routeThroughXray: z.boolean().optional(),
  s1: z.number().int(),
  s2: z.number().int(),
  s3: z.number().int(),
  s4: z.number().int(),
  secondaryDns: z.string(),
  subnetCidr: z.number().int(),
  subnetIp: z.string(),
});
export type ServerSettings = z.infer<typeof ServerSettingsSchema>;

export const SettingSchema = z.object({
  id: z.number().int(),
  key: z.string(),
  value: z.string(),
});
export type Setting = z.infer<typeof SettingSchema>;

export const SubBalancerSchema = z.object({
  createdAt: z.number().int(),
  enabled: z.boolean(),
  id: z.number().int(),
  inboundIds: z.array(z.number().int()),
  memberWeights: z.record(z.number().int(), z.number()).optional(),
  remark: z.string().max(256),
  sortOrder: z.number().int().min(1),
  strategy: z.enum(['leastLoad', 'leastPing', 'random', 'roundRobin']),
  updatedAt: z.number().int(),
});
export type SubBalancer = z.infer<typeof SubBalancerSchema>;

export const TrafficSchema = z.object({
  Down: z.number().int(),
  IsInbound: z.boolean(),
  IsOutbound: z.boolean(),
  Tag: z.string(),
  Up: z.number().int(),
});
export type Traffic = z.infer<typeof TrafficSchema>;

export const UserSchema = z.object({
  id: z.number().int(),
  password: z.string(),
  username: z.string(),
});
export type User = z.infer<typeof UserSchema>;

