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}