1package backend
2
3import (
4 "context"
5
6 "github.com/charmbracelet/crush/internal/proto"
7 "github.com/charmbracelet/crush/internal/session"
8)
9
10// CreateSession creates a new session in the given workspace.
11func (b *Backend) CreateSession(ctx context.Context, workspaceID, title string) (session.Session, error) {
12 ws, err := b.GetWorkspace(workspaceID)
13 if err != nil {
14 return session.Session{}, err
15 }
16
17 return ws.Sessions.Create(ctx, title)
18}
19
20// GetSession retrieves a session by workspace and session ID.
21func (b *Backend) GetSession(ctx context.Context, workspaceID, sessionID string) (session.Session, error) {
22 ws, err := b.GetWorkspace(workspaceID)
23 if err != nil {
24 return session.Session{}, err
25 }
26
27 return ws.Sessions.Get(ctx, sessionID)
28}
29
30// ListSessions returns all sessions in the given workspace.
31func (b *Backend) ListSessions(ctx context.Context, workspaceID string) ([]session.Session, error) {
32 ws, err := b.GetWorkspace(workspaceID)
33 if err != nil {
34 return nil, err
35 }
36
37 return ws.Sessions.List(ctx)
38}
39
40// GetAgentSession returns session metadata with the agent's busy
41// status.
42func (b *Backend) GetAgentSession(ctx context.Context, workspaceID, sessionID string) (proto.AgentSession, error) {
43 ws, err := b.GetWorkspace(workspaceID)
44 if err != nil {
45 return proto.AgentSession{}, err
46 }
47
48 se, err := ws.Sessions.Get(ctx, sessionID)
49 if err != nil {
50 return proto.AgentSession{}, err
51 }
52
53 var isSessionBusy bool
54 if ws.AgentCoordinator != nil {
55 isSessionBusy = ws.AgentCoordinator.IsSessionBusy(sessionID)
56 }
57
58 return proto.AgentSession{
59 Session: proto.Session{
60 ID: se.ID,
61 Title: se.Title,
62 },
63 IsBusy: isSessionBusy,
64 }, nil
65}
66
67// ListSessionMessages returns all messages for a session.
68func (b *Backend) ListSessionMessages(ctx context.Context, workspaceID, sessionID string) (any, error) {
69 ws, err := b.GetWorkspace(workspaceID)
70 if err != nil {
71 return nil, err
72 }
73
74 return ws.Messages.List(ctx, sessionID)
75}
76
77// ListSessionHistory returns the history items for a session.
78func (b *Backend) ListSessionHistory(ctx context.Context, workspaceID, sessionID string) (any, error) {
79 ws, err := b.GetWorkspace(workspaceID)
80 if err != nil {
81 return nil, err
82 }
83
84 return ws.History.ListBySession(ctx, sessionID)
85}