@@ -72,6 +72,11 @@ export class OperationUnavailableError extends Schema.TaggedErrorClass<Operation
7272 } ,
7373) { }
7474
75+ export class MessageDecodeError extends Schema . TaggedErrorClass < MessageDecodeError > ( ) ( "Session.MessageDecodeError" , {
76+ sessionID : SessionID ,
77+ messageID : SessionMessage . ID ,
78+ } ) { }
79+
7580export interface Interface {
7681 readonly create : ( input ?: {
7782 agent ?: string
@@ -104,8 +109,8 @@ export interface Interface {
104109 time : number
105110 direction : "previous" | "next"
106111 }
107- } ) => Effect . Effect < SessionMessage . Message [ ] , NotFoundError >
108- readonly context : ( sessionID : SessionID ) => Effect . Effect < SessionMessage . Message [ ] , NotFoundError >
112+ } ) => Effect . Effect < SessionMessage . Message [ ] , NotFoundError | MessageDecodeError >
113+ readonly context : ( sessionID : SessionID ) => Effect . Effect < SessionMessage . Message [ ] , NotFoundError | MessageDecodeError >
109114 readonly prompt : ( input : {
110115 id ?: EventV2 . ID
111116 sessionID : SessionID
@@ -120,7 +125,7 @@ export interface Interface {
120125 prompt : Prompt
121126 agent : string
122127 model ?: ModelV2 . Ref
123- } ) => Effect . Effect < void , NotFoundError | OperationUnavailableError >
128+ } ) => Effect . Effect < void , NotFoundError | OperationUnavailableError | MessageDecodeError >
124129 readonly switchAgent : ( input : { sessionID : SessionID ; agent : string } ) => Effect . Effect < void , never >
125130 readonly switchModel : ( input : { sessionID : SessionID ; model : ModelV2 . Ref } ) => Effect . Effect < void , never >
126131 readonly compact : ( sessionID : SessionID ) => Effect . Effect < void , NotFoundError | OperationUnavailableError >
@@ -133,10 +138,18 @@ export const layer = Layer.effect(
133138 Service ,
134139 Effect . gen ( function * ( ) {
135140 const events = yield * EventV2Bridge . Service
136- const decodeMessage = Schema . decodeUnknownSync ( SessionMessage . Message )
141+ const decodeMessage = Schema . decodeUnknownEffect ( SessionMessage . Message )
137142
138143 const decode = ( row : typeof SessionMessageTable . $inferSelect ) =>
139- decodeMessage ( { ...row . data , id : row . id , type : row . type } )
144+ decodeMessage ( { ...row . data , id : row . id , type : row . type } ) . pipe (
145+ Effect . mapError (
146+ ( ) =>
147+ new MessageDecodeError ( {
148+ sessionID : SessionID . make ( row . session_id ) ,
149+ messageID : SessionMessage . ID . make ( row . id ) ,
150+ } ) ,
151+ ) ,
152+ )
140153
141154 function fromRow ( row : typeof SessionTable . $inferSelect ) : Info {
142155 return new Info ( {
@@ -262,7 +275,7 @@ export const layer = Layer.effect(
262275 const rows = input . limit === undefined ? query . all ( ) : query . limit ( input . limit ) . all ( )
263276 return direction === "previous" ? rows . toReversed ( ) : rows
264277 } )
265- return rows . map ( ( row ) => decode ( row ) )
278+ return yield * Effect . forEach ( rows , ( row ) => decode ( row ) )
266279 } ) ,
267280 context : Effect . fn ( "V2Session.context" ) ( function * ( sessionID ) {
268281 yield * result . get ( sessionID )
@@ -295,7 +308,7 @@ export const layer = Layer.effect(
295308 . orderBy ( asc ( SessionMessageTable . time_created ) , asc ( SessionMessageTable . id ) )
296309 . all ( )
297310 } )
298- return rows . map ( ( row ) => decode ( row ) )
311+ return yield * Effect . forEach ( rows , ( row ) => decode ( row ) )
299312 } ) ,
300313 prompt : Effect . fn ( "V2Session.prompt" ) ( function * ( input ) {
301314 yield * result . get ( input . sessionID )
0 commit comments