mirror of
https://github.com/sst/opencode.git
synced 2025-08-03 21:28:14 +00:00
135 lines
3.4 KiB
Go
135 lines
3.4 KiB
Go
package session
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/kujtimiihoxha/termai/internal/db"
|
|
"github.com/kujtimiihoxha/termai/internal/pubsub"
|
|
)
|
|
|
|
type Session struct {
|
|
ID string
|
|
ParentSessionID string
|
|
Title string
|
|
MessageCount int64
|
|
PromptTokens int64
|
|
CompletionTokens int64
|
|
Cost float64
|
|
CreatedAt int64
|
|
UpdatedAt int64
|
|
}
|
|
|
|
type Service interface {
|
|
pubsub.Suscriber[Session]
|
|
Create(ctx context.Context, title 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) 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,
|
|
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,
|
|
Cost: item.Cost,
|
|
CreatedAt: item.CreatedAt,
|
|
UpdatedAt: item.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func NewService(q db.Querier) Service {
|
|
broker := pubsub.NewBroker[Session]()
|
|
return &service{
|
|
broker,
|
|
q,
|
|
}
|
|
}
|