{-# LANGUAGE OverloadedStrings #-}

-- | CLI configuration types and parsers for the unified @free-agent@ executable.
module Free.Agent.Cli.Config
  ( Backend (..),
    HermesConfig (..),
    KimiConfig (..),
    LlmConfig (..),
    CommandConfig (..),
    GatewayCliConfig (..),
    defaultHermesConfig,
    defaultKimiConfig,
    defaultLlmConfig,
    defaultCommandConfig,
    parseHermesConfig,
    parseKimiConfig,
    parseLlmConfig,
    parseCommandConfig,
    parseGatewayConfig,
    commonAgentOptions,
    rootOpt,
    namesOpt,
    promptOpt,
    sessionOpt,
    modelOpt,
    providerOpt,
    quiesceOpt,
    pitbossOpt,
  )
where

import Circuit.Agent (Name)
import Data.Text (Text)
import Data.Text qualified as T
import Options.Applicative

-- ---------------------------------------------------------------------------
-- Backend sum type
-- ---------------------------------------------------------------------------

data Backend
  = BackendHermes HermesConfig
  | BackendKimi KimiConfig
  | BackendLlm LlmConfig
  | BackendCommand CommandConfig
  | BackendGateway GatewayCliConfig
  deriving (Int -> Backend -> ShowS
[Backend] -> ShowS
Backend -> String
(Int -> Backend -> ShowS)
-> (Backend -> String) -> ([Backend] -> ShowS) -> Show Backend
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Backend -> ShowS
showsPrec :: Int -> Backend -> ShowS
$cshow :: Backend -> String
show :: Backend -> String
$cshowList :: [Backend] -> ShowS
showList :: [Backend] -> ShowS
Show)

-- ---------------------------------------------------------------------------
-- Config records
-- ---------------------------------------------------------------------------

data HermesConfig = HermesConfig
  { HermesConfig -> String
hcRoot :: FilePath,
    HermesConfig -> [Name]
hcNames :: [Name],
    HermesConfig -> String
hcPromptFile :: FilePath,
    HermesConfig -> Maybe String
hcSessionFile :: Maybe FilePath,
    HermesConfig -> Maybe Name
hcModel :: Maybe Text,
    HermesConfig -> Maybe Name
hcProvider :: Maybe Text,
    HermesConfig -> Bool
hcYolo :: Bool,
    HermesConfig -> Maybe Int
hcQuiesce :: Maybe Int,
    HermesConfig -> Maybe Name
hcPitboss :: Maybe Name
  }
  deriving (Int -> HermesConfig -> ShowS
[HermesConfig] -> ShowS
HermesConfig -> String
(Int -> HermesConfig -> ShowS)
-> (HermesConfig -> String)
-> ([HermesConfig] -> ShowS)
-> Show HermesConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HermesConfig -> ShowS
showsPrec :: Int -> HermesConfig -> ShowS
$cshow :: HermesConfig -> String
show :: HermesConfig -> String
$cshowList :: [HermesConfig] -> ShowS
showList :: [HermesConfig] -> ShowS
Show)

data KimiConfig = KimiConfig
  { KimiConfig -> String
kcRoot :: FilePath,
    KimiConfig -> [Name]
kcNames :: [Name],
    KimiConfig -> String
kcPromptFile :: FilePath,
    KimiConfig -> Maybe String
kcSessionFile :: Maybe FilePath,
    KimiConfig -> Maybe Name
kcModel :: Maybe Text,
    KimiConfig -> Maybe Name
kcProvider :: Maybe Text,
    KimiConfig -> Maybe Int
kcQuiesce :: Maybe Int,
    KimiConfig -> Maybe Name
kcPitboss :: Maybe Name
  }
  deriving (Int -> KimiConfig -> ShowS
[KimiConfig] -> ShowS
KimiConfig -> String
(Int -> KimiConfig -> ShowS)
-> (KimiConfig -> String)
-> ([KimiConfig] -> ShowS)
-> Show KimiConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> KimiConfig -> ShowS
showsPrec :: Int -> KimiConfig -> ShowS
$cshow :: KimiConfig -> String
show :: KimiConfig -> String
$cshowList :: [KimiConfig] -> ShowS
showList :: [KimiConfig] -> ShowS
Show)

data LlmConfig = LlmConfig
  { LlmConfig -> String
lcRoot :: FilePath,
    LlmConfig -> [Name]
lcNames :: [Name],
    LlmConfig -> String
lcPromptFile :: FilePath,
    LlmConfig -> Maybe Name
lcModel :: Maybe Text,
    LlmConfig -> Name
lcBaseUrl :: Text,
    LlmConfig -> String
lcKeyEnv :: String,
    LlmConfig -> Maybe Int
lcQuiesce :: Maybe Int,
    LlmConfig -> Maybe Name
lcPitboss :: Maybe Name
  }
  deriving (Int -> LlmConfig -> ShowS
[LlmConfig] -> ShowS
LlmConfig -> String
(Int -> LlmConfig -> ShowS)
-> (LlmConfig -> String)
-> ([LlmConfig] -> ShowS)
-> Show LlmConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LlmConfig -> ShowS
showsPrec :: Int -> LlmConfig -> ShowS
$cshow :: LlmConfig -> String
show :: LlmConfig -> String
$cshowList :: [LlmConfig] -> ShowS
showList :: [LlmConfig] -> ShowS
Show)

data CommandConfig = CommandConfig
  { CommandConfig -> String
ccRoot :: FilePath,
    CommandConfig -> [Name]
ccNames :: [Name],
    CommandConfig -> String
ccCmd :: FilePath,
    CommandConfig -> [String]
ccArgs :: [String],
    CommandConfig -> Maybe Int
ccQuiesce :: Maybe Int,
    CommandConfig -> Maybe Name
ccPitboss :: Maybe Name
  }
  deriving (Int -> CommandConfig -> ShowS
[CommandConfig] -> ShowS
CommandConfig -> String
(Int -> CommandConfig -> ShowS)
-> (CommandConfig -> String)
-> ([CommandConfig] -> ShowS)
-> Show CommandConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CommandConfig -> ShowS
showsPrec :: Int -> CommandConfig -> ShowS
$cshow :: CommandConfig -> String
show :: CommandConfig -> String
$cshowList :: [CommandConfig] -> ShowS
showList :: [CommandConfig] -> ShowS
Show)

data GatewayCliConfig = GatewayCliConfig
  { GatewayCliConfig -> String
gcwRoot :: FilePath,
    GatewayCliConfig -> [Name]
gcwNames :: [Name],
    GatewayCliConfig -> String
gcwPromptFile :: FilePath,
    GatewayCliConfig -> Name
gcwBaseUrl :: Text,
    GatewayCliConfig -> String
gcwKeyEnv :: String,
    GatewayCliConfig -> Maybe Int
gcwQuiesce :: Maybe Int,
    GatewayCliConfig -> Maybe Name
gcwPitboss :: Maybe Name
  }
  deriving (Int -> GatewayCliConfig -> ShowS
[GatewayCliConfig] -> ShowS
GatewayCliConfig -> String
(Int -> GatewayCliConfig -> ShowS)
-> (GatewayCliConfig -> String)
-> ([GatewayCliConfig] -> ShowS)
-> Show GatewayCliConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GatewayCliConfig -> ShowS
showsPrec :: Int -> GatewayCliConfig -> ShowS
$cshow :: GatewayCliConfig -> String
show :: GatewayCliConfig -> String
$cshowList :: [GatewayCliConfig] -> ShowS
showList :: [GatewayCliConfig] -> ShowS
Show)

-- ---------------------------------------------------------------------------
-- Defaults
-- ---------------------------------------------------------------------------

defaultHermesConfig :: HermesConfig
defaultHermesConfig :: HermesConfig
defaultHermesConfig =
  HermesConfig
    { hcRoot :: String
hcRoot = String
".",
      hcNames :: [Name]
hcNames = [],
      hcPromptFile :: String
hcPromptFile = String
"",
      hcSessionFile :: Maybe String
hcSessionFile = Maybe String
forall a. Maybe a
Nothing,
      hcModel :: Maybe Name
hcModel = Maybe Name
forall a. Maybe a
Nothing,
      hcProvider :: Maybe Name
hcProvider = Maybe Name
forall a. Maybe a
Nothing,
      hcYolo :: Bool
hcYolo = Bool
True,
      hcQuiesce :: Maybe Int
hcQuiesce = Maybe Int
forall a. Maybe a
Nothing,
      hcPitboss :: Maybe Name
hcPitboss = Maybe Name
forall a. Maybe a
Nothing
    }

defaultKimiConfig :: KimiConfig
defaultKimiConfig :: KimiConfig
defaultKimiConfig =
  KimiConfig
    { kcRoot :: String
kcRoot = String
".",
      kcNames :: [Name]
kcNames = [],
      kcPromptFile :: String
kcPromptFile = String
"",
      kcSessionFile :: Maybe String
kcSessionFile = Maybe String
forall a. Maybe a
Nothing,
      kcModel :: Maybe Name
kcModel = Maybe Name
forall a. Maybe a
Nothing,
      kcProvider :: Maybe Name
kcProvider = Maybe Name
forall a. Maybe a
Nothing,
      kcQuiesce :: Maybe Int
kcQuiesce = Maybe Int
forall a. Maybe a
Nothing,
      kcPitboss :: Maybe Name
kcPitboss = Maybe Name
forall a. Maybe a
Nothing
    }

defaultLlmConfig :: LlmConfig
defaultLlmConfig :: LlmConfig
defaultLlmConfig =
  LlmConfig
    { lcRoot :: String
lcRoot = String
".",
      lcNames :: [Name]
lcNames = [],
      lcPromptFile :: String
lcPromptFile = String
"",
      lcModel :: Maybe Name
lcModel = Maybe Name
forall a. Maybe a
Nothing,
      lcBaseUrl :: Name
lcBaseUrl = Name
"https://api.deepseek.com/v1",
      lcKeyEnv :: String
lcKeyEnv = String
"DEEPSEEK_API_KEY",
      lcQuiesce :: Maybe Int
lcQuiesce = Maybe Int
forall a. Maybe a
Nothing,
      lcPitboss :: Maybe Name
lcPitboss = Maybe Name
forall a. Maybe a
Nothing
    }

defaultCommandConfig :: CommandConfig
defaultCommandConfig :: CommandConfig
defaultCommandConfig =
  CommandConfig
    { ccRoot :: String
ccRoot = String
".",
      ccNames :: [Name]
ccNames = [],
      ccCmd :: String
ccCmd = String
"",
      ccArgs :: [String]
ccArgs = [],
      ccQuiesce :: Maybe Int
ccQuiesce = Maybe Int
forall a. Maybe a
Nothing,
      ccPitboss :: Maybe Name
ccPitboss = Maybe Name
forall a. Maybe a
Nothing
    }

-- ---------------------------------------------------------------------------
-- Common option parsers
-- ---------------------------------------------------------------------------

rootOpt :: Parser FilePath
rootOpt :: Parser String
rootOpt =
  Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
    ( String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"root"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Char -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'r'
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"ROOT"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value String
"."
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields String
forall a (f :: * -> *). Show a => Mod f a
showDefault
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"Bus root directory containing log.jsonl"
    )

namesOpt :: Parser [Name]
namesOpt :: Parser [Name]
namesOpt =
  Parser Name -> Parser [Name]
forall a. Parser a -> Parser [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some
    ( ReadM Name -> Mod OptionFields Name -> Parser Name
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
        (String -> Name
T.pack (String -> Name) -> ReadM String -> ReadM Name
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
        ( String -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"name"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> Char -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'n'
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAME"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. String -> Mod f a
help String
"Subscriber name (repeatable)"
        )
    )

promptOpt :: Parser FilePath
promptOpt :: Parser String
promptOpt =
  Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
    ( String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"prompt"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Char -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'p'
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PROMPT.md"
        Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"System prompt markdown file"
    )

sessionOpt :: Parser (Maybe FilePath)
sessionOpt :: Parser (Maybe String)
sessionOpt =
  Parser String -> Parser (Maybe String)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser String -> Parser (Maybe String))
-> Parser String -> Parser (Maybe String)
forall a b. (a -> b) -> a -> b
$
    Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
      ( String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"session"
          Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Char -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
's'
          Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
          Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"Session file (default: ROOT/.sessions/<name>.sid)"
      )

modelOpt :: Parser (Maybe Text)
modelOpt :: Parser (Maybe Name)
modelOpt =
  Parser Name -> Parser (Maybe Name)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Name -> Parser (Maybe Name))
-> Parser Name -> Parser (Maybe Name)
forall a b. (a -> b) -> a -> b
$
    ReadM Name -> Mod OptionFields Name -> Parser Name
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
      (String -> Name
T.pack (String -> Name) -> ReadM String -> ReadM Name
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
      ( String -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"model"
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> Char -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'm'
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"MODEL"
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. String -> Mod f a
help String
"Model passed to the backend"
      )

providerOpt :: Parser (Maybe Text)
providerOpt :: Parser (Maybe Name)
providerOpt =
  Parser Name -> Parser (Maybe Name)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Name -> Parser (Maybe Name))
-> Parser Name -> Parser (Maybe Name)
forall a b. (a -> b) -> a -> b
$
    ReadM Name -> Mod OptionFields Name -> Parser Name
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
      (String -> Name
T.pack (String -> Name) -> ReadM String -> ReadM Name
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
      ( String -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"provider"
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PROVIDER"
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. String -> Mod f a
help String
"Provider passed to the backend"
      )

quiesceOpt :: Parser (Maybe Int)
quiesceOpt :: Parser (Maybe Int)
quiesceOpt =
  Parser Int -> Parser (Maybe Int)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Int -> Parser (Maybe Int))
-> Parser Int -> Parser (Maybe Int)
forall a b. (a -> b) -> a -> b
$
    ReadM Int -> Mod OptionFields Int -> Parser Int
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
      ReadM Int
forall a. Read a => ReadM a
auto
      ( String -> Mod OptionFields Int
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"quiesce"
          Mod OptionFields Int
-> Mod OptionFields Int -> Mod OptionFields Int
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Int
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"N"
          Mod OptionFields Int
-> Mod OptionFields Int -> Mod OptionFields Int
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Int
forall (f :: * -> *) a. String -> Mod f a
help String
"Exit after N empty one-second cycles"
      )

pitbossOpt :: Parser (Maybe Name)
pitbossOpt :: Parser (Maybe Name)
pitbossOpt =
  Parser Name -> Parser (Maybe Name)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Name -> Parser (Maybe Name))
