coder.go

 1package agent
 2
 3import (
 4	"errors"
 5
 6	"github.com/kujtimiihoxha/termai/internal/app"
 7	"github.com/kujtimiihoxha/termai/internal/config"
 8	"github.com/kujtimiihoxha/termai/internal/llm/models"
 9	"github.com/kujtimiihoxha/termai/internal/llm/tools"
10)
11
12type coderAgent struct {
13	*agent
14}
15
16func (c *coderAgent) setAgentTool(sessionID string) {
17	inx := -1
18	for i, tool := range c.tools {
19		if tool.Info().Name == AgentToolName {
20			inx = i
21			break
22		}
23	}
24	if inx == -1 {
25		c.tools = append(c.tools, NewAgentTool(sessionID, c.App))
26	} else {
27		c.tools[inx] = NewAgentTool(sessionID, c.App)
28	}
29}
30
31func (c *coderAgent) Generate(sessionID string, content string) error {
32	c.setAgentTool(sessionID)
33	return c.generate(sessionID, content)
34}
35
36func NewCoderAgent(app *app.App) (Agent, error) {
37	model, ok := models.SupportedModels[config.Get().Model.Coder]
38	if !ok {
39		return nil, errors.New("model not supported")
40	}
41
42	agentProvider, titleGenerator, err := getAgentProviders(app.Context, model)
43	if err != nil {
44		return nil, err
45	}
46
47	otherTools := GetMcpTools(app.Context, app.Permissions)
48	if len(app.LSPClients) > 0 {
49		otherTools = append(otherTools, tools.NewDiagnosticsTool(app.LSPClients))
50	}
51	return &coderAgent{
52		agent: &agent{
53			App: app,
54			tools: append(
55				[]tools.BaseTool{
56					tools.NewBashTool(app.Permissions),
57					tools.NewEditTool(app.LSPClients, app.Permissions),
58					tools.NewFetchTool(app.Permissions),
59					tools.NewGlobTool(),
60					tools.NewGrepTool(),
61					tools.NewLsTool(),
62					tools.NewSourcegraphTool(),
63					tools.NewViewTool(app.LSPClients),
64					tools.NewWriteTool(app.LSPClients, app.Permissions),
65				}, otherTools...,
66			),
67			model:          model,
68			agent:          agentProvider,
69			titleGenerator: titleGenerator,
70		},
71	}, nil
72}