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 fd9ac43e8..93b393f13 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 42f53301b..9a173e9fa 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 3d4903588..38d47eaad 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 ad247f546..8cd8c590e 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 be74c0b34..8e7359ae7 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 }) {