refactor: more cleanup

Carlos Alexandro Becker created

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Change summary

internal/tui/components/dialogs/commands/loader.go | 32 ++++------
internal/tui/tui.go                                | 47 ++-------------
2 files changed, 21 insertions(+), 58 deletions(-)

Detailed changes

internal/tui/components/dialogs/commands/loader.go 🔗

@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"io/fs"
+	"log/slog"
 	"os"
 	"path/filepath"
 	"regexp"
@@ -214,45 +215,40 @@ func LoadMCPPrompts() []Command {
 	commands := make([]Command, 0, len(prompts))
 
 	for key, prompt := range prompts {
-		p := prompt
 		clientName, promptName, ok := strings.Cut(key, ":")
 		if !ok {
+			slog.Warn("prompt not found", "key", key)
 			continue
 		}
 		commands = append(commands, Command{
 			ID:          key,
 			Title:       clientName + ":" + promptName,
-			Description: p.Description,
-			Handler:     createMCPPromptHandler(key, promptName, p),
+			Description: prompt.Description,
+			Handler:     createMCPPromptHandler(clientName, promptName, prompt),
 		})
 	}
 
 	return commands
 }
 
-func createMCPPromptHandler(key, promptName string, prompt *mcp.Prompt) func(Command) tea.Cmd {
+func createMCPPromptHandler(clientName, promptName string, prompt *mcp.Prompt) func(Command) tea.Cmd {
 	return func(cmd Command) tea.Cmd {
 		if len(prompt.Arguments) == 0 {
-			return executeMCPPromptWithoutArgs(key, promptName)
+			return execMCPPrompt(clientName, promptName, nil)
 		}
 		return util.CmdHandler(ShowMCPPromptArgumentsDialogMsg{
-			PromptID:   cmd.ID,
-			PromptName: promptName,
+			Prompt: prompt,
+			OnSubmit: func(args map[string]string) tea.Cmd {
+				return execMCPPrompt(clientName, promptName, args)
+			},
 		})
 	}
 }
 
-func executeMCPPromptWithoutArgs(key, promptName string) tea.Cmd {
+func execMCPPrompt(clientName, promptName string, args map[string]string) tea.Cmd {
 	return func() tea.Msg {
-		// key format is "clientName:promptName"
-		parts := strings.SplitN(key, ":", 2)
-		if len(parts) != 2 {
-			return util.ReportError(fmt.Errorf("invalid prompt key: %s", key))
-		}
-		clientName := parts[0]
-
 		ctx := context.Background()
-		result, err := agent.GetMCPPromptContent(ctx, clientName, promptName, nil)
+		result, err := agent.GetMCPPromptContent(ctx, clientName, promptName, args)
 		if err != nil {
 			return util.ReportError(err)
 		}
@@ -274,6 +270,6 @@ func executeMCPPromptWithoutArgs(key, promptName string) tea.Cmd {
 }
 
 type ShowMCPPromptArgumentsDialogMsg struct {
-	PromptID   string
-	PromptName string
+	Prompt   *mcp.Prompt
+	OnSubmit func(arg map[string]string) tea.Cmd
 }

internal/tui/tui.go 🔗

@@ -3,7 +3,6 @@ package tui
 import (
 	"context"
 	"fmt"
-	"log/slog"
 	"math/rand"
 	"strings"
 	"time"
@@ -35,7 +34,6 @@ import (
 	"github.com/charmbracelet/crush/internal/tui/styles"
 	"github.com/charmbracelet/crush/internal/tui/util"
 	"github.com/charmbracelet/lipgloss/v2"
-	"github.com/modelcontextprotocol/go-sdk/mcp"
 	"golang.org/x/text/cases"
 	"golang.org/x/text/language"
 )
@@ -175,48 +173,17 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			},
 		)
 	case commands.ShowMCPPromptArgumentsDialogMsg:
-		prompt, ok := agent.GetMCPPrompt(msg.PromptID)
-		clientName, _, ok := strings.Cut(msg.PromptID, ":")
-		if !ok {
-			slog.Warn("prompt not found", "prompt_id", msg.PromptID, "prompt_name", msg.PromptName)
-			util.ReportWarn(fmt.Sprintf("Prompt %s not found", msg.PromptName))
-			return a, nil
-		}
-		args := make([]commands.Argument, 0, len(prompt.Arguments))
-		for _, arg := range prompt.Arguments {
+		args := make([]commands.Argument, 0, len(msg.Prompt.Arguments))
+		for _, arg := range msg.Prompt.Arguments {
 			args = append(args, commands.Argument(*arg))
 		}
 		dialog := commands.NewCommandArgumentsDialog(
-			msg.PromptID,
-			prompt.Title,
-			prompt.Name,
-			prompt.Description,
+			msg.Prompt.Name,
+			msg.Prompt.Title,
+			msg.Prompt.Name,
+			msg.Prompt.Description,
 			args,
-			func(args map[string]string) tea.Cmd {
-				return func() tea.Msg {
-					ctx := context.Background()
-					result, err := agent.GetMCPPromptContent(ctx, clientName, prompt.Name, args)
-					if err != nil {
-						return util.ReportError(err)
-					}
-
-					var content strings.Builder
-					for _, msg := range result.Messages {
-						if msg.Role != "user" {
-							continue
-						}
-						textContent, ok := msg.Content.(*mcp.TextContent)
-						if !ok {
-							continue
-						}
-						_, _ = content.WriteString(textContent.Text)
-						_, _ = content.WriteString("\n")
-					}
-					return commands.CommandRunCustomMsg{
-						Content: content.String(),
-					}
-				}
-			},
+			msg.OnSubmit,
 		)
 		return a, util.CmdHandler(
 			dialogs.OpenDialogMsg{