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