tools.go

 1package agent
 2
 3import (
 4	"context"
 5
 6	"github.com/charmbracelet/crush/internal/history"
 7	"github.com/charmbracelet/crush/internal/llm/tools"
 8	"github.com/charmbracelet/crush/internal/lsp"
 9	"github.com/charmbracelet/crush/internal/message"
10	"github.com/charmbracelet/crush/internal/permission"
11	"github.com/charmbracelet/crush/internal/session"
12)
13
14func NewCoderTools(
15	ctx context.Context,
16	cwd string,
17	sessions session.Service,
18	messages message.Service,
19	permissions permission.Service,
20	lspClients map[string]*lsp.Client,
21	history history.Service,
22	mcps map[string]MCPConfig,
23) tools.Registry {
24	toolFn := func() []tools.BaseTool {
25		allTools := []tools.BaseTool{
26			tools.NewBashTool(permissions, cwd),
27			tools.NewDownloadTool(permissions, cwd),
28			tools.NewEditTool(lspClients, permissions, history, cwd),
29			tools.NewFetchTool(permissions, cwd),
30			tools.NewGlobTool(cwd),
31			tools.NewGrepTool(cwd),
32			tools.NewLsTool(cwd),
33			tools.NewSourcegraphTool(),
34			tools.NewViewTool(lspClients, cwd),
35			tools.NewWriteTool(lspClients, permissions, history, cwd),
36		}
37		mcpTools := GetMCPTools(ctx, cwd, mcps, permissions)
38		allTools = append(allTools, mcpTools...)
39		if len(lspClients) > 0 {
40			allTools = append(allTools, tools.NewDiagnosticsTool(lspClients))
41		}
42		return allTools
43	}
44	return tools.NewRegistry(toolFn)
45}
46
47func NewTaskTools(cwd string) tools.Registry {
48	return tools.NewRegistryFromTools([]tools.BaseTool{
49		tools.NewGlobTool(cwd),
50		tools.NewGrepTool(cwd),
51		tools.NewLsTool(cwd),
52		tools.NewSourcegraphTool(),
53		// no need for LSP info here
54		tools.NewViewTool(map[string]*lsp.Client{}, cwd),
55	})
56}