session.go 3.9 KB

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