okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
7e45521
main
1package daemon 2 3import ( 4"context" 5"io" 6"net/http" 7 8"albedo/cli/internal/daemon/protocol" 9) 10 11type TreeCheckpoint struct { 12Timestamp * int64 13Type ,Preview ,ID string 14Position int 15} 16type TreePage struct { 17NextCursor * int 18Items []TreeCheckpoint 19HasMore bool 20} 21 22func GetSessionTree (ctx context.Context ,conn * Connection ,id string ,after ,limit int ) (TreePage ,error ) { 23params := protocol.GetHistoryParams {View :new ("checkpoints "),Limit :new (int64 (min (max (limit ,1 ),200 )))} 24if after > 0 { 25params .After = new (int64 (after )) 26 } 27var result TreePage 28err := executeRead (ctx ,conn ,operation {Name :"read checkpoints" ,BuildRequest :func (base string ,body io.Reader ) (* http.Request ,error ) { 29return protocol .NewGetHistoryRequest (base ,id ,& params ) 30 },Policy :readRecovery },func (data []byte )error { 31var w protocol.CheckpointPage 32if err := decodeRequired (data ,& w );err != nil { 33return err 34 } 35result .Items = []TreeCheckpoint {} 36previous := after 37for _ ,row := range w .Items { 38if row .CheckpointID == "" || row .Position <= int64 (previous ) { 39return fieldError ("checkpoint" ) 40 } 41previous = int (row .Position ) 42result .Items = append (result .Items ,TreeCheckpoint {ID :row .CheckpointID ,Position :int (row .Position ),Type :row .TurnType ,Preview :row .Preview .Text }) 43 } 44result .HasMore = w .Newer != nil 45if result .HasMore { 46if len (w .Items )== 0 { 47return fieldError ("checkpoint page" ) 48 } 49result .NextCursor = & previous 50 } 51return nil 52 }) 53return result ,err 54}