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 ] } } ] } }