Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-mcp

Model Context Protocol server for Pudu language documentation and compiler tools

0.1.1Apache-2.01

InstallClose

Prompts.pudu

Pudu43 lines1.9 KB

GitHub ↗
1/** @App.Prompts.Handler — lists and renders prompt templates */2module PuduLangMcp.App.Prompts34import Std.Json as Json5import PuduLangMcp.App.Context as Context6import PuduLangMcp.Constants.Protocol as Protocol7import PuduLangMcp.Constants.Server as Server8import PuduLangMcp.Domain.Catalog.Prompts as Prompts9import PuduLangMcp.Domain.Protocol.Pagination as Pagination10import PuduLangMcp.Domain.Rpc.Reply as Reply11import PuduLangMcp.Errors.RpcError as RpcError12import PuduLangMcp.Utils.JsonAccess as Access1314/// Answers one page of the prompts.15export fn list(context: &Context.Context, params: &Json.Json) -> Result[Json.Json, RpcError.ProtocolError] {16  let cursor = Pagination.cursorOf(params) ?17  let paged = Pagination.page(&Prompts.all(), &cursor, Server.PAGE_SIZE) ?18  var fields = [("prompts", Json.list(&paged[0].map(|spec: Prompts.PromptSpec| Prompts.toJson(&spec))))]19  if let Some(next) = paged[1] { fields = fields.push(("nextCursor", Json.Text(next))) }20  Ok(Reply.complete(&fields, &Reply.Cached(Server.LIST_TTL_MS, Protocol.CACHE_PUBLIC)))21}2223/// Answers one prompt rendered with its arguments.24export fn get(context: &Context.Context, params: &Json.Json) -> Result[Json.Json, RpcError.ProtocolError] {25  let name = match Access.text(params, "name") {26    case Some(given) => given27    case None => { return Err(RpcError.InvalidParams("name must be a string")) }28  }29  let arguments = match Access.member(params, "arguments") {30    case None => Json.object(&[])31    case Some(Json.Object(fields)) => Json.Object(fields)32    case Some(_) => { return Err(RpcError.InvalidParams("arguments must be an object")) }33  }34  let rendered = Prompts.render(name, &arguments) ?35  Ok(Reply.complete(&[36        ("description", Json.Text(rendered[0])),37        ("messages", Json.list(&[Json.object(&[38                  ("role", Json.Text("user")),39                  ("content", Json.object(&[("type", Json.Text("text")), ("text", Json.Text(rendered[1]))]))40                ])]))41      ], &Reply.NoCache))42}43