From b89ec4b11b15bcc1cbffe5742db0dd60aa976182 Mon Sep 17 00:00:00 2001 From: Simon Klee Date: Sun, 5 Apr 2026 20:41:12 +0200 Subject: [PATCH] opencode: lazily compose default layers defaultLayer is currently composed at import time. This makes module evaluation sensitive to transitive import order, even though the layer graph itself is unchanged. Wrap these compositions in Layer.suspend() so the same graph is built on demand instead of during module load. This reduces init-order coupling and makes import reordering for startup work safer. --- packages/opencode/src/agent/agent.ts | 12 +++++++----- packages/opencode/src/command/index.ts | 6 ++---- packages/opencode/src/session/index.ts | 4 +++- packages/opencode/src/share/share-next.ts | 16 +++++++++------- packages/opencode/src/skill/index.ts | 12 +++++++----- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index fd9ac43e8b..93b393f137 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -398,11 +398,13 @@ export namespace Agent { }), ) - export const defaultLayer = layer.pipe( - Layer.provide(Provider.defaultLayer), - Layer.provide(Auth.defaultLayer), - Layer.provide(Config.defaultLayer), - Layer.provide(Skill.defaultLayer), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Provider.defaultLayer), + Layer.provide(Auth.defaultLayer), + Layer.provide(Config.defaultLayer), + Layer.provide(Skill.defaultLayer), + ), ) const { runPromise } = makeRuntime(Service, defaultLayer) diff --git a/packages/opencode/src/command/index.ts b/packages/opencode/src/command/index.ts index 42f53301b2..9a173e9fac 100644 --- a/packages/opencode/src/command/index.ts +++ b/packages/opencode/src/command/index.ts @@ -183,9 +183,7 @@ export namespace Command { }), ) - export const defaultLayer = layer.pipe( - Layer.provide(Config.defaultLayer), - Layer.provide(MCP.defaultLayer), - Layer.provide(Skill.defaultLayer), + export const defaultLayer = Layer.suspend(() => + layer.pipe(Layer.provide(Config.defaultLayer), Layer.provide(MCP.defaultLayer), Layer.provide(Skill.defaultLayer)), ) } diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 3d49035881..38d47eaad0 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -678,7 +678,9 @@ export namespace Session { }), ) - export const defaultLayer = layer.pipe(Layer.provide(Bus.layer), Layer.provide(Storage.defaultLayer)) + export const defaultLayer = Layer.suspend(() => + layer.pipe(Layer.provide(Bus.layer), Layer.provide(Storage.defaultLayer)), + ) const { runPromise } = makeRuntime(Service, defaultLayer) diff --git a/packages/opencode/src/share/share-next.ts b/packages/opencode/src/share/share-next.ts index ad247f5466..8cd8c590e8 100644 --- a/packages/opencode/src/share/share-next.ts +++ b/packages/opencode/src/share/share-next.ts @@ -339,12 +339,14 @@ export namespace ShareNext { }), ) - export const defaultLayer = layer.pipe( - Layer.provide(Bus.layer), - Layer.provide(Account.defaultLayer), - Layer.provide(Config.defaultLayer), - Layer.provide(FetchHttpClient.layer), - Layer.provide(Provider.defaultLayer), - Layer.provide(Session.defaultLayer), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Bus.layer), + Layer.provide(Account.defaultLayer), + Layer.provide(Config.defaultLayer), + Layer.provide(FetchHttpClient.layer), + Layer.provide(Provider.defaultLayer), + Layer.provide(Session.defaultLayer), + ), ) } diff --git a/packages/opencode/src/skill/index.ts b/packages/opencode/src/skill/index.ts index be74c0b342..8e7359ae7c 100644 --- a/packages/opencode/src/skill/index.ts +++ b/packages/opencode/src/skill/index.ts @@ -230,11 +230,13 @@ export namespace Skill { }), ) - export const defaultLayer = layer.pipe( - Layer.provide(Discovery.defaultLayer), - Layer.provide(Config.defaultLayer), - Layer.provide(Bus.layer), - Layer.provide(AppFileSystem.defaultLayer), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Discovery.defaultLayer), + Layer.provide(Config.defaultLayer), + Layer.provide(Bus.layer), + Layer.provide(AppFileSystem.defaultLayer), + ), ) export function fmt(list: Info[], opts: { verbose: boolean }) {