session.go

  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}