session.go

  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}