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	agentProvider, titleGenerator, err := getAgentProviders(app.Context, model)
44	if err != nil {
45		return nil, err
46	}
47
48	otherTools := GetMcpTools(app.Context, app.Permissions)
49	if len(app.LSPClients) > 0 {
50		otherTools = append(otherTools, tools.NewDiagnosticsTool(app.LSPClients))
51	}
52	return &coderAgent{
53		agent: &agent{
54			App: app,
55			tools: append(
56				[]tools.BaseTool{
57					tools.NewBashTool(app.Permissions),
58					tools.NewEditTool(app.LSPClients, app.Permissions),
59					tools.NewFetchTool(app.Permissions),
60					tools.NewGlobTool(),
61					tools.NewGrepTool(),
62					tools.NewLsTool(),
63					tools.NewSourcegraphTool(),
64					tools.NewViewTool(app.LSPClients),
65					tools.NewWriteTool(app.LSPClients, app.Permissions),
66				}, otherTools...,
67			),
68			model:          model,
69			agent:          agentProvider,
70			titleGenerator: titleGenerator,
71		},
72	}, nil
73}