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}