on main help sign in
fix: improve code

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

commita2f7cbbfb3b1ba1715095161f22b21482396b06c authorCarlos Alexandro Becker <caarlos0@users.noreply.github.com> dateMon 3 Nov 2025, 15:26 (1 year ago) parenta074fa9
6 files changed+41−69
internal/agent/tools/fetch.go−6 internal/agent/tools/mcp-tools.go+10−8 internal/agent/tools/mcp/init.go+4−4 internal/agent/tools/mcp/prompts.go+7−18 internal/agent/tools/mcp/tools.go+7−18 internal/tui/components/dialogs/commands/loader.go+13−15
internal/agent/tools/fetch.go−6
@@ -28,12 +28,6 @@ type FetchPermissionsParams struct {
2828 Timeout int `json:"timeout,omitempty"`
2929}
3030
31−type fetchTool struct {
32− client *http.Client
33− permissions permission.Service
34− workingDir string
35−}
36−
3731const FetchToolName = "fetch"
3832
3933//go:embed fetch.md
internal/agent/tools/mcp-tools.go+10−8
@@ -12,13 +12,15 @@ import (
1212// GetMCPTools gets all the currently available MCP tools.
1313func GetMCPTools(permissions permission.Service, wd string) []*Tool {
1414 var result []*Tool
15− for name, tool := range mcp.Tools() {
16− result = append(result, &Tool{
17− mcpName: name,
18− tool: tool,
19− permissions: permissions,
20− workingDir: wd,
21− })
15+ for mcpName, tools := range mcp.Tools() {
16+ for _, tool := range tools {
17+ result = append(result, &Tool{
18+ mcpName: mcpName,
19+ tool: tool,
20+ permissions: permissions,
21+ workingDir: wd,
22+ })
23+ }
2224 }
2325 return result
2426}
@@ -74,7 +76,7 @@ func (m *Tool) Info() fantasy.ToolInfo {
7476 }
7577
7678 return fantasy.ToolInfo{
77− Name: fmt.Sprintf("mcp_%s_%s", m.mcpName, m.tool.Name),
79+ Name: m.Name(),
7880 Description: m.tool.Description,
7981 Parameters: parameters,
8082 Required: required,
internal/agent/tools/mcp/init.go+4−4
@@ -58,12 +58,12 @@ func (s State) String() string {
5858}
5959
6060// EventType represents the type of MCP event
61−type EventType string
61+type EventType uint
6262
6363const (
64− EventStateChanged EventType = "state_changed"
65− EventToolsListChanged EventType = "tools_list_changed"
66− EventPromptsListChanged EventType = "prompts_list_changed"
64+ EventStateChanged EventType = iota
65+ EventToolsListChanged
66+ EventPromptsListChanged
6767)
6868
6969// Event represents an event in the MCP system
internal/agent/tools/mcp/prompts.go+7−18
@@ -11,13 +11,10 @@ import (
1111
1212type Prompt = mcp.Prompt
1313
14−var (
15− allPrompts = csync.NewMap[string, *Prompt]()
16− clientPrompts = csync.NewMap[string, []*Prompt]()
17−)
14+var allPrompts = csync.NewMap[string, []*Prompt]()
1815
1916// Prompts returns all available MCP prompts.
20−func Prompts() iter.Seq2[string, *Prompt] {
17+func Prompts() iter.Seq2[string, []*Prompt] {
2118 return allPrompts.Seq2()
2219}
2320
@@ -65,10 +62,8 @@ func RefreshPrompts(ctx context.Context, name string) {
6562 updatePrompts(name, prompts)
6663
6764 prev, _ := states.Get(name)
68− updateState(name, StateConnected, nil, session, Counts{
69− Prompts: len(prompts),
70− Tools: prev.Counts.Tools,
71− })
65+ prev.Counts.Prompts = len(prompts)
66+ updateState(name, StateConnected, nil, session, prev.Counts)
7267}
7368
7469func getPrompts(ctx context.Context, c *mcp.ClientSession) ([]*Prompt, error) {
@@ -85,14 +80,8 @@ func getPrompts(ctx context.Context, c *mcp.ClientSession) ([]*Prompt, error) {
8580// updatePrompts updates the global mcpPrompts and mcpClient2Prompts maps
8681func updatePrompts(mcpName string, prompts []*Prompt) {
8782 if len(prompts) == 0 {
88− clientPrompts.Del(mcpName)
89− } else {
90− clientPrompts.Set(mcpName, prompts)
91− }
92− for mcpName, prompts := range clientPrompts.Seq2() {
93− for _, p := range prompts {
94− key := mcpName + ":" + p.Name
95− allPrompts.Set(key, p)
96− }
83+ allPrompts.Del(mcpName)
84+ return
9785 }
86+ allPrompts.Set(mcpName, prompts)
9887}
internal/agent/tools/mcp/tools.go+7−18
@@ -14,13 +14,10 @@ import (
1414
1515type Tool = mcp.Tool
1616
17−var (
18− allTools = csync.NewMap[string, *Tool]()
19− clientTools = csync.NewMap[string, []*Tool]()
20−)
17+var allTools = csync.NewMap[string, []*Tool]()
2118
2219// Tools returns all available MCP tools.
23−func Tools() iter.Seq2[string, *Tool] {
20+func Tools() iter.Seq2[string, []*Tool] {
2421 return allTools.Seq2()
2522}
2623
@@ -72,10 +69,8 @@ func RefreshTools(ctx context.Context, name string) {
7269 updateTools(name, tools)
7370
7471 prev, _ := states.Get(name)
75− updateState(name, StateConnected, nil, session, Counts{
76− Tools: len(tools),
77− Prompts: prev.Counts.Prompts,
78− })
72+ prev.Counts.Tools = len(tools)
73+ updateState(name, StateConnected, nil, session, prev.Counts)
7974}
8075
8176func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error) {
@@ -89,16 +84,10 @@ func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error)
8984 return result.Tools, nil
9085}
9186
92−// updateTools updates the global mcpTools and mcpClient2Tools maps
9387func updateTools(name string, tools []*Tool) {
9488 if len(tools) == 0 {
95− clientTools.Del(name)
96− } else {
97− clientTools.Set(name, tools)
98− }
99− for name, tools := range clientTools.Seq2() {
100− for _, t := range tools {
101− allTools.Set(name, t)
102− }
89+ allTools.Del(name)
90+ return
10391 }
92+ allTools.Set(name, tools)
10493}
internal/tui/components/dialogs/commands/loader.go+13−15
@@ -1,10 +1,10 @@
11package commands
22
33import (
4+ "cmp"
45 "context"
56 "fmt"
67 "io/fs"
7− "log/slog"
88 "os"
99 "path/filepath"
1010 "regexp"
@@ -223,32 +223,30 @@ type CommandRunCustomMsg struct {
223223
224224func loadMCPPrompts() []Command {
225225 var commands []Command
226− for key, prompt := range mcp.Prompts() {
227− clientName, promptName, ok := strings.Cut(key, ":")
228− if !ok {
229− slog.Warn("prompt not found", "key", key)
230− continue
226+ for mcpName, prompts := range mcp.Prompts() {
227+ for _, prompt := range prompts {
228+ key := mcpName + ":" + prompt.Name
229+ commands = append(commands, Command{
230+ ID: key,
231+ Title: cmp.Or(prompt.Title, prompt.Name),
232+ Description: prompt.Description,
233+ Handler: createMCPPromptHandler(mcpName, prompt.Name, prompt),
234+ })
231235 }
232− commands = append(commands, Command{
233− ID: key,
234− Title: clientName + ":" + promptName,
235− Description: prompt.Description,
236− Handler: createMCPPromptHandler(clientName, promptName, prompt),
237− })
238236 }
239237
240238 return commands
241239}
242240
243−func createMCPPromptHandler(clientName, promptName string, prompt *mcp.Prompt) func(Command) tea.Cmd {
241+func createMCPPromptHandler(mcpName, promptName string, prompt *mcp.Prompt) func(Command) tea.Cmd {
244242 return func(cmd Command) tea.Cmd {
245243 if len(prompt.Arguments) == 0 {
246− return execMCPPrompt(clientName, promptName, nil)
244+ return execMCPPrompt(mcpName, promptName, nil)
247245 }
248246 return util.CmdHandler(ShowMCPPromptArgumentsDialogMsg{
249247 Prompt: prompt,
250248 OnSubmit: func(args map[string]string) tea.Cmd {
251− return execMCPPrompt(clientName, promptName, args)
249+ return execMCPPrompt(mcpName, promptName, args)
252250 },
253251 })
254252 }