summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-30 22:33:02 -0400
committerGitHub <[email protected]>2026-04-30 22:33:02 -0400
commit5ba68a28c02a95e8359deefa9ee2806f84169e40 (patch)
tree9bc24dbdf33d41b03bea086e015154d321656182
parentbce4def2db91e296749bac94fbd171e23d193a5c (diff)
downloadopencode-5ba68a28c02a95e8359deefa9ee2806f84169e40.tar.gz
opencode-5ba68a28c02a95e8359deefa9ee2806f84169e40.zip
refactor(httpapi): scope async prompt fiber (#25213)
-rw-r--r--packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts30
1 files changed, 12 insertions, 18 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 384550d1c..cd8b5e11c 100644
--- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts
+++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts
@@ -19,7 +19,7 @@ import { Todo } from "@/session/todo"
import { MessageID, PartID, SessionID } from "@/session/schema"
import { NotFoundError } from "@/storage/storage"
import { NamedError } from "@opencode-ai/core/util/error"
-import { Cause, Effect, Schema } from "effect"
+import { Cause, Effect, Schema, Scope } from "effect"
import * as Stream from "effect/Stream"
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi"
@@ -61,6 +61,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
const todoSvc = yield* Todo.Service
const summary = yield* SessionSummary.Service
const bus = yield* Bus.Service
+ const scope = yield* Scope.Scope
const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
const instance = yield* InstanceState.context
@@ -281,24 +282,17 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
params: { sessionID: SessionID }
payload: typeof PromptPayload.Type
}) {
- const instance = yield* InstanceState.context
- const workspace = yield* InstanceState.workspaceID
- yield* Effect.sync(() =>
- Effect.runFork(
- promptSvc.prompt({ ...ctx.payload, sessionID: ctx.params.sessionID }).pipe(
- Effect.provideService(InstanceRef, instance),
- Effect.provideService(WorkspaceRef, workspace),
- Effect.catchCause((cause) =>
- Effect.gen(function* () {
- yield* Effect.logError("prompt_async failed", { sessionID: ctx.params.sessionID, cause })
- yield* bus.publish(Session.Event.Error, {
- sessionID: ctx.params.sessionID,
- error: new NamedError.Unknown({ message: Cause.pretty(cause) }).toObject(),
- })
- }),
- ),
- ),
+ yield* promptSvc.prompt({ ...ctx.payload, sessionID: ctx.params.sessionID }).pipe(
+ Effect.catchCause((cause) =>
+ Effect.gen(function* () {
+ yield* Effect.logError("prompt_async failed", { sessionID: ctx.params.sessionID, cause })
+ yield* bus.publish(Session.Event.Error, {
+ sessionID: ctx.params.sessionID,
+ error: new NamedError.Unknown({ message: Cause.pretty(cause) }).toObject(),
+ })
+ }),
),
+ Effect.forkIn(scope, { startImmediately: true }),
)
return HttpApiSchema.NoContent.make()
})