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

fix(core): move instance middleware after control plane routes (#23150)

James Long 3 дней назад
Родитель
Сommit
5621373bc2

+ 4 - 2
packages/opencode/src/server/routes/instance/index.ts

@@ -15,6 +15,7 @@ import { Command } from "@/command"
 import { QuestionRoutes } from "./question"
 import { PermissionRoutes } from "./permission"
 import { Flag } from "@/flag/flag"
+import { WorkspaceID } from "@/control-plane/schema"
 import { ExperimentalHttpApiServer } from "./httpapi/server"
 import { ProjectRoutes } from "./project"
 import { SessionRoutes } from "./session"
@@ -27,9 +28,10 @@ import { ProviderRoutes } from "./provider"
 import { EventRoutes } from "./event"
 import { SyncRoutes } from "./sync"
 import { AppRuntime } from "@/effect/app-runtime"
+import { InstanceMiddleware } from "./middleware"
 
-export const InstanceRoutes = (upgrade: UpgradeWebSocket): Hono => {
-  const app = new Hono()
+export const InstanceRoutes = (upgrade: UpgradeWebSocket, workspaceID?: WorkspaceID): Hono => {
+  const app = new Hono().use(InstanceMiddleware(workspaceID))
 
   if (Flag.OPENCODE_EXPERIMENTAL_HTTPAPI) {
     const handler = ExperimentalHttpApiServer.webHandler().handler

+ 35 - 0
packages/opencode/src/server/routes/instance/middleware.ts

@@ -0,0 +1,35 @@
+import type { MiddlewareHandler } from "hono"
+import { Instance } from "@/project/instance"
+import { InstanceBootstrap } from "@/project/bootstrap"
+import { AppRuntime } from "@/effect/app-runtime"
+import { AppFileSystem } from "@opencode-ai/shared/filesystem"
+import { WorkspaceContext } from "@/control-plane/workspace-context"
+import { WorkspaceID } from "@/control-plane/schema"
+
+export function InstanceMiddleware(workspaceID?: WorkspaceID): MiddlewareHandler {
+  return async (c, next) => {
+    const raw = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd()
+    const directory = AppFileSystem.resolve(
+      (() => {
+        try {
+          return decodeURIComponent(raw)
+        } catch {
+          return raw
+        }
+      })(),
+    )
+
+    return WorkspaceContext.provide({
+      workspaceID,
+      async fn() {
+        return Instance.provide({
+          directory,
+          init: () => AppRuntime.runPromise(InstanceBootstrap),
+          async fn() {
+            return next()
+          },
+        })
+      },
+    })
+  }
+}

+ 7 - 37
packages/opencode/src/server/server.ts

@@ -1,16 +1,10 @@
 import { generateSpecs } from "hono-openapi"
 import { Hono } from "hono"
-import type { MiddlewareHandler } from "hono"
 import { adapter } from "#hono"
 import { lazy } from "@/util/lazy"
 import { Log } from "@/util"
 import { Flag } from "@/flag/flag"
-import { Instance } from "@/project/instance"
-import { InstanceBootstrap } from "@/project/bootstrap"
-import { AppRuntime } from "@/effect/app-runtime"
-import { AppFileSystem } from "@opencode-ai/shared/filesystem"
 import { WorkspaceID } from "@/control-plane/schema"
-import { WorkspaceContext } from "@/control-plane/workspace-context"
 import { MDNS } from "./mdns"
 import { AuthMiddleware, CompressionMiddleware, CorsMiddleware, ErrorMiddleware, LoggerMiddleware } from "./middleware"
 import { FenceMiddleware } from "./fence"
@@ -48,47 +42,23 @@ function create(opts: { cors?: string[] }) {
 
   const runtime = adapter.create(app)
 
-  function InstanceMiddleware(workspaceID?: WorkspaceID): MiddlewareHandler {
-    return async (c, next) => {
-      const raw = c.req.query("directory") || c.req.header("x-opencode-directory") || process.cwd()
-      const directory = AppFileSystem.resolve(
-        (() => {
-          try {
-            return decodeURIComponent(raw)
-          } catch {
-            return raw
-          }
-        })(),
-      )
-
-      return WorkspaceContext.provide({
-        workspaceID,
-        async fn() {
-          return Instance.provide({
-            directory,
-            init: () => AppRuntime.runPromise(InstanceBootstrap),
-            async fn() {
-              return next()
-            },
-          })
-        },
-      })
-    }
-  }
-
   if (Flag.OPENCODE_WORKSPACE_ID) {
     return {
       app: app
-        .use(InstanceMiddleware(Flag.OPENCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined))
         .use(FenceMiddleware)
-        .route("/", InstanceRoutes(runtime.upgradeWebSocket)),
+        .route(
+          "/",
+          InstanceRoutes(
+            runtime.upgradeWebSocket,
+            Flag.OPENCODE_WORKSPACE_ID ? WorkspaceID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined,
+          ),
+        ),
       runtime,
     }
   }
 
   return {
     app: app
-      .use(InstanceMiddleware())
       .route("/", ControlPlaneRoutes())
       .use(WorkspaceRouterMiddleware(runtime.upgradeWebSocket))
       .route("/", InstanceRoutes(runtime.upgradeWebSocket))