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}