on main help sign in
chore: add name to tools
6e0fedaKujtim Hoxha
internal/config_v2/config.go+28−22
@@ -82,8 +82,9 @@ type ProviderConfig struct {
82}
82}
83
83
84type Agent struct {
84type Agent struct {
85+ ID AgentID `json:"id"`
85− Name string `json:"name"`
86+ Name string `json:"name"`
86− Description string `json:"description,omitempty"`
87+ Description string `json:"description,omitempty"`
87 // This is the id of the system prompt used by the agent
88 // This is the id of the system prompt used by the agent
88 Disabled bool `json:"disabled"`
89 Disabled bool `json:"disabled"`
89
90
@@ -229,6 +230,7 @@ func loadConfig(cwd string) (*Config, error) {
229
230
230 agents := map[AgentID]Agent{
231 agents := map[AgentID]Agent{
231 AgentCoder: {
232 AgentCoder: {
233+ ID: AgentCoder,
232 Name: "Coder",
234 Name: "Coder",
233 Description: "An agent that helps with executing coding tasks.",
235 Description: "An agent that helps with executing coding tasks.",
234 Provider: preferredProvider.ID,
236 Provider: preferredProvider.ID,
@@ -237,6 +239,7 @@ func loadConfig(cwd string) (*Config, error) {
237 // All tools allowed
239 // All tools allowed
238 },
240 },
239 AgentTask: {
241 AgentTask: {
242+ ID: AgentTask,
240 Name: "Task",
243 Name: "Task",
241 Description: "An agent that helps with searching for context and finding implementation details.",
244 Description: "An agent that helps with searching for context and finding implementation details.",
242 Provider: preferredProvider.ID,
245 Provider: preferredProvider.ID,
@@ -254,6 +257,7 @@ func loadConfig(cwd string) (*Config, error) {
254 AllowedLSP: []string{},
257 AllowedLSP: []string{},
255 },
258 },
256 AgentTitle: {
259 AgentTitle: {
260+ ID: AgentTitle,
257 Name: "Title",
261 Name: "Title",
258 Description: "An agent that helps with generating titles for sessions.",
262 Description: "An agent that helps with generating titles for sessions.",
259 Provider: preferredProvider.ID,
263 Provider: preferredProvider.ID,
@@ -265,6 +269,7 @@ func loadConfig(cwd string) (*Config, error) {
265 AllowedLSP: []string{},
269 AllowedLSP: []string{},
266 },
270 },
267 AgentSummarize: {
271 AgentSummarize: {
272+ ID: AgentSummarize,
268 Name: "Summarize",
273 Name: "Summarize",
269 Description: "An agent that helps with summarizing sessions.",
274 Description: "An agent that helps with summarizing sessions.",
270 Provider: preferredProvider.ID,
275 Provider: preferredProvider.ID,
@@ -429,43 +434,44 @@ func mergeAgents(base, global, local *Config) {
429 if cfg == nil {
434 if cfg == nil {
430 continue
435 continue
431 }
436 }
432− for agentID, globalAgent := range cfg.Agents {
437+ for agentID, newAgent := range cfg.Agents {
433 if _, ok := base.Agents[agentID]; !ok {
438 if _, ok := base.Agents[agentID]; !ok {
439+ newAgent.ID = agentID // Ensure the ID is set correctly
434− base.Agents[agentID] = globalAgent
440+ base.Agents[agentID] = newAgent
435 } else {
441 } else {
436 switch agentID {
442 switch agentID {
437 case AgentCoder:
443 case AgentCoder:
438 baseAgent := base.Agents[agentID]
444 baseAgent := base.Agents[agentID]
439− baseAgent.Model = globalAgent.Model
445+ baseAgent.Model = newAgent.Model
440− baseAgent.Provider = globalAgent.Provider
446+ baseAgent.Provider = newAgent.Provider
441− baseAgent.AllowedMCP = globalAgent.AllowedMCP
447+ baseAgent.AllowedMCP = newAgent.AllowedMCP
442− baseAgent.AllowedLSP = globalAgent.AllowedLSP
448+ baseAgent.AllowedLSP = newAgent.AllowedLSP
443 base.Agents[agentID] = baseAgent
449 base.Agents[agentID] = baseAgent
444 case AgentTask:
450 case AgentTask:
445 baseAgent := base.Agents[agentID]
451 baseAgent := base.Agents[agentID]
446− baseAgent.Model = globalAgent.Model
452+ baseAgent.Model = newAgent.Model
447− baseAgent.Provider = globalAgent.Provider
453+ baseAgent.Provider = newAgent.Provider
448 base.Agents[agentID] = baseAgent
454 base.Agents[agentID] = baseAgent
449 case AgentTitle:
455 case AgentTitle:
450 baseAgent := base.Agents[agentID]
456 baseAgent := base.Agents[agentID]
451− baseAgent.Model = globalAgent.Model
457+ baseAgent.Model = newAgent.Model
452− baseAgent.Provider = globalAgent.Provider
458+ baseAgent.Provider = newAgent.Provider
453 base.Agents[agentID] = baseAgent
459 base.Agents[agentID] = baseAgent
454 case AgentSummarize:
460 case AgentSummarize:
455 baseAgent := base.Agents[agentID]
461 baseAgent := base.Agents[agentID]
456− baseAgent.Model = globalAgent.Model
462+ baseAgent.Model = newAgent.Model
457− baseAgent.Provider = globalAgent.Provider
463+ baseAgent.Provider = newAgent.Provider
458 base.Agents[agentID] = baseAgent
464 base.Agents[agentID] = baseAgent
459 default:
465 default:
460 baseAgent := base.Agents[agentID]
466 baseAgent := base.Agents[agentID]
461− baseAgent.Name = globalAgent.Name
467+ baseAgent.Name = newAgent.Name
462− baseAgent.Description = globalAgent.Description
468+ baseAgent.Description = newAgent.Description
463− baseAgent.Disabled = globalAgent.Disabled
469+ baseAgent.Disabled = newAgent.Disabled
464− baseAgent.Provider = globalAgent.Provider
470+ baseAgent.Provider = newAgent.Provider
465− baseAgent.Model = globalAgent.Model
471+ baseAgent.Model = newAgent.Model
466− baseAgent.AllowedTools = globalAgent.AllowedTools
472+ baseAgent.AllowedTools = newAgent.AllowedTools
467− baseAgent.AllowedMCP = globalAgent.AllowedMCP
473+ baseAgent.AllowedMCP = newAgent.AllowedMCP
468− baseAgent.AllowedLSP = globalAgent.AllowedLSP
474+ baseAgent.AllowedLSP = newAgent.AllowedLSP
469 base.Agents[agentID] = baseAgent
475 base.Agents[agentID] = baseAgent
470
476
471 }
477 }
internal/llm/agent/agent-tool.go+4
@@ -26,6 +26,10 @@ type AgentParams struct {
26 Prompt string `json:"prompt"`
26 Prompt string `json:"prompt"`
27}
27}
28
28
29+func (b *agentTool) Name() string {
30+ return AgentToolName
31+}
32+
29func (b *agentTool) Info() tools.ToolInfo {
33func (b *agentTool) Info() tools.ToolInfo {
30 return tools.ToolInfo{
34 return tools.ToolInfo{
31 Name: AgentToolName,
35 Name: AgentToolName,
internal/llm/agent/mcp-tools.go+4
@@ -32,6 +32,10 @@ type MCPClient interface {
32 Close() error
32 Close() error
33}
33}
34
34
35+func (b *mcpTool) Name() string {
36+ return fmt.Sprintf("%s_%s", b.mcpName, b.tool.Name)
37+}
38+
35func (b *mcpTool) Info() tools.ToolInfo {
39func (b *mcpTool) Info() tools.ToolInfo {
36 return tools.ToolInfo{
40 return tools.ToolInfo{
37 Name: fmt.Sprintf("%s_%s", b.mcpName, b.tool.Name),
41 Name: fmt.Sprintf("%s_%s", b.mcpName, b.tool.Name),
internal/llm/provider/provider.go−22
@@ -3,7 +3,6 @@ package provider
3import (
3import (
4 "context"
4 "context"
5 "fmt"
5 "fmt"
6− "maps"
7 "os"
6 "os"
8
7
9 "github.com/charmbracelet/crush/internal/llm/models"
8 "github.com/charmbracelet/crush/internal/llm/models"
@@ -177,18 +176,6 @@ func (p *baseProvider[C]) StreamResponse(ctx context.Context, messages []message
177 return p.client.stream(ctx, messages, tools)
176 return p.client.stream(ctx, messages, tools)
178}
177}
179
178
180−func WithBaseURL(baseURL string) ProviderClientOption {
181− return func(options *providerClientOptions) {
182− options.baseURL = baseURL
183− }
184−}
185−
186−func WithAPIKey(apiKey string) ProviderClientOption {
187− return func(options *providerClientOptions) {
188− options.apiKey = apiKey
189− }
190−}
191−
192func WithModel(model models.Model) ProviderClientOption {
179func WithModel(model models.Model) ProviderClientOption {
193 return func(options *providerClientOptions) {
180 return func(options *providerClientOptions) {
194 options.model = model
181 options.model = model
@@ -201,15 +188,6 @@ func WithDisableCache(disableCache bool) ProviderClientOption {
201 }
188 }
202}
189}
203
190
204−func WithExtraHeaders(extraHeaders map[string]string) ProviderClientOption {
205− return func(options *providerClientOptions) {
206− if options.extraHeaders == nil {
207− options.extraHeaders = make(map[string]string)
208− }
209− maps.Copy(options.extraHeaders, extraHeaders)
210− }
211−}
212−
213func WithMaxTokens(maxTokens int64) ProviderClientOption {
191func WithMaxTokens(maxTokens int64) ProviderClientOption {
214 return func(options *providerClientOptions) {
192 return func(options *providerClientOptions) {
215 options.maxTokens = maxTokens
193 options.maxTokens = maxTokens
internal/llm/tools/bash.go+4
@@ -250,6 +250,10 @@ func NewBashTool(permission permission.Service) BaseTool {
250 }
250 }
251}
251}
252
252
253+func (b *bashTool) Name() string {
254+ return BashToolName
255+}
256+
253func (b *bashTool) Info() ToolInfo {
257func (b *bashTool) Info() ToolInfo {
254 return ToolInfo{
258 return ToolInfo{
255 Name: BashToolName,
259 Name: BashToolName,
internal/llm/tools/diagnostics.go+4
@@ -51,6 +51,10 @@ func NewDiagnosticsTool(lspClients map[string]*lsp.Client) BaseTool {
51 }
51 }
52}
52}
53
53
54+func (b *diagnosticsTool) Name() string {
55+ return DiagnosticsToolName
56+}
57+
54func (b *diagnosticsTool) Info() ToolInfo {
58func (b *diagnosticsTool) Info() ToolInfo {
55 return ToolInfo{
59 return ToolInfo{
56 Name: DiagnosticsToolName,
60 Name: DiagnosticsToolName,
internal/llm/tools/edit.go+4
@@ -106,6 +106,10 @@ func NewEditTool(lspClients map[string]*lsp.Client, permissions permission.Servi
106 }
106 }
107}
107}
108
108
109+func (e *editTool) Name() string {
110+ return EditToolName
111+}
112+
109func (e *editTool) Info() ToolInfo {
113func (e *editTool) Info() ToolInfo {
110 return ToolInfo{
114 return ToolInfo{
111 Name: EditToolName,
115 Name: EditToolName,
internal/llm/tools/fetch.go+4
@@ -79,6 +79,10 @@ func NewFetchTool(permissions permission.Service) BaseTool {
79 }
79 }
80}
80}
81
81
82+func (t *fetchTool) Name() string {
83+ return FetchToolName
84+}
85+
82func (t *fetchTool) Info() ToolInfo {
86func (t *fetchTool) Info() ToolInfo {
83 return ToolInfo{
87 return ToolInfo{
84 Name: FetchToolName,
88 Name: FetchToolName,
internal/llm/tools/glob.go+4
@@ -74,6 +74,10 @@ func NewGlobTool() BaseTool {
74 return &globTool{}
74 return &globTool{}
75}
75}
76
76
77+func (g *globTool) Name() string {
78+ return GlobToolName
79+}
80+
77func (g *globTool) Info() ToolInfo {
81func (g *globTool) Info() ToolInfo {
78 return ToolInfo{
82 return ToolInfo{
79 Name: GlobToolName,
83 Name: GlobToolName,
internal/llm/tools/grep.go+4
@@ -140,6 +140,10 @@ func NewGrepTool() BaseTool {
140 return &grepTool{}
140 return &grepTool{}
141}
141}
142
142
143+func (g *grepTool) Name() string {
144+ return GrepToolName
145+}
146+
143func (g *grepTool) Info() ToolInfo {
147func (g *grepTool) Info() ToolInfo {
144 return ToolInfo{
148 return ToolInfo{
145 Name: GrepToolName,
149 Name: GrepToolName,
internal/llm/tools/ls.go+4
@@ -74,6 +74,10 @@ func NewLsTool() BaseTool {
74 return &lsTool{}
74 return &lsTool{}
75}
75}
76
76
77+func (l *lsTool) Name() string {
78+ return LSToolName
79+}
80+
77func (l *lsTool) Info() ToolInfo {
81func (l *lsTool) Info() ToolInfo {
78 return ToolInfo{
82 return ToolInfo{
79 Name: LSToolName,
83 Name: LSToolName,
internal/llm/tools/sourcegraph.go+4
@@ -138,6 +138,10 @@ func NewSourcegraphTool() BaseTool {
138 }
138 }
139}
139}
140
140
141+func (t *sourcegraphTool) Name() string {
142+ return SourcegraphToolName
143+}
144+
141func (t *sourcegraphTool) Info() ToolInfo {
145func (t *sourcegraphTool) Info() ToolInfo {
142 return ToolInfo{
146 return ToolInfo{
143 Name: SourcegraphToolName,
147 Name: SourcegraphToolName,
internal/llm/tools/tools.go+1
@@ -68,6 +68,7 @@ type ToolCall struct {
68
68
69type BaseTool interface {
69type BaseTool interface {
70 Info() ToolInfo
70 Info() ToolInfo
71+ Name() string
71 Run(ctx context.Context, params ToolCall) (ToolResponse, error)
72 Run(ctx context.Context, params ToolCall) (ToolResponse, error)
72}
73}
73
74
internal/llm/tools/view.go+4
@@ -77,6 +77,10 @@ func NewViewTool(lspClients map[string]*lsp.Client) BaseTool {
77 }
77 }
78}
78}
79
79
80+func (v *viewTool) Name() string {
81+ return ViewToolName
82+}
83+
80func (v *viewTool) Info() ToolInfo {
84func (v *viewTool) Info() ToolInfo {
81 return ToolInfo{
85 return ToolInfo{
82 Name: ViewToolName,
86 Name: ViewToolName,
internal/llm/tools/write.go+4
@@ -84,6 +84,10 @@ func NewWriteTool(lspClients map[string]*lsp.Client, permissions permission.Serv
84 }
84 }
85}
85}
86
86
87+func (w *writeTool) Name() string {
88+ return WriteToolName
89+}
90+
87func (w *writeTool) Info() ToolInfo {
91func (w *writeTool) Info() ToolInfo {
88 return ToolInfo{
92 return ToolInfo{
89 Name: WriteToolName,
93 Name: WriteToolName,