From 9ee1f6ceba8964c7db34fb9429533f67269ef089 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Thu, 14 May 2026 01:02:07 +0530 Subject: [PATCH] fix(server): map busy sessions in http handlers (#27375) --- .../routes/instance/httpapi/handlers/session.ts | 16 ++++++++++++---- .../routes/instance/httpapi/middleware/error.ts | 9 --------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index b12be2cfc2..df2b40de56 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -52,6 +52,14 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", const bus = yield* Bus.Service const scope = yield* Scope.Scope + const mapBusy = (effect: Effect.Effect): Effect.Effect => + effect.pipe( + Effect.catchCause((cause): Effect.Effect => { + if (Cause.squash(cause) instanceof Session.BusyError) return Effect.fail(new HttpApiError.BadRequest({})) + return Effect.failCause(cause) + }), + ) + const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) { return yield* session.list({ directory: ctx.query.scope === "project" ? undefined : ctx.query.directory, @@ -329,7 +337,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", payload: typeof ShellPayload.Type }) { yield* requireSession(ctx.params.sessionID) - return yield* promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID }) + return yield* mapBusy(promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID })) }) const revert = Effect.fn("SessionHttpApi.revert")(function* (ctx: { @@ -337,12 +345,12 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", payload: typeof RevertPayload.Type }) { yield* requireSession(ctx.params.sessionID) - return yield* revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload }) + return yield* mapBusy(revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload })) }) const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) { yield* requireSession(ctx.params.sessionID) - return yield* revertSvc.unrevert({ sessionID: ctx.params.sessionID }) + return yield* mapBusy(revertSvc.unrevert({ sessionID: ctx.params.sessionID })) }) const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: { @@ -358,7 +366,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", params: { sessionID: SessionID; messageID: MessageID } }) { yield* requireSession(ctx.params.sessionID) - yield* runState.assertNotBusy(ctx.params.sessionID) + yield* mapBusy(runState.assertNotBusy(ctx.params.sessionID)) yield* session.removeMessage(ctx.params) return true }) diff --git a/packages/opencode/src/server/routes/instance/httpapi/middleware/error.ts b/packages/opencode/src/server/routes/instance/httpapi/middleware/error.ts index bb75f6602c..5896410370 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/middleware/error.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/middleware/error.ts @@ -1,5 +1,4 @@ import { Provider } from "@/provider/provider" -import { Session } from "@/session/session" import { iife } from "@/util/iife" import { NamedError } from "@opencode-ai/core/util/error" import * as Log from "@opencode-ai/core/util/log" @@ -33,14 +32,6 @@ export const errorLayer = HttpRouter.middleware<{ handles: unknown }>()((effect) }), ) } - if (error instanceof Session.BusyError) { - return Effect.succeed( - HttpServerResponse.jsonUnsafe(new NamedError.Unknown({ message: error.message }).toObject(), { - status: 400, - }), - ) - } - return Effect.succeed( HttpServerResponse.jsonUnsafe( new NamedError.Unknown({