session.go 3.4 KB

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