-> Parser Name -> Parser (Maybe Name)
forall a b. (a -> b) -> a -> b
$
    ReadM Name -> Mod OptionFields Name -> Parser Name
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
      (String -> Name
T.pack (String -> Name) -> ReadM String -> ReadM Name
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
      ( String -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"pitboss"
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAME"
          Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. String -> Mod f a
help String
"Recipient for the quiescence marker (default: pitboss)"
      )

-- | Options shared by Hermes and Kimi configs.
commonAgentOptions ::
  Parser FilePath ->
  Parser (Maybe FilePath) ->
  Parser (Maybe Int) ->
  Parser (Maybe Name) ->
  Parser (FilePath, [Name], FilePath, Maybe FilePath, Maybe Text, Maybe Text, Maybe Int, Maybe Name)
commonAgentOptions :: Parser String
-> Parser (Maybe String)
-> Parser (Maybe Int)
-> Parser (Maybe Name)
-> Parser
     (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
      Maybe Int, Maybe Name)
commonAgentOptions Parser String
rootP Parser (Maybe String)
sessP Parser (Maybe Int)
quiesceP Parser (Maybe Name)
pitbossP =
  (,,,,,,,)
    (String
 -> [Name]
 -> String
 -> Maybe String
 -> Maybe Name
 -> Maybe Name
 -> Maybe Int
 -> Maybe Name
 -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
     Maybe Int, Maybe Name))
