diff --git a/internal/skills/debug/handlers.go b/internal/skills/debug/handlers.go index 05b63c0..250b32b 100644 --- a/internal/skills/debug/handlers.go +++ b/internal/skills/debug/handlers.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "time" iexec "github.com/mathiasbq/supervisor/internal/exec" "github.com/mathiasbq/supervisor/internal/session" @@ -43,11 +44,12 @@ func (s *Skill) Handle(ctx context.Context, tool string, args json.RawMessage) ( "phase: debug\nproject_root: %s\nerror: %s\ncontext: %s\nmodel: %s", a.ProjectRoot, a.Error, a.Context, model, ) - task = s.prependHistory(a.SessionID, "debug", task) + task = session.PrependHistory(s.cfg.SessionsDir, a.SessionID, "debug", task) if s.cfg.ExecutorFn == nil { return nil, fmt.Errorf("no executor configured") } + t0 := time.Now() result, err := s.cfg.ExecutorFn(ctx, iexec.Request{ SkillPrompt: s.cfg.SkillPrompt, TaskPrompt: task, @@ -57,24 +59,25 @@ func (s *Skill) Handle(ctx context.Context, tool string, args json.RawMessage) ( if err != nil { return nil, err } + + if a.SessionID != "" && s.cfg.SessionsDir != "" { + _ = session.Append(s.cfg.SessionsDir, a.SessionID, session.Entry{ + SessionID: a.SessionID, + Timestamp: time.Now(), + Skill: "debug", + Phase: "debug", + ProjectRoot: a.ProjectRoot, + Attempts: session.AttemptsFrom(result.Attempts), + FinalStatus: result.Status, + ModelUsed: result.ModelUsed, + DurationMs: time.Since(t0).Milliseconds(), + Message: result.Message, + }) + } + b, err := json.Marshal(result) if err != nil { return nil, fmt.Errorf("marshal result: %w", err) } return b, nil } - -func (s *Skill) prependHistory(sessionID, currentPhase, task string) string { - if sessionID == "" || s.cfg.SessionsDir == "" { - return task - } - entries, err := session.Read(s.cfg.SessionsDir, sessionID) - if err != nil || len(entries) == 0 { - return task - } - history := session.FormatHistory(entries, currentPhase) - if history == "" { - return task - } - return history + "\n---\n\n" + task -} diff --git a/internal/skills/review/handlers.go b/internal/skills/review/handlers.go index b5da04f..e2bf9a1 100644 --- a/internal/skills/review/handlers.go +++ b/internal/skills/review/handlers.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "strings" + "time" iexec "github.com/mathiasbq/supervisor/internal/exec" "github.com/mathiasbq/supervisor/internal/session" @@ -44,11 +45,12 @@ func (s *Skill) Handle(ctx context.Context, tool string, args json.RawMessage) ( "phase: review\nproject_root: %s\nfiles: %s\ncontext: %s\nmodel: %s", a.ProjectRoot, strings.Join(a.Files, ", "), a.Context, model, ) - task = s.prependHistory(a.SessionID, "review", task) + task = session.PrependHistory(s.cfg.SessionsDir, a.SessionID, "review", task) if s.cfg.ExecutorFn == nil { return nil, fmt.Errorf("no executor configured") } + t0 := time.Now() result, err := s.cfg.ExecutorFn(ctx, iexec.Request{ SkillPrompt: s.cfg.SkillPrompt, TaskPrompt: task, @@ -58,24 +60,26 @@ func (s *Skill) Handle(ctx context.Context, tool string, args json.RawMessage) ( if err != nil { return nil, err } + + if a.SessionID != "" && s.cfg.SessionsDir != "" { + _ = session.Append(s.cfg.SessionsDir, a.SessionID, session.Entry{ + SessionID: a.SessionID, + Timestamp: time.Now(), + Skill: "review", + Phase: "review", + ProjectRoot: a.ProjectRoot, + Attempts: session.AttemptsFrom(result.Attempts), + FinalStatus: result.Status, + FilePath: result.FilePath, + ModelUsed: result.ModelUsed, + DurationMs: time.Since(t0).Milliseconds(), + Message: result.Message, + }) + } + b, err := json.Marshal(result) if err != nil { return nil, fmt.Errorf("marshal result: %w", err) } return b, nil } - -func (s *Skill) prependHistory(sessionID, currentPhase, task string) string { - if sessionID == "" || s.cfg.SessionsDir == "" { - return task - } - entries, err := session.Read(s.cfg.SessionsDir, sessionID) - if err != nil || len(entries) == 0 { - return task - } - history := session.FormatHistory(entries, currentPhase) - if history == "" { - return task - } - return history + "\n---\n\n" + task -}