intelli-monad-0.1.0.2: src/IntelliMonad/Tools/Bash.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module IntelliMonad.Tools.Bash where
import Control.Monad.IO.Class
import qualified Data.Aeson as A
import GHC.Generics
import GHC.IO.Exception
import IntelliMonad.Types
import qualified OpenAI.Types as API
import System.Process
data Bash = Bash
{ script :: String
}
deriving (Eq, Show, Generic, JSONSchema, A.FromJSON, A.ToJSON)
instance HasFunctionObject Bash where
getFunctionName = "call_bash_script"
getFunctionDescription = "Call a bash script in a local environment"
getFieldDescription "script" = "A script executing in a local environment"
instance Tool Bash where
data Output Bash = BashOutput
{ code :: Int,
stdout :: String,
stderr :: String
}
deriving (Eq, Show, Generic, A.FromJSON, A.ToJSON)
toolExec args = liftIO $ do
(code, stdout, stderr) <- readCreateProcessWithExitCode (shell args.script) ""
let code' = case code of
ExitSuccess -> 0
ExitFailure v -> v
return $ BashOutput code' stdout stderr