-> Parser String
-> Parser
     ([Name]
      -> String
      -> Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
rootP
    Parser
  ([Name]
   -> String
   -> Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser [Name]
-> Parser
     (String
      -> Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [Name]
namesOpt
    Parser
  (String
   -> Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser String
-> Parser
     (Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
promptOpt
    Parser
  (Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser (Maybe String)
-> Parser
     (Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe String)
sessP
    Parser
  (Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser (Maybe Name)
-> Parser
     (Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
modelOpt
    Parser
  (Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser (Maybe Name)
-> Parser
     (Maybe Int
      -> Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
providerOpt
    Parser
  (Maybe Int
   -> Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser (Maybe Int)
-> Parser
     (Maybe Name
      -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
          Maybe Int, Maybe Name))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Int)
quiesceP
    Parser
  (Maybe Name
   -> (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
       Maybe Int, Maybe Name))
-> Parser (Maybe Name)
-> Parser
     (String, [Name], String, Maybe String, Maybe Name, Maybe Name,
      Maybe Int, Maybe Name)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
pitbossP

-- ---------------------------------------------------------------------------
-- Backend-specific parsers
-- ---------------------------------------------------------------------------

parseHermesConfig :: Parser HermesConfig
parseHermesConfig :: Parser HermesConfig
parseHermesConfig =
  String
-> [Name]
-> String
-> Maybe String
-> Maybe Name
-> Maybe Name
-> Bool
-> Maybe Int
-> Maybe Name
-> HermesConfig
HermesConfig
    (String
 -> [Name]
 -> String
 -> Maybe String
 -> Maybe Name
 -> Maybe Name
 -> Bool
 -> Maybe Int
 -> Maybe Name
 -> HermesConfig)
-> Parser String
-> Parser
     ([Name]
      -> String
      -> Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Bool
      -> Maybe Int
      -> Maybe Name
      -> HermesConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
rootOpt
    Parser
  ([Name]
   -> String
   -> Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Bool
   -> Maybe Int
   -> Maybe Name
   -> HermesConfig)
-> Parser [Name]
-> Parser
     (String
      -> Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Bool
      -> Maybe Int
      -> Maybe Name
      -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [Name]
namesOpt
    Parser
  (String
   -> Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Bool
   -> Maybe Int
   -> Maybe Name
   -> HermesConfig)
-> Parser String
-> Parser
     (Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Bool
      -> Maybe Int
      -> Maybe Name
      -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
promptOpt
    Parser
  (Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Bool
   -> Maybe Int
   -> Maybe Name
   -> HermesConfig)
-> Parser (Maybe String)
-> Parser
     (Maybe Name
      -> Maybe Name -> Bool -> Maybe Int -> Maybe Name -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe String)
sessionOpt
    Parser
  (Maybe Name
   -> Maybe Name -> Bool -> Maybe Int -> Maybe Name -> HermesConfig)
-> Parser (Maybe Name)
-> Parser
     (Maybe Name -> Bool -> Maybe Int -> Maybe Name -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
modelOpt
    Parser
  (Maybe Name -> Bool -> Maybe Int -> Maybe Name -> HermesConfig)
-> Parser (Maybe Name)
-> Parser (Bool -> Maybe Int -> Maybe Name -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
providerOpt
    Parser (Bool -> Maybe Int -> Maybe Name -> HermesConfig)
-> Parser Bool -> Parser (Maybe Int -> Maybe Name -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Bool
yoloOpt
    Parser (Maybe Int -> Maybe Name -> HermesConfig)
-> Parser (Maybe Int) -> Parser (Maybe Name -> HermesConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Int)
quiesceOpt
    Parser (Maybe Name -> HermesConfig)
-> Parser (Maybe Name) -> Parser HermesConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
pitbossOpt
  where
    yoloOpt :: Parser Bool
yoloOpt = Bool -> Bool
not (Bool -> Bool) -> Parser Bool -> Parser Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Mod FlagFields Bool -> Parser Bool
switch (String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"no-yolo" Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"Do not pass --yolo to hermes")

parseKimiConfig :: Parser KimiConfig
parseKimiConfig :: Parser KimiConfig
parseKimiConfig =
  String
-> [Name]
-> String
-> Maybe String
-> Maybe Name
-> Maybe Name
-> Maybe Int
-> Maybe Name
-> KimiConfig
KimiConfig
    (String
 -> [Name]
 -> String
 -> Maybe String
 -> Maybe Name
 -> Maybe Name
 -> Maybe Int
 -> Maybe Name
 -> KimiConfig)
-> Parser String
-> Parser
     ([Name]
      -> String
      -> Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> KimiConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
rootOpt
    Parser
  ([Name]
   -> String
   -> Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> KimiConfig)
-> Parser [Name]
-> Parser
     (String
      -> Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> KimiConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [Name]
namesOpt
    Parser
  (String
   -> Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> KimiConfig)
-> Parser String
-> Parser
     (Maybe String
      -> Maybe Name
      -> Maybe Name
      -> Maybe Int
      -> Maybe Name
      -> KimiConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
promptOpt
    Parser
  (Maybe String
   -> Maybe Name
   -> Maybe Name
   -> Maybe Int
   -> Maybe Name
   -> KimiConfig)
-> Parser (Maybe String)
-> Parser
     (Maybe Name -> Maybe Name -> Maybe Int -> Maybe Name -> KimiConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe String)
sessionOpt
    Parser
  (Maybe Name -> Maybe Name -> Maybe Int -> Maybe Name -> KimiConfig)
-> Parser (Maybe Name)
-> Parser (Maybe Name -> Maybe Int -> Maybe Name -> KimiConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
modelOpt
    Parser (Maybe Name -> Maybe Int -> Maybe Name -> KimiConfig)
-> Parser (Maybe Name)
-> Parser (Maybe Int -> Maybe Name -> KimiConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
providerOpt
    Parser (Maybe Int -> Maybe Name -> KimiConfig)
-> Parser (Maybe Int) -> Parser (Maybe Name -> KimiConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Int)
quiesceOpt
    Parser (Maybe Name -> KimiConfig)
-> Parser (Maybe Name) -> Parser KimiConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
pitbossOpt

parseLlmConfig :: Parser LlmConfig
parseLlmConfig :: Parser LlmConfig
parseLlmConfig =
  String
-> [Name]
-> String
-> Maybe Name
-> Name
-> String
-> Maybe Int
-> Maybe Name
-> LlmConfig
LlmConfig
    (String
 -> [Name]
 -> String
 -> Maybe Name
 -> Name
 -> String
 -> Maybe Int
 -> Maybe Name
 -> LlmConfig)
-> Parser String
-> Parser
     ([Name]
      -> String
      -> Maybe Name
      -> Name
      -> String
      -> Maybe Int
      -> Maybe Name
      -> LlmConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
rootOpt
    Parser
  ([Name]
   -> String
   -> Maybe Name
   -> Name
   -> String
   -> Maybe Int
   -> Maybe Name
   -> LlmConfig)
-> Parser [Name]
-> Parser
     (String
      -> Maybe Name
      -> Name
      -> String
      -> Maybe Int
      -> Maybe Name
      -> LlmConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [Name]
namesOpt
    Parser
  (String
   -> Maybe Name
   -> Name
   -> String
   -> Maybe Int
   -> Maybe Name
   -> LlmConfig)
-> Parser String
-> Parser
     (Maybe Name
      -> Name -> String -> Maybe Int -> Maybe Name -> LlmConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
promptOpt
    Parser
  (Maybe Name
   -> Name -> String -> Maybe Int -> Maybe Name -> LlmConfig)
-> Parser (Maybe Name)
-> Parser (Name -> String -> Maybe Int -> Maybe Name -> LlmConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
modelOpt
    Parser (Name -> String -> Maybe Int -> Maybe Name -> LlmConfig)
-> Parser Name
-> Parser (String -> Maybe Int -> Maybe Name -> LlmConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
baseUrlOpt
    Parser (String -> Maybe Int -> Maybe Name -> LlmConfig)
-> Parser String -> Parser (Maybe Int -> Maybe Name -> LlmConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
keyEnvOpt
    Parser (Maybe Int -> Maybe Name -> LlmConfig)
-> Parser (Maybe Int) -> Parser (Maybe Name -> LlmConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Int)
quiesceOpt
    Parser (Maybe Name -> LlmConfig)
-> Parser (Maybe Name) -> Parser LlmConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
pitbossOpt
  where
    baseUrlOpt :: Parser Name
baseUrlOpt =
      ReadM Name -> Mod OptionFields Name -> Parser Name
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
        (String -> Name
T.pack (String -> Name) -> ReadM String -> ReadM Name
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
        ( String -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"base-url"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"URL"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> Name -> Mod OptionFields Name
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value (LlmConfig -> Name
lcBaseUrl LlmConfig
defaultLlmConfig)
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields Name
forall a (f :: * -> *). Show a => Mod f a
showDefault
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. String -> Mod f a
help String
"OpenAI-compatible API base URL"
        )
    keyEnvOpt :: Parser String
keyEnvOpt =
      Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        ( String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"key-env"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAME"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value (LlmConfig -> String
lcKeyEnv LlmConfig
defaultLlmConfig)
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields String
forall a (f :: * -> *). Show a => Mod f a
showDefault
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"Environment variable holding the API key"
        )

parseCommandConfig :: Parser CommandConfig
parseCommandConfig :: Parser CommandConfig
parseCommandConfig =
  String
-> [Name]
-> String
-> [String]
-> Maybe Int
-> Maybe Name
-> CommandConfig
CommandConfig
    (String
 -> [Name]
 -> String
 -> [String]
 -> Maybe Int
 -> Maybe Name
 -> CommandConfig)
-> Parser String
-> Parser
     ([Name]
      -> String -> [String] -> Maybe Int -> Maybe Name -> CommandConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
rootOpt
    Parser
  ([Name]
   -> String -> [String] -> Maybe Int -> Maybe Name -> CommandConfig)
-> Parser [Name]
-> Parser
     (String -> [String] -> Maybe Int -> Maybe Name -> CommandConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [Name]
namesOpt
    Parser
  (String -> [String] -> Maybe Int -> Maybe Name -> CommandConfig)
-> Parser String
-> Parser ([String] -> Maybe Int -> Maybe Name -> CommandConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
cmdOpt
    Parser ([String] -> Maybe Int -> Maybe Name -> CommandConfig)
-> Parser [String]
-> Parser (Maybe Int -> Maybe Name -> CommandConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [String]
argsOpt
    Parser (Maybe Int -> Maybe Name -> CommandConfig)
-> Parser (Maybe Int) -> Parser (Maybe Name -> CommandConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Int)
quiesceOpt
    Parser (Maybe Name -> CommandConfig)
-> Parser (Maybe Name) -> Parser CommandConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
pitbossOpt
  where
    cmdOpt :: Parser String
cmdOpt =
      Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        ( String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"cmd"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"CMD"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"External command to invoke per post"
        )
    argsOpt :: Parser [String]
argsOpt =
      Parser String -> Parser [String]
forall a. Parser a -> Parser [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many
        ( ReadM String -> Mod ArgumentFields String -> Parser String
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument
            ReadM String
forall s. IsString s => ReadM s
str
            (String -> Mod ArgumentFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"ARG..." Mod ArgumentFields String
-> Mod ArgumentFields String -> Mod ArgumentFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"Arguments passed to CMD")
        )

parseGatewayConfig :: Parser GatewayCliConfig
parseGatewayConfig :: Parser GatewayCliConfig
parseGatewayConfig =
  String
-> [Name]
-> String
-> Name
-> String
-> Maybe Int
-> Maybe Name
-> GatewayCliConfig
GatewayCliConfig
    (String
 -> [Name]
 -> String
 -> Name
 -> String
 -> Maybe Int
 -> Maybe Name
 -> GatewayCliConfig)
-> Parser String
-> Parser
     ([Name]
      -> String
      -> Name
      -> String
      -> Maybe Int
      -> Maybe Name
      -> GatewayCliConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser String
rootOpt
    Parser
  ([Name]
   -> String
   -> Name
   -> String
   -> Maybe Int
   -> Maybe Name
   -> GatewayCliConfig)
-> Parser [Name]
-> Parser
     (String
      -> Name -> String -> Maybe Int -> Maybe Name -> GatewayCliConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser [Name]
namesOpt
    Parser
  (String
   -> Name -> String -> Maybe Int -> Maybe Name -> GatewayCliConfig)
-> Parser String
-> Parser
     (Name -> String -> Maybe Int -> Maybe Name -> GatewayCliConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
promptOpt
    Parser
  (Name -> String -> Maybe Int -> Maybe Name -> GatewayCliConfig)
-> Parser Name
-> Parser (String -> Maybe Int -> Maybe Name -> GatewayCliConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Name
baseUrlOpt
    Parser (String -> Maybe Int -> Maybe Name -> GatewayCliConfig)
-> Parser String
-> Parser (Maybe Int -> Maybe Name -> GatewayCliConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String
keyEnvOpt
    Parser (Maybe Int -> Maybe Name -> GatewayCliConfig)
-> Parser (Maybe Int) -> Parser (Maybe Name -> GatewayCliConfig)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Int)
quiesceOpt
    Parser (Maybe Name -> GatewayCliConfig)
-> Parser (Maybe Name) -> Parser GatewayCliConfig
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Maybe Name)
pitbossOpt
  where
    baseUrlOpt :: Parser Name
baseUrlOpt =
      ReadM Name -> Mod OptionFields Name -> Parser Name
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
        (String -> Name
T.pack (String -> Name) -> ReadM String -> ReadM Name
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadM String
forall s. IsString s => ReadM s
str)
        ( String -> Mod OptionFields Name
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"base-url"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"URL"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> Name -> Mod OptionFields Name
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value Name
"http://127.0.0.1:8642"
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields Name
forall a (f :: * -> *). Show a => Mod f a
showDefault
            Mod OptionFields Name
-> Mod OptionFields Name -> Mod OptionFields Name
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields Name
forall (f :: * -> *) a. String -> Mod f a
help String
"Hermes gateway api_server base URL"
        )
    keyEnvOpt :: Parser String
keyEnvOpt =
      Mod OptionFields String -> Parser String
forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        ( String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"key-env"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"NAME"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasValue f => a -> Mod f a
value String
"API_SERVER_KEY"
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Mod OptionFields String
forall a (f :: * -> *). Show a => Mod f a
showDefault
            Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"Environment variable holding the api_server Bearer key"
        )