| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- package session
- import (
- "context"
- "database/sql"
- "github.com/charmbracelet/crush/internal/db"
- "github.com/charmbracelet/crush/internal/pubsub"
- "github.com/google/uuid"
- )
- type Session struct {
- ID string
- ParentSessionID string
- Title string
- MessageCount int64
- PromptTokens int64
- CompletionTokens int64
- SummaryMessageID string
- Cost float64
- CreatedAt int64
- UpdatedAt int64
- }
- type Service interface {
- pubsub.Suscriber[Session]
- Create(ctx context.Context, title string) (Session, error)
- CreateTitleSession(ctx context.Context, parentSessionID string) (Session, error)
- CreateTaskSession(ctx context.Context, toolCallID, parentSessionID, title string) (Session, error)
- Get(ctx context.Context, id string) (Session, error)
- List(ctx context.Context) ([]Session, error)
- Save(ctx context.Context, session Session) (Session, error)
- Delete(ctx context.Context, id string) error
- }
- type service struct {
- *pubsub.Broker[Session]
- q db.Querier
- }
- func (s *service) Create(ctx context.Context, title string) (Session, error) {
- dbSession, err := s.q.CreateSession(ctx, db.CreateSessionParams{
- ID: uuid.New().String(),
- Title: title,
- })
- if err != nil {
- return Session{}, err
- }
- session := s.fromDBItem(dbSession)
- s.Publish(pubsub.CreatedEvent, session)
- return session, nil
- }
- func (s *service) CreateTaskSession(ctx context.Context, toolCallID, parentSessionID, title string) (Session, error) {
- dbSession, err := s.q.CreateSession(ctx, db.CreateSessionParams{
- ID: toolCallID,
- ParentSessionID: sql.NullString{String: parentSessionID, Valid: true},
- Title: title,
- })
- if err != nil {
- return Session{}, err
- }
- session := s.fromDBItem(dbSession)
- s.Publish(pubsub.CreatedEvent, session)
- return session, nil
- }
- func (s *service) CreateTitleSession(ctx context.Context, parentSessionID string) (Session, error) {
- dbSession, err := s.q.CreateSession(ctx, db.CreateSessionParams{
- ID: "title-" + parentSessionID,
- ParentSessionID: sql.NullString{String: parentSessionID, Valid: true},
- Title: "Generate a title",
- })
- if err != nil {
- return Session{}, err
- }
- session := s.fromDBItem(dbSession)
- s.Publish(pubsub.CreatedEvent, session)
- return session, nil
- }
- func (s *service) Delete(ctx context.Context, id string) error {
- session, err := s.Get(ctx, id)
- if err != nil {
- return err
- }
- err = s.q.DeleteSession(ctx, session.ID)
- if err != nil {
- return err
- }
- s.Publish(pubsub.DeletedEvent, session)
- return nil
- }
- func (s *service) Get(ctx context.Context, id string) (Session, error) {
- dbSession, err := s.q.GetSessionByID(ctx, id)
- if err != nil {
- return Session{}, err
- }
- return s.fromDBItem(dbSession), nil
- }
- func (s *service) Save(ctx context.Context, session Session) (Session, error) {
- dbSession, err := s.q.UpdateSession(ctx, db.UpdateSessionParams{
- ID: session.ID,
- Title: session.Title,
- PromptTokens: session.PromptTokens,
- CompletionTokens: session.CompletionTokens,
- SummaryMessageID: sql.NullString{
- String: session.SummaryMessageID,
- Valid: session.SummaryMessageID != "",
- },
- Cost: session.Cost,
- })
- if err != nil {
- return Session{}, err
- }
- session = s.fromDBItem(dbSession)
- s.Publish(pubsub.UpdatedEvent, session)
- return session, nil
- }
- func (s *service) List(ctx context.Context) ([]Session, error) {
- dbSessions, err := s.q.ListSessions(ctx)
- if err != nil {
- return nil, err
- }
- sessions := make([]Session, len(dbSessions))
- for i, dbSession := range dbSessions {
- sessions[i] = s.fromDBItem(dbSession)
- }
- return sessions, nil
- }
- func (s service) fromDBItem(item db.Session) Session {
- return Session{
- ID: item.ID,
- ParentSessionID: item.ParentSessionID.String,
- Title: item.Title,
- MessageCount: item.MessageCount,
- PromptTokens: item.PromptTokens,
- CompletionTokens: item.CompletionTokens,
- SummaryMessageID: item.SummaryMessageID.String,
- Cost: item.Cost,
- CreatedAt: item.CreatedAt,
- UpdatedAt: item.UpdatedAt,
- }
- }
- func NewService(q db.Querier) Service {
- broker := pubsub.NewBroker[Session]()
- return &service{
- broker,
- q,
- }
- }
|