@@ -474,7 +474,7 @@ export interface Interface {
474474 readonly clearRevert : ( sessionID : SessionID ) => Effect . Effect < void >
475475 readonly setSummary : ( input : { sessionID : SessionID ; summary : Info [ "summary" ] } ) => Effect . Effect < void >
476476 readonly diff : ( sessionID : SessionID ) => Effect . Effect < Snapshot . FileDiff [ ] >
477- readonly messages : ( input : { sessionID : SessionID ; limit ?: number } ) => Effect . Effect < MessageV2 . WithParts [ ] >
477+ readonly messages : ( input : { sessionID : SessionID ; limit ?: number } ) => Effect . Effect < MessageV2 . WithParts [ ] , NotFound >
478478 readonly children : ( parentID : SessionID ) => Effect . Effect < Info [ ] >
479479 readonly remove : ( sessionID : SessionID ) => Effect . Effect < void , NotFound >
480480 readonly updateMessage : < T extends MessageV2 . Info > ( msg : T ) => Effect . Effect < T >
@@ -497,7 +497,7 @@ export interface Interface {
497497 readonly findMessage : (
498498 sessionID : SessionID ,
499499 predicate : ( msg : MessageV2 . WithParts ) => boolean ,
500- ) => Effect . Effect < Option . Option < MessageV2 . WithParts > >
500+ ) => Effect . Effect < Option . Option < MessageV2 . WithParts > , NotFound >
501501}
502502
503503export class Service extends Context . Service < Service , Interface > ( ) ( "@opencode/Session" ) { }
@@ -757,11 +757,25 @@ export const layer: Layer.Layer<Service, never, Bus.Service | Storage.Service |
757757 . pipe ( Effect . orElseSucceed ( ( ) : Snapshot . FileDiff [ ] => [ ] ) )
758758 } )
759759
760- const messages = Effect . fn ( "Session.messages" ) ( function * ( input : { sessionID : SessionID ; limit ?: number } ) {
760+ const messages : Interface [ "messages" ] = Effect . fn ( "Session.messages" ) ( function * ( input ) {
761761 if ( input . limit ) {
762- return MessageV2 . page ( { sessionID : input . sessionID , limit : input . limit } ) . items
762+ return ( yield * MessageV2 . pageEffect ( { sessionID : input . sessionID , limit : input . limit } ) ) . items
763763 }
764- return Array . from ( MessageV2 . stream ( input . sessionID ) ) . reverse ( )
764+
765+ const size = 50
766+ const result = [ ] as MessageV2 . WithParts [ ]
767+ let before : string | undefined
768+ while ( true ) {
769+ const page = yield * MessageV2 . pageEffect ( { sessionID : input . sessionID , limit : size , before } )
770+ if ( page . items . length === 0 ) break
771+ for ( let i = page . items . length - 1 ; i >= 0 ; i -- ) {
772+ const item = page . items [ i ]
773+ if ( item ) result . push ( item )
774+ }
775+ if ( ! page . more || ! page . cursor ) break
776+ before = page . cursor
777+ }
778+ return result . reverse ( )
765779 } )
766780
767781 const removeMessage = Effect . fn ( "Session.removeMessage" ) ( function * ( input : {
@@ -799,12 +813,18 @@ export const layer: Layer.Layer<Service, never, Bus.Service | Storage.Service |
799813 } )
800814
801815 /** Finds the first message matching the predicate, searching newest-first. */
802- const findMessage = Effect . fn ( "Session.findMessage" ) ( function * (
803- sessionID : SessionID ,
804- predicate : ( msg : MessageV2 . WithParts ) => boolean ,
805- ) {
806- for ( const item of MessageV2 . stream ( sessionID ) ) {
807- if ( predicate ( item ) ) return Option . some ( item )
816+ const findMessage : Interface [ "findMessage" ] = Effect . fn ( "Session.findMessage" ) ( function * ( sessionID , predicate ) {
817+ const size = 50
818+ let before : string | undefined
819+ while ( true ) {
820+ const page = yield * MessageV2 . pageEffect ( { sessionID, limit : size , before } )
821+ if ( page . items . length === 0 ) break
822+ for ( let i = page . items . length - 1 ; i >= 0 ; i -- ) {
823+ const item = page . items [ i ]
824+ if ( item && predicate ( item ) ) return Option . some ( item )
825+ }
826+ if ( ! page . more || ! page . cursor ) break
827+ before = page . cursor
808828 }
809829 return Option . none < MessageV2 . WithParts > ( )
810830 } )
0 commit comments