Skip to content

Commit 5ba68a2

Browse files
authored
refactor(httpapi): scope async prompt fiber (#25213)
1 parent bce4def commit 5ba68a2

1 file changed

Lines changed: 12 additions & 18 deletions

File tree

  • packages/opencode/src/server/routes/instance/httpapi/handlers

packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { Todo } from "@/session/todo"
1919
import { MessageID, PartID, SessionID } from "@/session/schema"
2020
import { NotFoundError } from "@/storage/storage"
2121
import { NamedError } from "@opencode-ai/core/util/error"
22-
import { Cause, Effect, Schema } from "effect"
22+
import { Cause, Effect, Schema, Scope } from "effect"
2323
import * as Stream from "effect/Stream"
2424
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
2525
import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi"
@@ -61,6 +61,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
6161
const todoSvc = yield* Todo.Service
6262
const summary = yield* SessionSummary.Service
6363
const bus = yield* Bus.Service
64+
const scope = yield* Scope.Scope
6465

6566
const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
6667
const instance = yield* InstanceState.context
@@ -281,24 +282,17 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
281282
params: { sessionID: SessionID }
282283
payload: typeof PromptPayload.Type
283284
}) {
284-
const instance = yield* InstanceState.context
285-
const workspace = yield* InstanceState.workspaceID
286-
yield* Effect.sync(() =>
287-
Effect.runFork(
288-
promptSvc.prompt({ ...ctx.payload, sessionID: ctx.params.sessionID }).pipe(
289-
Effect.provideService(InstanceRef, instance),
290-
Effect.provideService(WorkspaceRef, workspace),
291-
Effect.catchCause((cause) =>
292-
Effect.gen(function* () {
293-
yield* Effect.logError("prompt_async failed", { sessionID: ctx.params.sessionID, cause })
294-
yield* bus.publish(Session.Event.Error, {
295-
sessionID: ctx.params.sessionID,
296-
error: new NamedError.Unknown({ message: Cause.pretty(cause) }).toObject(),
297-
})
298-
}),
299-
),
300-
),
285+
yield* promptSvc.prompt({ ...ctx.payload, sessionID: ctx.params.sessionID }).pipe(
286+
Effect.catchCause((cause) =>
287+
Effect.gen(function* () {
288+
yield* Effect.logError("prompt_async failed", { sessionID: ctx.params.sessionID, cause })
289+
yield* bus.publish(Session.Event.Error, {
290+
sessionID: ctx.params.sessionID,
291+
error: new NamedError.Unknown({ message: Cause.pretty(cause) }).toObject(),
292+
})
293+
}),
301294
),
295+
Effect.forkIn(scope, { startImmediately: true }),
302296
)
303297
return HttpApiSchema.NoContent.make()
304298
})

0 commit comments

Comments
 (0)