
Prompts.pudu
Pudu43 lines1.9 KB
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 Access131415export 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}222324export 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