session.go

 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}