From 9b5fbbe3980eeb5ff4d494f908c010da4e83aa7b Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Tue, 26 May 2026 12:39:36 -0400 Subject: [PATCH] fix(opencode): share httpapi exercise service graph --- packages/opencode/src/account/repo.ts | 5 ++--- .../opencode/test/server/httpapi-exercise/backend.ts | 2 +- .../opencode/test/server/httpapi-exercise/runner.ts | 10 ++++++---- .../opencode/test/server/httpapi-exercise/runtime.ts | 3 +++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/account/repo.ts b/packages/opencode/src/account/repo.ts index 8607c3152..c42b7d524 100644 --- a/packages/opencode/src/account/repo.ts +++ b/packages/opencode/src/account/repo.ts @@ -44,7 +44,8 @@ export const layer = Layer.effect( const { db } = yield* Database.Service const decode = Schema.decodeUnknownSync(Info) - const query = (effect: Effect.Effect) => effect.pipe(Effect.orDie) + const query = (effect: Effect.Effect) => + effect.pipe(Effect.mapError((cause) => new AccountRepoError({ message: "Database operation failed", cause }))) const current = Effect.fnUntraced(function* () { const state = yield* db @@ -52,14 +53,12 @@ export const layer = Layer.effect( .from(AccountStateTable) .where(eq(AccountStateTable.id, ACCOUNT_STATE_ID)) .get() - .pipe(Effect.orDie) if (!state?.active_account_id) return const account = yield* db .select() .from(AccountTable) .where(eq(AccountTable.id, state.active_account_id)) .get() - .pipe(Effect.orDie) if (!account) return return { ...account, active_org_id: state.active_org_id ?? null } }) diff --git a/packages/opencode/test/server/httpapi-exercise/backend.ts b/packages/opencode/test/server/httpapi-exercise/backend.ts index ce94ddda9..6bd060e52 100644 --- a/packages/opencode/test/server/httpapi-exercise/backend.ts +++ b/packages/opencode/test/server/httpapi-exercise/backend.ts @@ -56,7 +56,7 @@ function app(modules: Runtime, options: CallOptions) { ), ), ), - { disableLogger: true }, + { disableLogger: true, memoMap: modules.memoMap }, ).handler return (appCache[cacheKey] = { request(input: string | URL | Request, init?: RequestInit) { diff --git a/packages/opencode/test/server/httpapi-exercise/runner.ts b/packages/opencode/test/server/httpapi-exercise/runner.ts index db0f0b217..86cbd13d9 100644 --- a/packages/opencode/test/server/httpapi-exercise/runner.ts +++ b/packages/opencode/test/server/httpapi-exercise/runner.ts @@ -1,6 +1,6 @@ import { Flag } from "@opencode-ai/core/flag/flag" import { SessionLegacy } from "@opencode-ai/core/session/legacy" -import { Cause, Duration, Effect } from "effect" +import { Cause, Duration, Effect, Layer, Scope } from "effect" import { TestLLMServer } from "../../lib/llm-server" import type { Config } from "../../../src/config/config" @@ -87,18 +87,20 @@ function withContext( Effect.gen(function* () { yield* trace(options, scenario, `${label} runtime start`) const modules = yield* Effect.promise(() => runtime()) + const scope = yield* Scope.Scope + const app = yield* Layer.buildWithMemoMap(modules.AppLayer, modules.memoMap, scope) yield* trace(options, scenario, `${label} runtime done`) const path = context.dir?.path const instance = path ? yield* trace(options, scenario, `${label} instance load start`).pipe( Effect.andThen( modules.InstanceStore.Service.use((store) => store.load({ directory: path })).pipe( - Effect.provide(modules.AppLayer), + Effect.provide(app), Effect.catchCause((cause) => Effect.sleep("100 millis").pipe( Effect.andThen( modules.InstanceStore.Service.use((store) => store.load({ directory: path })).pipe( - Effect.provide(modules.AppLayer), + Effect.provide(app), ), ), Effect.catchCause(() => Effect.failCause(cause)), @@ -110,7 +112,7 @@ function withContext( ) : undefined const run = (effect: Effect.Effect) => - effect.pipe(Effect.provideService(modules.InstanceRef, instance), Effect.provide(modules.AppLayer)) + effect.pipe(Effect.provideService(modules.InstanceRef, instance), Effect.provide(app)) const directory = () => { if (!context.dir?.path) throw new Error("scenario needs a project directory") return context.dir.path diff --git a/packages/opencode/test/server/httpapi-exercise/runtime.ts b/packages/opencode/test/server/httpapi-exercise/runtime.ts index 7842752ad..bd261cbe4 100644 --- a/packages/opencode/test/server/httpapi-exercise/runtime.ts +++ b/packages/opencode/test/server/httpapi-exercise/runtime.ts @@ -2,6 +2,7 @@ export type Runtime = { PublicApi: (typeof import("../../../src/server/routes/instance/httpapi/public"))["PublicApi"] HttpApiApp: (typeof import("../../../src/server/routes/instance/httpapi/server"))["HttpApiApp"] AppLayer: (typeof import("../../../src/effect/app-runtime"))["AppLayer"] + memoMap: (typeof import("@opencode-ai/core/effect/memo-map"))["memoMap"] InstanceRef: (typeof import("../../../src/effect/instance-ref"))["InstanceRef"] InstanceStore: (typeof import("../../../src/project/instance-store"))["InstanceStore"] Session: (typeof import("../../../src/session/session"))["Session"] @@ -21,6 +22,7 @@ export function runtime() { const publicApi = await import("../../../src/server/routes/instance/httpapi/public") const httpApiServer = await import("../../../src/server/routes/instance/httpapi/server") const appRuntime = await import("../../../src/effect/app-runtime") + const memoMap = await import("@opencode-ai/core/effect/memo-map") const instanceRef = await import("../../../src/effect/instance-ref") const instanceStore = await import("../../../src/project/instance-store") const session = await import("../../../src/session/session") @@ -34,6 +36,7 @@ export function runtime() { PublicApi: publicApi.PublicApi, HttpApiApp: httpApiServer.HttpApiApp, AppLayer: appRuntime.AppLayer, + memoMap: memoMap.memoMap, InstanceRef: instanceRef.InstanceRef, InstanceStore: instanceStore.InstanceStore, Session: session.Session,