on main help sign in
fix: improve code
a2f7cbbCarlos Alexandro Becker
internal/agent/tools/fetch.go−6
@@ -28,12 +28,6 @@ type FetchPermissionsParams struct {
28 Timeout int `json:"timeout,omitempty"`
28 Timeout int `json:"timeout,omitempty"`
29}
29}
30
30
31−type fetchTool struct {
32− client *http.Client
33− permissions permission.Service
34− workingDir string
35−}
36−
37const FetchToolName = "fetch"
31const FetchToolName = "fetch"
38
32
39//go:embed fetch.md
33//go:embed fetch.md
internal/agent/tools/mcp-tools.go+10−8
@@ -12,13 +12,15 @@ import (
12// GetMCPTools gets all the currently available MCP tools.
12// GetMCPTools gets all the currently available MCP tools.
13func GetMCPTools(permissions permission.Service, wd string) []*Tool {
13func GetMCPTools(permissions permission.Service, wd string) []*Tool {
14 var result []*Tool
14 var result []*Tool
15− for name, tool := range mcp.Tools() {
15+ for mcpName, tools := range mcp.Tools() {
16+ for _, tool := range tools {
16− result = append(result, &Tool{
17+ result = append(result, &Tool{
17− mcpName: name,
18+ mcpName: mcpName,
18− tool: tool,
19+ tool: tool,
19− permissions: permissions,
20+ permissions: permissions,
20− workingDir: wd,
21+ workingDir: wd,
21− })
22+ })
23+ }
22 }
24 }
23 return result
25 return result
24}
26}
@@ -74,7 +76,7 @@ func (m *Tool) Info() fantasy.ToolInfo {
74 }
76 }
75
77
76 return fantasy.ToolInfo{
78 return fantasy.ToolInfo{
77− Name: fmt.Sprintf("mcp_%s_%s", m.mcpName, m.tool.Name),
79+ Name: m.Name(),
78 Description: m.tool.Description,
80 Description: m.tool.Description,
79 Parameters: parameters,
81 Parameters: parameters,
80 Required: required,
82 Required: required,
internal/agent/tools/mcp/init.go+4−4
@@ -58,12 +58,12 @@ func (s State) String() string {
58}
58}
59
59
60// EventType represents the type of MCP event
60// EventType represents the type of MCP event
61−type EventType string
61+type EventType uint
62
62
63const (
63const (
64− EventStateChanged EventType = "state_changed"
64+ EventStateChanged EventType = iota
65− EventToolsListChanged EventType = "tools_list_changed"
65+ EventToolsListChanged
66− EventPromptsListChanged EventType = "prompts_list_changed"
66+ EventPromptsListChanged
67)
67)
68
68
69// Event represents an event in the MCP system
69// Event represents an event in the MCP system
internal/agent/tools/mcp/prompts.go+7−18
@@ -11,13 +11,10 @@ import (
11
11
12type Prompt = mcp.Prompt
12type Prompt = mcp.Prompt
13
13
14−var (
15− allPrompts = csync.NewMap[string, *Prompt]()
16− clientPrompts = csync.NewMap[string, []*Prompt]()
14+var allPrompts = csync.NewMap[string, []*Prompt]()
17−)
18
15
19// Prompts returns all available MCP prompts.
16// Prompts returns all available MCP prompts.
20−func Prompts() iter.Seq2[string, *Prompt] {
17+func Prompts() iter.Seq2[string, []*Prompt] {
21 return allPrompts.Seq2()
18 return allPrompts.Seq2()
22}
19}
23
20
@@ -65,10 +62,8 @@ func RefreshPrompts(ctx context.Context, name string) {
65 updatePrompts(name, prompts)
62 updatePrompts(name, prompts)
66
63
67 prev, _ := states.Get(name)
64 prev, _ := states.Get(name)
65+ prev.Counts.Prompts = len(prompts)
68− updateState(name, StateConnected, nil, session, Counts{
66+ updateState(name, StateConnected, nil, session, prev.Counts)
69− Prompts: len(prompts),
70− Tools: prev.Counts.Tools,
71− })
72}
67}
73
68
74func getPrompts(ctx context.Context, c *mcp.ClientSession) ([]*Prompt, error) {
69func getPrompts(ctx context.Context, c *mcp.ClientSession) ([]*Prompt, error) {
@@ -85,14 +80,8 @@ func getPrompts(ctx context.Context, c *mcp.ClientSession) ([]*Prompt, error) {
85// updatePrompts updates the global mcpPrompts and mcpClient2Prompts maps
80// updatePrompts updates the global mcpPrompts and mcpClient2Prompts maps
86func updatePrompts(mcpName string, prompts []*Prompt) {
81func updatePrompts(mcpName string, prompts []*Prompt) {
87 if len(prompts) == 0 {
82 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)
83+ allPrompts.Del(mcpName)
96− }
84+ return
97 }
85 }
86+ allPrompts.Set(mcpName, prompts)
98}
87}
internal/agent/tools/mcp/tools.go+7−18
@@ -14,13 +14,10 @@ import (
14
14
15type Tool = mcp.Tool
15type Tool = mcp.Tool
16
16
17−var (
18− allTools = csync.NewMap[string, *Tool]()
19− clientTools = csync.NewMap[string, []*Tool]()
17+var allTools = csync.NewMap[string, []*Tool]()
20−)
21
18
22// Tools returns all available MCP tools.
19// Tools returns all available MCP tools.
23−func Tools() iter.Seq2[string, *Tool] {
20+func Tools() iter.Seq2[string, []*Tool] {
24 return allTools.Seq2()
21 return allTools.Seq2()
25}
22}
26
23
@@ -72,10 +69,8 @@ func RefreshTools(ctx context.Context, name string) {
72 updateTools(name, tools)
69 updateTools(name, tools)
73
70
74 prev, _ := states.Get(name)
71 prev, _ := states.Get(name)
72+ prev.Counts.Tools = len(tools)
75− updateState(name, StateConnected, nil, session, Counts{
73+ updateState(name, StateConnected, nil, session, prev.Counts)
76− Tools: len(tools),
77− Prompts: prev.Counts.Prompts,
78− })
79}
74}
80
75
81func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error) {
76func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error) {
@@ -89,16 +84,10 @@ func getTools(ctx context.Context, session *mcp.ClientSession) ([]*Tool, error)
89 return result.Tools, nil
84 return result.Tools, nil
90}
85}
91
86
92−// updateTools updates the global mcpTools and mcpClient2Tools maps
93func updateTools(name string, tools []*Tool) {
87func updateTools(name string, tools []*Tool) {
94 if len(tools) == 0 {
88 if len(tools) == 0 {
95− clientTools.Del(name)
89+ allTools.Del(name)
96− } else {
90+ return
97− clientTools.Set(name, tools)
98− }
99− for name, tools := range clientTools.Seq2() {
100− for _, t := range tools {
101− allTools.Set(name, t)
102− }
103 }
91 }
92+ allTools.Set(name, tools)
104}
93}
internal/tui/components/dialogs/commands/loader.go+13−15
@@ -1,10 +1,10 @@
1package commands
1package commands
2
2
3import (
3import (
4+ "cmp"
4 "context"
5 "context"
5 "fmt"
6 "fmt"
6 "io/fs"
7 "io/fs"
7− "log/slog"
8 "os"
8 "os"
9 "path/filepath"
9 "path/filepath"
10 "regexp"
10 "regexp"
@@ -223,32 +223,30 @@ type CommandRunCustomMsg struct {
223
223
224func loadMCPPrompts() []Command {
224func loadMCPPrompts() []Command {
225 var commands []Command
225 var commands []Command
226− for key, prompt := range mcp.Prompts() {
226+ for mcpName, prompts := range mcp.Prompts() {
227− clientName, promptName, ok := strings.Cut(key, ":")
227+ for _, prompt := range prompts {
228− if !ok {
228+ key := mcpName + ":" + prompt.Name
229− slog.Warn("prompt not found", "key", key)
229+ commands = append(commands, Command{
230− continue
230+ ID: key,
231+ Title: cmp.Or(prompt.Title, prompt.Name),
232+ Description: prompt.Description,
233+ Handler: createMCPPromptHandler(mcpName, prompt.Name, prompt),
234+ })
231 }
235 }
232− commands = append(commands, Command{
233− ID: key,
234− Title: clientName + ":" + promptName,
235− Description: prompt.Description,
236− Handler: createMCPPromptHandler(clientName, promptName, prompt),
237− })
238 }
236 }
239
237
240 return commands
238 return commands
241}
239}
242
240
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 {
244 return func(cmd Command) tea.Cmd {
242 return func(cmd Command) tea.Cmd {
245 if len(prompt.Arguments) == 0 {
243 if len(prompt.Arguments) == 0 {
246− return execMCPPrompt(clientName, promptName, nil)
244+ return execMCPPrompt(mcpName, promptName, nil)
247 }
245 }
248 return util.CmdHandler(ShowMCPPromptArgumentsDialogMsg{
246 return util.CmdHandler(ShowMCPPromptArgumentsDialogMsg{
249 Prompt: prompt,
247 Prompt: prompt,
250 OnSubmit: func(args map[string]string) tea.Cmd {
248 OnSubmit: func(args map[string]string) tea.Cmd {
251− return execMCPPrompt(clientName, promptName, args)
249+ return execMCPPrompt(mcpName, promptName, args)
252 },
250 },
253 })
251 })
254 }
252 }