From 83c09e00d770613a12724d1252ac12faa6f92c2b Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 12 Apr 2026 04:18:12 +0000 Subject: [PATCH] fix(server): replace Layer.effectServices with Layer.scopedContext in NodeSqliteClient Layer.effectServices does not exist in Effect 4.0.0-beta.43. Calling it throws TypeError at layer build time, which Effect catches as a defect, silently failing the sqlite client layer. This left setup's yield* SqlClient.SqlClient with no service in context, producing the misleading "Service not found: effect/sql/SqlClient" error. The correct API (confirmed from @effect/sql-sqlite-bun reference impl) is: - Layer.scopedContext for scoped resources (sqlite conn needs Scope cleanup) - Context.make(Client.SqlClient, client) instead of ServiceMap.make/add https://claude.ai/code/session_01BpwxjJ9XzBeAXjRp86E9Jr --- .../src/persistence/NodeSqliteClient.ts | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/apps/server/src/persistence/NodeSqliteClient.ts b/apps/server/src/persistence/NodeSqliteClient.ts index 77c316e8ca..bd760eccf1 100644 --- a/apps/server/src/persistence/NodeSqliteClient.ts +++ b/apps/server/src/persistence/NodeSqliteClient.ts @@ -8,6 +8,7 @@ import { DatabaseSync, type StatementSync } from "node:sqlite"; import * as Cache from "effect/Cache"; import * as Config from "effect/Config"; +import * as Context from "effect/Context"; import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as Fiber from "effect/Fiber"; @@ -251,27 +252,21 @@ const makeMemory = ( export const layerConfig = ( config: Config.Wrap, ): Layer.Layer => - Layer.effectServices( + Layer.scopedContext( Config.unwrap(config) .asEffect() .pipe( Effect.flatMap(make), - Effect.map((client) => - ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)), - ), + Effect.map((client) => Context.make(Client.SqlClient, client)), ), ).pipe(Layer.provide(Reactivity.layer)); export const layer = (config: SqliteClientConfig): Layer.Layer => - Layer.effectServices( - Effect.map(make(config), (client) => - ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)), - ), + Layer.scopedContext( + Effect.map(make(config), (client) => Context.make(Client.SqlClient, client)), ).pipe(Layer.provide(Reactivity.layer)); export const layerMemory = (config: SqliteMemoryClientConfig = {}): Layer.Layer => - Layer.effectServices( - Effect.map(makeMemory(config), (client) => - ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)), - ), + Layer.scopedContext( + Effect.map(makeMemory(config), (client) => Context.make(Client.SqlClient, client)), ).pipe(Layer.provide(Reactivity.layer));