@@ -19,6 +19,7 @@ import { SessionSummary } from "@/session/summary"
1919import { Todo } from "@/session/todo"
2020import { MessageID , PartID , SessionID } from "@/session/schema"
2121import { Snapshot } from "@/snapshot"
22+ import { NotFoundError } from "@/storage/storage"
2223import * as Log from "@opencode-ai/core/util/log"
2324import { NamedError } from "@opencode-ai/core/util/error"
2425import { Effect , Schema , SchemaGetter , Struct } from "effect"
@@ -96,6 +97,14 @@ const PermissionResponsePayload = Schema.Struct({
9697 response : Permission . Reply ,
9798} ) . annotate ( { identifier : "SessionPermissionResponseInput" } )
9899
100+ const mapNotFound = < A , E , R > ( self : Effect . Effect < A , E , R > ) =>
101+ self . pipe (
102+ Effect . catchIf ( NotFoundError . isInstance , ( ) => Effect . fail ( new HttpApiError . NotFound ( { } ) ) ) ,
103+ Effect . catchDefect ( ( error ) =>
104+ NotFoundError . isInstance ( error ) ? Effect . fail ( new HttpApiError . NotFound ( { } ) ) : Effect . die ( error ) ,
105+ ) ,
106+ )
107+
99108export const SessionPaths = {
100109 list : root ,
101110 status : `${ root } /status` ,
@@ -151,6 +160,7 @@ export const SessionApi = HttpApi.make("session")
151160 HttpApiEndpoint . get ( "get" , SessionPaths . get , {
152161 params : { sessionID : SessionID } ,
153162 success : Session . Info ,
163+ error : HttpApiError . NotFound ,
154164 } ) . annotateMerge (
155165 OpenApi . annotations ( {
156166 identifier : "session.get" ,
@@ -193,7 +203,7 @@ export const SessionApi = HttpApi.make("session")
193203 params : { sessionID : SessionID } ,
194204 query : MessagesQuery ,
195205 success : Schema . Array ( MessageV2 . WithParts ) ,
196- error : HttpApiError . BadRequest ,
206+ error : [ HttpApiError . BadRequest , HttpApiError . NotFound ] ,
197207 } ) . annotateMerge (
198208 OpenApi . annotations ( {
199209 identifier : "session.messages" ,
@@ -204,6 +214,7 @@ export const SessionApi = HttpApi.make("session")
204214 HttpApiEndpoint . get ( "message" , SessionPaths . message , {
205215 params : { sessionID : SessionID , messageID : MessageID } ,
206216 success : MessageV2 . WithParts ,
217+ error : HttpApiError . NotFound ,
207218 } ) . annotateMerge (
208219 OpenApi . annotations ( {
209220 identifier : "session.message" ,
@@ -462,7 +473,7 @@ export const sessionHandlers = HttpApiBuilder.group(SessionApi, "session", (hand
462473 } )
463474
464475 const get = Effect . fn ( "SessionHttpApi.get" ) ( function * ( ctx : { params : { sessionID : SessionID } } ) {
465- return yield * session . get ( ctx . params . sessionID )
476+ return yield * mapNotFound ( session . get ( ctx . params . sessionID ) )
466477 } )
467478
468479 const children = Effect . fn ( "SessionHttpApi.children" ) ( function * ( ctx : { params : { sessionID : SessionID } } ) {
@@ -484,44 +495,47 @@ export const sessionHandlers = HttpApiBuilder.group(SessionApi, "session", (hand
484495 params : { sessionID : SessionID }
485496 query : typeof MessagesQuery . Type
486497 } ) {
487- if ( ctx . query . before && ctx . query . limit === undefined ) return yield * new HttpApiError . BadRequest ( { } )
488- if ( ctx . query . before ) {
489- const before = ctx . query . before
490- yield * Effect . try ( {
491- try : ( ) => MessageV2 . cursor . decode ( before ) ,
492- catch : ( ) => new HttpApiError . BadRequest ( { } ) ,
493- } )
494- }
495- if ( ctx . query . limit === undefined || ctx . query . limit === 0 ) {
496- yield * session . get ( ctx . params . sessionID )
497- return yield * session . messages ( { sessionID : ctx . params . sessionID } )
498- }
498+ return yield * mapNotFound ( Effect . gen ( function * ( ) {
499+ if ( ctx . query . before && ctx . query . limit === undefined ) return yield * new HttpApiError . BadRequest ( { } )
500+ if ( ctx . query . before ) {
501+ const before = ctx . query . before
502+ yield * Effect . try ( {
503+ try : ( ) => MessageV2 . cursor . decode ( before ) ,
504+ catch : ( ) => new HttpApiError . BadRequest ( { } ) ,
505+ } )
506+ }
507+ if ( ctx . query . limit === undefined || ctx . query . limit === 0 ) {
508+ yield * session . get ( ctx . params . sessionID )
509+ return yield * session . messages ( { sessionID : ctx . params . sessionID } )
510+ }
499511
500- const page = MessageV2 . page ( {
501- sessionID : ctx . params . sessionID ,
502- limit : ctx . query . limit ,
503- before : ctx . query . before ,
504- } )
505- if ( ! page . cursor ) return page . items
506-
507- const request = yield * HttpServerRequest . HttpServerRequest
508- const url = new URL ( request . url , "http://localhost" )
509- url . searchParams . set ( "limit" , ctx . query . limit . toString ( ) )
510- url . searchParams . set ( "before" , page . cursor )
511- return HttpServerResponse . jsonUnsafe ( page . items , {
512- headers : {
513- "Access-Control-Expose-Headers" : "Link, X-Next-Cursor" ,
514- Link : `<${ url . toString ( ) } >; rel="next"` ,
515- "X-Next-Cursor" : page . cursor ,
516- } ,
517- } )
512+ yield * session . get ( ctx . params . sessionID )
513+ const page = MessageV2 . page ( {
514+ sessionID : ctx . params . sessionID ,
515+ limit : ctx . query . limit ,
516+ before : ctx . query . before ,
517+ } )
518+ if ( ! page . cursor ) return page . items
519+
520+ const request = yield * HttpServerRequest . HttpServerRequest
521+ const url = new URL ( request . url , "http://localhost" )
522+ url . searchParams . set ( "limit" , ctx . query . limit . toString ( ) )
523+ url . searchParams . set ( "before" , page . cursor )
524+ return HttpServerResponse . jsonUnsafe ( page . items , {
525+ headers : {
526+ "Access-Control-Expose-Headers" : "Link, X-Next-Cursor" ,
527+ Link : `<${ url . toString ( ) } >; rel="next"` ,
528+ "X-Next-Cursor" : page . cursor ,
529+ } ,
530+ } )
531+ } ) )
518532 } )
519533
520534 const message = Effect . fn ( "SessionHttpApi.message" ) ( function * ( ctx : {
521535 params : { sessionID : SessionID ; messageID : MessageID }
522536 } ) {
523- return yield * Effect . sync ( ( ) =>
524- MessageV2 . get ( { sessionID : ctx . params . sessionID , messageID : ctx . params . messageID } ) ,
537+ return yield * mapNotFound (
538+ Effect . sync ( ( ) => MessageV2 . get ( { sessionID : ctx . params . sessionID , messageID : ctx . params . messageID } ) ) ,
525539 )
526540 } )
527541
0 commit comments