diff --git a/packages/core/src/effect/layer-node.ts b/packages/core/src/effect/layer-node.ts index 988941f8cb..e8b874840f 100644 --- a/packages/core/src/effect/layer-node.ts +++ b/packages/core/src/effect/layer-node.ts @@ -135,7 +135,12 @@ type ValidReplacements = Items & CheckReplacements, deps: [], tag: source.tag }) + : make({ + ...nodeMakeIdentity(source), + layer: replacement as Layer.Layer, + deps: [], + tag: source.tag, + }) if (source.name !== replacementNode.name) { throw new Error(`Cannot replace ${source.name} with ${replacementNode.name}`) } diff --git a/packages/core/test/catalog.test.ts b/packages/core/test/catalog.test.ts index da378af2f8..6c736cde1e 100644 --- a/packages/core/test/catalog.test.ts +++ b/packages/core/test/catalog.test.ts @@ -27,9 +27,7 @@ const catalogLayer = AppNodeBuilder.build( LayerNode.group([Catalog.node, EventV2.node, Credential.node, Integration.node, Policy.node]), [[Location.node, locationLayer]], ) -const it = testEffect( - catalogLayer, -) +const it = testEffect(catalogLayer) describe("CatalogV2", () => { it.effect("publishes an updated event after catalog changes", () => @@ -50,10 +48,7 @@ describe("CatalogV2", () => { it.effect("derives availability from active credentials without changing provider state", () => { const integrationID = Integration.ID.make("test") const localCatalogLayer = Layer.fresh( - AppNodeBuilder.build( - LayerNode.group([Catalog.node, Credential.node]), - [[Location.node, locationLayer]], - ), + AppNodeBuilder.build(LayerNode.group([Catalog.node, Credential.node]), [[Location.node, locationLayer]]), ) return Effect.gen(function* () { @@ -82,10 +77,9 @@ describe("CatalogV2", () => { const integrationID = Integration.ID.make("gateway") const providerID = ProviderV2.ID.make("remote") const localCatalogLayer = Layer.fresh( - AppNodeBuilder.build( - LayerNode.group([Catalog.node, Credential.node, Integration.node]), - [[Location.node, locationLayer]], - ), + AppNodeBuilder.build(LayerNode.group([Catalog.node, Credential.node, Integration.node]), [ + [Location.node, locationLayer], + ]), ) return Effect.gen(function* () { diff --git a/packages/core/test/config/config.test.ts b/packages/core/test/config/config.test.ts index 24f4aa969f..ac5ec8c212 100644 --- a/packages/core/test/config/config.test.ts +++ b/packages/core/test/config/config.test.ts @@ -42,10 +42,7 @@ function testLayer( ), ), ) - return AppNodeBuilder.build( - LayerNode.group([configNode, Policy.node]), - [[Location.node, locationLayer]], - ) + return AppNodeBuilder.build(LayerNode.group([configNode, Policy.node]), [[Location.node, locationLayer]]) } const provider = { diff --git a/packages/core/test/effect/layer-node/layer-node-types.test.ts b/packages/core/test/effect/layer-node/layer-node-types.test.ts index fb3461a585..0f3dd96d0a 100644 --- a/packages/core/test/effect/layer-node/layer-node-types.test.ts +++ b/packages/core/test/effect/layer-node/layer-node-types.test.ts @@ -70,7 +70,8 @@ void invalidNodeReplacement LayerNode.compile(a, [[a, Layer.effect(A, Effect.fail(new OtherError()))]]) // @ts-expect-error Node replacement cannot introduce a new error -const invalidNodeErrorReplacement = () => LayerNode.compile(a, [[a, make({ service: A, layer: Layer.effect(A, Effect.fail(new OtherError())), deps: [] })]]) +const invalidNodeErrorReplacement = () => + LayerNode.compile(a, [[a, make({ service: A, layer: Layer.effect(A, Effect.fail(new OtherError())), deps: [] })]]) void invalidNodeErrorReplacement class TagA extends Context.Service()("test/TagA") {} diff --git a/packages/core/test/location-filesystem.test.ts b/packages/core/test/location-filesystem.test.ts index 2ae716f615..f0075db245 100644 --- a/packages/core/test/location-filesystem.test.ts +++ b/packages/core/test/location-filesystem.test.ts @@ -12,15 +12,12 @@ import { it } from "./lib/effect" const provide = (directory: string) => Effect.provide( - LayerNode.compile( - FileSystem.node, + LayerNode.compile(FileSystem.node, [ [ - [ - Location.node, - Layer.succeed(Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(directory) }))), - ], + Location.node, + Layer.succeed(Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(directory) }))), ], - ), + ]), ) const withTmp = (f: (directory: string) => Effect.Effect) => diff --git a/packages/core/test/location-mutation.test.ts b/packages/core/test/location-mutation.test.ts index 328bd20c88..b09be42daa 100644 --- a/packages/core/test/location-mutation.test.ts +++ b/packages/core/test/location-mutation.test.ts @@ -12,15 +12,12 @@ import { it } from "./lib/effect" function provide(directory: string) { return Effect.provide( - LayerNode.compile( - LocationMutation.node, + LayerNode.compile(LocationMutation.node, [ [ - [ - Location.node, - Layer.succeed(Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(directory) }))), - ], + Location.node, + Layer.succeed(Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(directory) }))), ], - ), + ]), ) } diff --git a/packages/core/test/plugin/models-dev.test.ts b/packages/core/test/plugin/models-dev.test.ts index ff8e5bdf29..0858bd433b 100644 --- a/packages/core/test/plugin/models-dev.test.ts +++ b/packages/core/test/plugin/models-dev.test.ts @@ -19,10 +19,9 @@ const locationLayer = Layer.succeed( Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(import.meta.dir) })), ) -const layer = AppNodeBuilder.build( - LayerNode.group([Catalog.node, Integration.node, EventV2.node]), - [[Location.node, locationLayer]], -) +const layer = AppNodeBuilder.build(LayerNode.group([Catalog.node, Integration.node, EventV2.node]), [ + [Location.node, locationLayer], +]) const it = testEffect(layer) describe("ModelsDevPlugin", () => { diff --git a/packages/core/test/plugin/variant.test.ts b/packages/core/test/plugin/variant.test.ts index 36630ee6c8..84af04a4df 100644 --- a/packages/core/test/plugin/variant.test.ts +++ b/packages/core/test/plugin/variant.test.ts @@ -16,12 +16,7 @@ const locationLayer = Layer.succeed( Location.Service, Location.Service.of(location({ directory: AbsolutePath.make(import.meta.dir) })), ) -const it = testEffect( - AppNodeBuilder.build( - Catalog.node, - [[Location.node, locationLayer]], - ), -) +const it = testEffect(AppNodeBuilder.build(Catalog.node, [[Location.node, locationLayer]])) describe("VariantPlugin", () => { it.effect("adds GLM 5.2 variants after catalog sources", () => diff --git a/packages/core/test/session-projector.test.ts b/packages/core/test/session-projector.test.ts index 56fddb1f0f..6648ee43c3 100644 --- a/packages/core/test/session-projector.test.ts +++ b/packages/core/test/session-projector.test.ts @@ -24,10 +24,7 @@ import { testEffect } from "./lib/effect" import { Snapshot } from "@opencode-ai/core/snapshot" const it = testEffect(AppNodeBuilder.build(LayerNode.group([Database.node, EventV2.node, SessionProjector.node]))) -const sessionsLayer = AppNodeBuilder.build( - SessionV2.node, - [[SessionExecution.node, SessionExecution.noopLayer]], -) +const sessionsLayer = AppNodeBuilder.build(SessionV2.node, [[SessionExecution.node, SessionExecution.noopLayer]]) const sessionID = SessionV2.ID.make("ses_projector_test") const created = DateTime.makeUnsafe(0) const model = { id: ModelV2.ID.make("model"), providerID: ProviderV2.ID.make("provider") } diff --git a/packages/core/test/tool-question.test.ts b/packages/core/test/tool-question.test.ts index 5ba2990405..1df2c8331b 100644 --- a/packages/core/test/tool-question.test.ts +++ b/packages/core/test/tool-question.test.ts @@ -31,10 +31,9 @@ const permission = Layer.succeed( list: () => Effect.die("unused"), }), ) -const registry = AppNodeBuilder.build( - LayerNode.group([ToolRegistry.node, ToolRegistry.toolsNode]), - [[ToolOutputStore.node, ToolOutputStore.nodeWithoutConfig]], -) +const registry = AppNodeBuilder.build(LayerNode.group([ToolRegistry.node, ToolRegistry.toolsNode]), [ + [ToolOutputStore.node, ToolOutputStore.nodeWithoutConfig], +]) const question = Layer.succeed( QuestionV2.Service, QuestionV2.Service.of({ diff --git a/packages/core/test/tool-skill.test.ts b/packages/core/test/tool-skill.test.ts index acb3fe527b..e235265b11 100644 --- a/packages/core/test/tool-skill.test.ts +++ b/packages/core/test/tool-skill.test.ts @@ -66,10 +66,9 @@ describe("SkillTool", () => { list: () => Effect.succeed(current), }), ) - const registry = AppNodeBuilder.build( - LayerNode.group([ToolRegistry.node, ToolRegistry.toolsNode]), - [[ToolOutputStore.node, ToolOutputStore.nodeWithoutConfig]], - ) + const registry = AppNodeBuilder.build(LayerNode.group([ToolRegistry.node, ToolRegistry.toolsNode]), [ + [ToolOutputStore.node, ToolOutputStore.nodeWithoutConfig], + ]) const tool = SkillTool.layer.pipe( Layer.provide(registry), Layer.provide(permission), diff --git a/packages/opencode/test/session/processor-effect.test.ts b/packages/opencode/test/session/processor-effect.test.ts index f736becca7..5287605436 100644 --- a/packages/opencode/test/session/processor-effect.test.ts +++ b/packages/opencode/test/session/processor-effect.test.ts @@ -206,10 +206,7 @@ const providerErrorLLM = Layer.succeed( ), }), ) -const providerErrorEnv = LayerNode.compile( - root, - [...replacements, [LLM.node, providerErrorLLM]], -) +const providerErrorEnv = LayerNode.compile(root, [...replacements, [LLM.node, providerErrorLLM]]) const itProviderError = testEffect(providerErrorEnv) const fragmentFailureLLM = Layer.succeed( @@ -226,10 +223,7 @@ const fragmentFailureLLM = Layer.succeed( ), }), ) -const fragmentFailureEnv = LayerNode.compile( - root, - [...replacements, [LLM.node, fragmentFailureLLM]], -) +const fragmentFailureEnv = LayerNode.compile(root, [...replacements, [LLM.node, fragmentFailureLLM]]) const itFragmentFailure = testEffect(fragmentFailureEnv) const boot = Effect.fn("test.boot")(function* () { diff --git a/packages/opencode/test/session/snapshot-tool-race.test.ts b/packages/opencode/test/session/snapshot-tool-race.test.ts index d21a3841be..1265237840 100644 --- a/packages/opencode/test/session/snapshot-tool-race.test.ts +++ b/packages/opencode/test/session/snapshot-tool-race.test.ts @@ -87,14 +87,11 @@ const root = LayerNode.group([ LayerNode.make({ service: TestLLMServer, layer: TestLLMServer.layer, deps: [] }), ]) const it = testEffect( - LayerNode.compile( - root, - [ - [MCP.node, mcp], - [LSP.node, lsp], - [RuntimeFlags.node, RuntimeFlags.layer({ experimentalEventSystem: true })], - ], - ), + LayerNode.compile(root, [ + [MCP.node, mcp], + [LSP.node, lsp], + [RuntimeFlags.node, RuntimeFlags.layer({ experimentalEventSystem: true })], + ]), ) const providerCfg = (url: string) => ({ diff --git a/packages/opencode/test/share/share-next.test.ts b/packages/opencode/test/share/share-next.test.ts index 3824b1b802..fe036be8c9 100644 --- a/packages/opencode/test/share/share-next.test.ts +++ b/packages/opencode/test/share/share-next.test.ts @@ -35,10 +35,7 @@ const none = HttpClient.make(() => Effect.die("unexpected http call")) function requestLayer(client: HttpClient.HttpClient) { const replacement = [httpClient, Layer.succeed(HttpClient.HttpClient, client)] as const - return LayerNode.compile( - LayerNode.group([ShareNext.node, AccountRepo.node]), - [replacement], - ) + return LayerNode.compile(LayerNode.group([ShareNext.node, AccountRepo.node]), [replacement]) } function integrationLayer(client: HttpClient.HttpClient) { diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index 6164495549..0e4b05f3e2 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -55,12 +55,7 @@ const replacements = [ ] as const const it = testEffect(LayerNode.compile(root, replacements)) -const withBrokenPlugin = testEffect( - LayerNode.compile( - root, - [...replacements, [Plugin.node, brokenPluginLayer]], - ), -) +const withBrokenPlugin = testEffect(LayerNode.compile(root, [...replacements, [Plugin.node, brokenPluginLayer]])) afterEach(async () => { await disposeAllInstances() diff --git a/packages/server/src/routes.ts b/packages/server/src/routes.ts index 281565161f..cda5f5998c 100644 --- a/packages/server/src/routes.ts +++ b/packages/server/src/routes.ts @@ -49,10 +49,7 @@ export function createEmbeddedRoutes() { } function makeRoutes(auth: Layer.Layer) { - const serviceLayer = AppNodeBuilder.build( - applicationServices, - [[SessionExecution.node, SessionExecutionLocal.node]], - ) + const serviceLayer = AppNodeBuilder.build(applicationServices, [[SessionExecution.node, SessionExecutionLocal.node]]) return HttpApiBuilder.layer(Api, { openapiPath: "/openapi.json" }).pipe( Layer.provide(handlers),