{-# 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