module Unison.MCP.Prompts (prompts) where

import Data.Map qualified as Map
import Data.Text qualified as Text
import Network.MCP.Types qualified as MCP
import Unison.MCP.StaticResources (unisonGuideText)
import Unison.MCP.Types
import Unison.MCP.Wrapper
import Unison.MCP.Wrapper qualified as MCPWrapper

prompts :: [MCPWrapper.Prompt MCP]
prompts :: [Prompt MCP]
prompts =
  [ Prompt MCP
writeUnisonCodePrompt
  ]

writeUnisonCodePrompt :: Prompt MCP
writeUnisonCodePrompt :: Prompt MCP
writeUnisonCodePrompt =
  Prompt
    { $sel:promptName:Prompt :: Text
promptName = Text
"unison-programming-assistant",
      $sel:promptDescription:Prompt :: Text
promptDescription = Text
"Unison Programming Assistant",
      $sel:promptArgs:Prompt :: Map Text PromptArgument
promptArgs =
        [(Text, PromptArgument)] -> Map Text PromptArgument
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
          [ ( Text
"project-and-branch",
              PromptArgument
                { $sel:promptArgumentDescription:PromptArgument :: Text
promptArgumentDescription = Text
"[Optional] The Unison project and branch this code should be implemented in. E.g. scratch/main",
                  $sel:promptArgumentRequired:PromptArgument :: Bool
promptArgumentRequired = Bool
False
                }
            ),
            ( Text
"preferred-libraries",
              PromptArgument
                { $sel:promptArgumentDescription:PromptArgument :: Text
promptArgumentDescription = Text
"[Optional] Specific libraries you'd like to be used. E.g. `@ceedubs/json and @unison/base`",
                  $sel:promptArgumentRequired:PromptArgument :: Bool
promptArgumentRequired = Bool
False
                }
            )
          ],
      $sel:promptHandler:Prompt :: Map Text Text -> MCP GetPromptResult
promptHandler = \Map Text Text
args -> do
        GetPromptResult -> MCP GetPromptResult
forall a. a -> MCP a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GetPromptResult -> MCP GetPromptResult)
-> GetPromptResult -> MCP GetPromptResult
forall a b. (a -> b) -> a -> b
$
          MCP.GetPromptResult
            { $sel:getPromptDescription:GetPromptResult :: Maybe Text
getPromptDescription = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"Ask the agent to write some Unison code for you.",
              $sel:getPromptMessages:GetPromptResult :: [PromptMessage]
getPromptMessages =
                [ MCP.PromptMessage
                    { $sel:promptMessageRole:PromptMessage :: Text
promptMessageRole = Text
"assistant",
                      $sel:promptMessageContent:PromptMessage :: PromptContent
promptMessageContent =
                        MCP.PromptContent
                          { $sel:promptContentType:PromptContent :: PromptContentType
promptContentType = PromptContentType
TextPromptContent,
                            $sel:promptContentText:PromptContent :: Text
promptContentText =
                              [Text] -> Text
Text.unlines
                                [ Text
"Your role is to be a helpful Unison programming assistant. You will be given a description of a program to write in Unison, and you should write the code to implement it.",
                                  case Text -> Map Text Text -> Maybe Text
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Text
"preferred-libraries" Map Text Text
args of
                                    Just Text
preferredLibs -> Text
"You should use the following unison libraries to accomplish the task if they are applicable: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
preferredLibs Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" if they are not already installed, you may search share for the libraries and then install them."
                                    Maybe Text
Nothing -> Text
"",
                                  Text
"After implementing the code, ensure you typecheck it, and add watch expressions to test any pure functions.",
                                  Text
"You can use the tools available to search Unison Share and the local project and its dependencies for definitions and documentation to help you accomplish your task.",
                                  Text
"",
                                  Text
"You should use the following guidelines when writing Unison code:",
                                  Text
"",
                                  Text
unisonGuideText
                                ]
                          }
                    }
                ]
            }
    }