Просмотр исходного кода

refactor(httpapi): scope async prompt fiber (#25213)

Kit Langton 4 месяцев назад
Родитель
Сommit
5ba68a28c0
1 измененных файлов с 12 добавлено и 18 удалено
  1. 12 18
      packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts

+ 12 - 18
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 { MessageID, PartID, SessionID } from "@/session/schema"
 import { NotFoundError } from "@/storage/storage"
 import { NotFoundError } from "@/storage/storage"
 import { NamedError } from "@opencode-ai/core/util/error"
 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 * as Stream from "effect/Stream"
 import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
 import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
 import { HttpApiBuilder, HttpApiError, HttpApiSchema } from "effect/unstable/httpapi"
 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 todoSvc = yield* Todo.Service
     const summary = yield* SessionSummary.Service
     const summary = yield* SessionSummary.Service
     const bus = yield* Bus.Service
     const bus = yield* Bus.Service
+    const scope = yield* Scope.Scope
 
 
     const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
     const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
       const instance = yield* InstanceState.context
       const instance = yield* InstanceState.context
@@ -281,24 +282,17 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
       params: { sessionID: SessionID }
       params: { sessionID: SessionID }
       payload: typeof PromptPayload.Type
       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()
       return HttpApiSchema.NoContent.make()
     })
     })