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({