From 19271fca2d2bcbd45bfc39f73c441db0ec9b94f9 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Thu, 30 Apr 2026 13:57:25 -0400 Subject: [PATCH] Use workspace service in HTTP routes (#25139) --- .../instance/httpapi/handlers/workspace.ts | 43 ++++++++----------- .../server/routes/instance/httpapi/server.ts | 2 + 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/workspace.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/workspace.ts index 9413c865d1..4e76a76a30 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/workspace.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/workspace.ts @@ -1,58 +1,53 @@ import { listAdaptors } from "@/control-plane/adaptors" import { Workspace } from "@/control-plane/workspace" import * as InstanceState from "@/effect/instance-state" -import { Instance } from "@/project/instance" import { Effect } from "effect" -import { HttpApiBuilder } from "effect/unstable/httpapi" +import { HttpApiBuilder, HttpApiError } from "effect/unstable/httpapi" import { InstanceHttpApi } from "../api" import { CreatePayload, SessionRestorePayload } from "../groups/workspace" export const workspaceHandlers = HttpApiBuilder.group(InstanceHttpApi, "workspace", (handlers) => Effect.gen(function* () { + const workspace = yield* Workspace.Service + const adaptors = Effect.fn("WorkspaceHttpApi.adaptors")(function* () { const instance = yield* InstanceState.context return yield* Effect.promise(() => listAdaptors(instance.project.id)) }) const list = Effect.fn("WorkspaceHttpApi.list")(function* () { - return Workspace.list((yield* InstanceState.context).project) + return yield* workspace.list((yield* InstanceState.context).project) }) const create = Effect.fn("WorkspaceHttpApi.create")(function* (ctx: { payload: typeof CreatePayload.Type }) { const instance = yield* InstanceState.context - return yield* Effect.promise(() => - Instance.restore(instance, () => - Workspace.create({ - ...ctx.payload, - projectID: instance.project.id, - }), - ), - ) + return yield* workspace + .create({ + ...ctx.payload, + projectID: instance.project.id, + }) + .pipe(Effect.mapError(() => new HttpApiError.BadRequest({}))) }) const status = Effect.fn("WorkspaceHttpApi.status")(function* () { - const ids = new Set(Workspace.list((yield* InstanceState.context).project).map((item) => item.id)) - return Workspace.status().filter((item) => ids.has(item.workspaceID)) + const ids = new Set((yield* workspace.list((yield* InstanceState.context).project)).map((item) => item.id)) + return (yield* workspace.status()).filter((item) => ids.has(item.workspaceID)) }) const remove = Effect.fn("WorkspaceHttpApi.remove")(function* (ctx: { params: { id: Workspace.Info["id"] } }) { - const instance = yield* InstanceState.context - return yield* Effect.promise(() => Instance.restore(instance, () => Workspace.remove(ctx.params.id))) + return yield* workspace.remove(ctx.params.id) }) const sessionRestore = Effect.fn("WorkspaceHttpApi.sessionRestore")(function* (ctx: { params: { id: Workspace.Info["id"] } payload: typeof SessionRestorePayload.Type }) { - const instance = yield* InstanceState.context - return yield* Effect.promise(() => - Instance.restore(instance, () => - Workspace.sessionRestore({ - workspaceID: ctx.params.id, - sessionID: ctx.payload.sessionID, - }), - ), - ) + return yield* workspace + .sessionRestore({ + workspaceID: ctx.params.id, + sessionID: ctx.payload.sessionID, + }) + .pipe(Effect.mapError(() => new HttpApiError.BadRequest({}))) }) return handlers diff --git a/packages/opencode/src/server/routes/instance/httpapi/server.ts b/packages/opencode/src/server/routes/instance/httpapi/server.ts index 600b4f6087..caca845be3 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/server.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/server.ts @@ -35,6 +35,7 @@ import { ToolRegistry } from "@/tool/registry" import { lazy } from "@/util/lazy" import { Vcs } from "@/project/vcs" import { Worktree } from "@/worktree" +import { Workspace } from "@/control-plane/workspace" import { isAllowedCorsOrigin } from "@/server/cors" import { InstanceHttpApi, RootHttpApi } from "./api" import { ServerAuthConfig, authorizationLayer } from "./middleware/authorization" @@ -149,6 +150,7 @@ export const routes = Layer.mergeAll(rootApiRoutes, instanceRoutes).pipe( Todo.defaultLayer, ToolRegistry.defaultLayer, Vcs.defaultLayer, + Workspace.defaultLayer, Worktree.defaultLayer, Bus.layer, HttpServer.layerServices,