1package backend
2
3import (
4 "context"
5
6 "github.com/charmbracelet/crush/internal/message"
7 "github.com/charmbracelet/crush/internal/proto"
8 "github.com/charmbracelet/crush/internal/session"
9)
10
11// CreateSession creates a new session in the given workspace.
12func (b *Backend) CreateSession(ctx context.Context, workspaceID, title string) (session.Session, error) {
13 ws, err := b.GetWorkspace(workspaceID)
14 if err != nil {
15 return session.Session{}, err
16 }
17
18 return ws.Sessions.Create(ctx, title)
19}
20
21// GetSession retrieves a session by workspace and session ID.
22func (b *Backend) GetSession(ctx context.Context, workspaceID, sessionID string) (session.Session, error) {
23 ws, err := b.GetWorkspace(workspaceID)
24 if err != nil {
25 return session.Session{}, err
26 }
27
28 return ws.Sessions.Get(ctx, sessionID)
29}
30
31// ListSessions returns all sessions in the given workspace.
32func (b *Backend) ListSessions(ctx context.Context, workspaceID string) ([]session.Session, error) {
33 ws, err := b.GetWorkspace(workspaceID)
34 if err != nil {
35 return nil, err
36 }
37
38 return ws.Sessions.List(ctx)
39}
40
41// GetAgentSession returns session metadata with the agent's busy
42// status.
43func (b *Backend) GetAgentSession(ctx context.Context, workspaceID, sessionID string) (proto.AgentSession, error) {
44 ws, err := b.GetWorkspace(workspaceID)
45 if err != nil {
46 return proto.AgentSession{}, err
47 }
48
49 se, err := ws.Sessions.Get(ctx, sessionID)
50 if err != nil {
51 return proto.AgentSession{}, err
52 }
53
54 var isSessionBusy bool
55 if ws.AgentCoordinator != nil {
56 isSessionBusy = ws.AgentCoordinator.IsSessionBusy(sessionID)
57 }
58
59 return proto.AgentSession{
60 Session: proto.Session{
61 ID: se.ID,
62 Title: se.Title,
63 },
64 IsBusy: isSessionBusy,
65 }, nil
66}
67
68// ListSessionMessages returns all messages for a session.
69func (b *Backend) ListSessionMessages(ctx context.Context, workspaceID, sessionID string) ([]message.Message, error) {
70 ws, err := b.GetWorkspace(workspaceID)
71 if err != nil {
72 return nil, err
73 }
74
75 return ws.Messages.List(ctx, sessionID)
76}
77
78// ListSessionHistory returns the history items for a session.
79func (b *Backend) ListSessionHistory(ctx context.Context, workspaceID, sessionID string) (any, error) {
80 ws, err := b.GetWorkspace(workspaceID)
81 if err != nil {
82 return nil, err
83 }
84
85 return ws.History.ListBySession(ctx, sessionID)
86}
87
88// SaveSession updates a session in the given workspace.
89func (b *Backend) SaveSession(ctx context.Context, workspaceID string, sess session.Session) (session.Session, error) {
90 ws, err := b.GetWorkspace(workspaceID)
91 if err != nil {
92 return session.Session{}, err
93 }
94
95 return ws.Sessions.Save(ctx, sess)
96}
97
98// DeleteSession deletes a session from the given workspace.
99func (b *Backend) DeleteSession(ctx context.Context, workspaceID, sessionID string) error {
100 ws, err := b.GetWorkspace(workspaceID)
101 if err != nil {
102 return err
103 }
104
105 return ws.Sessions.Delete(ctx, sessionID)
106}
107
108// ListUserMessages returns user-role messages for a session.
109func (b *Backend) ListUserMessages(ctx context.Context, workspaceID, sessionID string) ([]message.Message, error) {
110 ws, err := b.GetWorkspace(workspaceID)
111 if err != nil {
112 return nil, err
113 }
114
115 return ws.Messages.ListUserMessages(ctx, sessionID)
116}
117
118// ListAllUserMessages returns all user-role messages across sessions.
119func (b *Backend) ListAllUserMessages(ctx context.Context, workspaceID string) ([]message.Message, error) {
120 ws, err := b.GetWorkspace(workspaceID)
121 if err != nil {
122 return nil, err
123 }
124
125 return ws.Messages.ListAllUserMessages(ctx)
126}