okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
6cd888d
main
1package app 2 3import ( 4"context" 5"slices" 6 7"albedo/cli/internal/daemon" 8) 9 10// historyPageRows is how many transcript rows Read asks for at a time. 11const historyPageRows = 200 12 13// SessionTurns is the newest turns of a session's committed transcript. 14type SessionTurns struct { 15Session string `json:"session"` 16Events []daemon.StreamEvent `json:"events"` 17Running bool `json:"running"` 18} 19 20// Read answers the newest turns of a session, reading older transcript pages 21// until it has that many. A turn that is still running is not committed yet, 22// so Running says whether more is on its way. 23func (s * Service )Read (ctx context.Context ,id string ,turns int ) (SessionTurns ,error ) { 24conn ,err := s .Connect (ctx ) 25if err != nil { 26return SessionTurns {},err 27 } 28id ,err = resolveSession (ctx ,conn ,id ) 29if err != nil { 30return SessionTurns {},err 31 } 32client := daemon .NewChatClient (conn ,id ) 33status ,err := client .GetStatus (ctx ) 34if err != nil { 35return SessionTurns {},err 36 } 37var pages [][]daemon.StreamEvent 38eventCount ,turnCount := 0 ,0 39var before int64 40for { 41page ,err := client .History (ctx ,before ,historyPageRows ) 42if err != nil { 43return SessionTurns {},err 44 } 45pages = append (pages ,page .Events ) 46eventCount += len (page .Events ) 47turnCount += turnStarts (page .Events ) 48if ! page .More || turnCount >= turns { 49break 50 } 51before = page .Before 52 } 53events := make ([]daemon.StreamEvent ,0 ,eventCount ) 54for _ ,page := range slices .Backward (pages ) { 55events = append (events ,page ... ) 56 } 57return SessionTurns {Session :id ,Running :status .Running ,Events :lastTurns (events ,turns )},nil 58} 59 60func turnStarts (events []daemon.StreamEvent )int { 61count := 0 62for _ ,event := range events { 63if event .Type == daemon .EventUser { 64count ++ 65 } 66 } 67return count 68} 69 70// lastTurns keeps the events from the start of the turns-th newest turn on. 71func lastTurns (events []daemon.StreamEvent ,turns int ) []daemon.StreamEvent { 72for i ,event := range slices .Backward (events ) { 73if event .Type != daemon .EventUser { 74continue 75 } 76if turns -- ;turns == 0 { 77return events [i :] 78 } 79 } 80return events 81}