on main help sign in
minor fixes
1cdd24fKujtim Hoxha
internal/app/app.go+2−3
@@ -48,9 +48,10 @@ func New(ctx context.Context, conn *sql.DB) (*App, error) {
48 LSPClients: make(map[string]*lsp.Client),
48 LSPClients: make(map[string]*lsp.Client),
49 }
49 }
50
50
51+ app.initLSPClients(ctx)
52+
51 var err error
53 var err error
52 app.CoderAgent, err = agent.NewCoderAgent(
54 app.CoderAgent, err = agent.NewCoderAgent(
53−
54 app.Permissions,
55 app.Permissions,
55 app.Sessions,
56 app.Sessions,
56 app.Messages,
57 app.Messages,
@@ -61,8 +62,6 @@ func New(ctx context.Context, conn *sql.DB) (*App, error) {
61 return nil, err
62 return nil, err
62 }
63 }
63
64
64− app.initLSPClients(ctx)
65−
66 return app, nil
65 return app, nil
67}
66}
68
67
internal/config/config.go+4−1
@@ -272,5 +272,8 @@ func Get() *Config {
272
272
273// WorkingDirectory returns the current working directory from the configuration.
273// WorkingDirectory returns the current working directory from the configuration.
274func WorkingDirectory() string {
274func WorkingDirectory() string {
275− return viper.GetString("wd")
275+ if cfg == nil {
276+ panic("config not loaded")
277+ }
278+ return cfg.WorkingDir
276}
279}
internal/llm/agent/agent-tool.go+5−3
@@ -53,7 +53,7 @@ func (b *agentTool) Run(ctx context.Context, call tools.ToolCall) (tools.ToolRes
53 return tools.ToolResponse{}, fmt.Errorf("session_id and message_id are required")
53 return tools.ToolResponse{}, fmt.Errorf("session_id and message_id are required")
54 }
54 }
55
55
56− agent, err := NewTaskAgent(b.lspClients)
56+ agent, err := NewTaskAgent(b.messages, b.sessions, b.lspClients)
57 if err != nil {
57 if err != nil {
58 return tools.ToolResponse{}, fmt.Errorf("error creating agent: %s", err)
58 return tools.ToolResponse{}, fmt.Errorf("error creating agent: %s", err)
59 }
59 }
@@ -105,9 +105,11 @@ func (b *agentTool) Run(ctx context.Context, call tools.ToolCall) (tools.ToolRes
105func NewAgentTool(
105func NewAgentTool(
106 Sessions session.Service,
106 Sessions session.Service,
107 Messages message.Service,
107 Messages message.Service,
108+ LspClients map[string]*lsp.Client,
108) tools.BaseTool {
109) tools.BaseTool {
109 return &agentTool{
110 return &agentTool{
110− sessions: Sessions,
111+ sessions: Sessions,
111− messages: Messages,
112+ messages: Messages,
113+ lspClients: LspClients,
112 }
114 }
113}
115}
internal/llm/agent/agent.go+17
@@ -4,6 +4,8 @@ import (
4 "context"
4 "context"
5 "errors"
5 "errors"
6 "fmt"
6 "fmt"
7+ "os"
8+ "runtime/debug"
7 "strings"
9 "strings"
8 "sync"
10 "sync"
9
11
@@ -88,6 +90,21 @@ func (a *agent) Generate(ctx context.Context, sessionID string, content string)
88 defer func() {
90 defer func() {
89 if r := recover(); r != nil {
91 if r := recover(); r != nil {
90 logging.ErrorPersist(fmt.Sprintf("Panic in Generate: %v", r))
92 logging.ErrorPersist(fmt.Sprintf("Panic in Generate: %v", r))
93+
94+ // dump stack trace into a file
95+ file, err := os.Create("panic.log")
96+ if err != nil {
97+ logging.ErrorPersist(fmt.Sprintf("Failed to create panic log: %v", err))
98+ return
99+ }
100+
101+ defer file.Close()
102+
103+ stackTrace := debug.Stack()
104+ if _, err := file.Write(stackTrace); err != nil {
105+ logging.ErrorPersist(fmt.Sprintf("Failed to write panic log: %v", err))
106+ }
107+
91 }
108 }
92 }()
109 }()
93 defer a.activeRequests.Delete(sessionID)
110 defer a.activeRequests.Delete(sessionID)
internal/llm/agent/coder.go+1−1
@@ -49,7 +49,7 @@ func NewCoderAgent(
49 tools.NewSourcegraphTool(),
49 tools.NewSourcegraphTool(),
50 tools.NewViewTool(lspClients),
50 tools.NewViewTool(lspClients),
51 tools.NewWriteTool(lspClients, permissions),
51 tools.NewWriteTool(lspClients, permissions),
52− NewAgentTool(sessions, messages),
52+ NewAgentTool(sessions, messages, lspClients),
53 }, otherTools...,
53 }, otherTools...,
54 ),
54 ),
55 )
55 )
internal/llm/agent/task.go+20−19
@@ -8,39 +8,40 @@ import (
8 "github.com/kujtimiihoxha/termai/internal/llm/models"
8 "github.com/kujtimiihoxha/termai/internal/llm/models"
9 "github.com/kujtimiihoxha/termai/internal/llm/tools"
9 "github.com/kujtimiihoxha/termai/internal/llm/tools"
10 "github.com/kujtimiihoxha/termai/internal/lsp"
10 "github.com/kujtimiihoxha/termai/internal/lsp"
11+ "github.com/kujtimiihoxha/termai/internal/message"
12+ "github.com/kujtimiihoxha/termai/internal/session"
11)
13)
12
14
13type taskAgent struct {
15type taskAgent struct {
14− *agent
16+ Service
15}
17}
16
18
17−func (c *taskAgent) Generate(ctx context.Context, sessionID string, content string) error {
18− return c.generate(ctx, sessionID, content)
19−}
20−
21−func NewTaskAgent(lspClients map[string]*lsp.Client) (Service, error) {
19+func NewTaskAgent(messages message.Service, sessions session.Service, lspClients map[string]*lsp.Client) (Service, error) {
22 model, ok := models.SupportedModels[config.Get().Model.Coder]
20 model, ok := models.SupportedModels[config.Get().Model.Coder]
23 if !ok {
21 if !ok {
24 return nil, errors.New("model not supported")
22 return nil, errors.New("model not supported")
25 }
23 }
26
24
27 ctx := context.Background()
25 ctx := context.Background()
28− agentProvider, titleGenerator, err := getAgentProviders(ctx, model)
26+
27+ agent, err := NewAgent(
28+ ctx,
29+ sessions,
30+ messages,
31+ model,
32+ []tools.BaseTool{
33+ tools.NewGlobTool(),
34+ tools.NewGrepTool(),
35+ tools.NewLsTool(),
36+ tools.NewSourcegraphTool(),
37+ tools.NewViewTool(lspClients),
38+ },
39+ )
29 if err != nil {
40 if err != nil {
30 return nil, err
41 return nil, err
31 }
42 }
43+
32 return &taskAgent{
44 return &taskAgent{
33− agent: &agent{
45+ agent,
34− tools: []tools.BaseTool{
35− tools.NewGlobTool(),
36− tools.NewGrepTool(),
37− tools.NewLsTool(),
38− tools.NewSourcegraphTool(),
39− tools.NewViewTool(lspClients),
40− },
41− model: model,
42− agent: agentProvider,
43− titleGenerator: titleGenerator,
44− },
45 }, nil
46 }, nil
46}
47}