coder.go

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