From 48024a7ba385905b175c6547b5edc32121610942 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 in several high-fan-in modules 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. I ran into this while trying to improve startup time by moving imports around. No functional change intended. --- packages/opencode/src/agent/agent.ts | 12 +++--- packages/opencode/src/command/index.ts | 6 +-- packages/opencode/src/session/compaction.ts | 20 +++++----- packages/opencode/src/session/index.ts | 4 +- packages/opencode/src/session/processor.ts | 24 ++++++------ packages/opencode/src/session/prompt.ts | 42 ++++++++++----------- packages/opencode/src/session/revert.ts | 16 ++++---- packages/opencode/src/session/summary.ts | 14 +++---- packages/opencode/src/share/share-next.ts | 16 ++++---- packages/opencode/src/skill/index.ts | 12 +++--- 10 files changed, 81 insertions(+), 85 deletions(-) diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 0c6fe6ec91..843d65433c 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -393,11 +393,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 088d7c5659..bd49be92f0 100644 --- a/packages/opencode/src/command/index.ts +++ b/packages/opencode/src/command/index.ts @@ -181,10 +181,8 @@ 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)), ) const { runPromise } = makeRuntime(Service, defaultLayer) diff --git a/packages/opencode/src/session/compaction.ts b/packages/opencode/src/session/compaction.ts index 3158393f11..ff79b6f06f 100644 --- a/packages/opencode/src/session/compaction.ts +++ b/packages/opencode/src/session/compaction.ts @@ -380,17 +380,15 @@ When constructing the summary, try to stick to this template: }), ) - export const defaultLayer = Layer.unwrap( - Effect.sync(() => - layer.pipe( - Layer.provide(Provider.defaultLayer), - Layer.provide(Session.defaultLayer), - Layer.provide(SessionProcessor.defaultLayer), - Layer.provide(Agent.defaultLayer), - Layer.provide(Plugin.defaultLayer), - Layer.provide(Bus.layer), - Layer.provide(Config.defaultLayer), - ), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Provider.defaultLayer), + Layer.provide(Session.defaultLayer), + Layer.provide(SessionProcessor.defaultLayer), + Layer.provide(Agent.defaultLayer), + Layer.provide(Plugin.defaultLayer), + Layer.provide(Bus.layer), + Layer.provide(Config.defaultLayer), ), ) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 65032de962..299297468b 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -681,7 +681,9 @@ export namespace Session { }), ) - export const defaultLayer = layer.pipe(Layer.provide(Bus.layer), Layer.provide(Config.defaultLayer)) + export const defaultLayer = Layer.suspend(() => + layer.pipe(Layer.provide(Bus.layer), Layer.provide(Config.defaultLayer)), + ) const { runPromise } = makeRuntime(Service, defaultLayer) diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index 146c73f277..f13dc7cc51 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -505,19 +505,17 @@ export namespace SessionProcessor { }), ) - export const defaultLayer = Layer.unwrap( - Effect.sync(() => - layer.pipe( - Layer.provide(Session.defaultLayer), - Layer.provide(Snapshot.defaultLayer), - Layer.provide(Agent.defaultLayer), - Layer.provide(LLM.defaultLayer), - Layer.provide(Permission.defaultLayer), - Layer.provide(Plugin.defaultLayer), - Layer.provide(SessionStatus.layer.pipe(Layer.provide(Bus.layer))), - Layer.provide(Bus.layer), - Layer.provide(Config.defaultLayer), - ), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Session.defaultLayer), + Layer.provide(Snapshot.defaultLayer), + Layer.provide(Agent.defaultLayer), + Layer.provide(LLM.defaultLayer), + Layer.provide(Permission.defaultLayer), + Layer.provide(Plugin.defaultLayer), + Layer.provide(SessionStatus.layer.pipe(Layer.provide(Bus.layer))), + Layer.provide(Bus.layer), + Layer.provide(Config.defaultLayer), ), ) } diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 24996c8d4b..114d7519c6 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -1709,28 +1709,26 @@ NOTE: At any point in time through this workflow you should feel free to ask the }), ) - const defaultLayer = Layer.unwrap( - Effect.sync(() => - layer.pipe( - Layer.provide(SessionStatus.layer), - Layer.provide(SessionCompaction.defaultLayer), - Layer.provide(SessionProcessor.defaultLayer), - Layer.provide(Command.defaultLayer), - Layer.provide(Permission.defaultLayer), - Layer.provide(MCP.defaultLayer), - Layer.provide(LSP.defaultLayer), - Layer.provide(FileTime.defaultLayer), - Layer.provide(ToolRegistry.defaultLayer), - Layer.provide(Truncate.layer), - Layer.provide(Provider.defaultLayer), - Layer.provide(Instruction.defaultLayer), - Layer.provide(AppFileSystem.defaultLayer), - Layer.provide(Plugin.defaultLayer), - Layer.provide(Session.defaultLayer), - Layer.provide(Agent.defaultLayer), - Layer.provide(Bus.layer), - Layer.provide(CrossSpawnSpawner.defaultLayer), - ), + const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(SessionStatus.layer), + Layer.provide(SessionCompaction.defaultLayer), + Layer.provide(SessionProcessor.defaultLayer), + Layer.provide(Command.defaultLayer), + Layer.provide(Permission.defaultLayer), + Layer.provide(MCP.defaultLayer), + Layer.provide(LSP.defaultLayer), + Layer.provide(FileTime.defaultLayer), + Layer.provide(ToolRegistry.defaultLayer), + Layer.provide(Truncate.layer), + Layer.provide(Provider.defaultLayer), + Layer.provide(Instruction.defaultLayer), + Layer.provide(AppFileSystem.defaultLayer), + Layer.provide(Plugin.defaultLayer), + Layer.provide(Session.defaultLayer), + Layer.provide(Agent.defaultLayer), + Layer.provide(Bus.layer), + Layer.provide(CrossSpawnSpawner.defaultLayer), ), ) const { runPromise } = makeRuntime(Service, defaultLayer) diff --git a/packages/opencode/src/session/revert.ts b/packages/opencode/src/session/revert.ts index 9df3f36eb8..88dbed694c 100644 --- a/packages/opencode/src/session/revert.ts +++ b/packages/opencode/src/session/revert.ts @@ -148,15 +148,13 @@ export namespace SessionRevert { }), ) - export const defaultLayer = Layer.unwrap( - Effect.sync(() => - layer.pipe( - Layer.provide(Session.defaultLayer), - Layer.provide(Snapshot.defaultLayer), - Layer.provide(Storage.defaultLayer), - Layer.provide(Bus.layer), - Layer.provide(SessionSummary.defaultLayer), - ), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Session.defaultLayer), + Layer.provide(Snapshot.defaultLayer), + Layer.provide(Storage.defaultLayer), + Layer.provide(Bus.layer), + Layer.provide(SessionSummary.defaultLayer), ), ) diff --git a/packages/opencode/src/session/summary.ts b/packages/opencode/src/session/summary.ts index f2b53f3baf..2f07a0f5d0 100644 --- a/packages/opencode/src/session/summary.ts +++ b/packages/opencode/src/session/summary.ts @@ -150,14 +150,12 @@ export namespace SessionSummary { }), ) - export const defaultLayer = Layer.unwrap( - Effect.sync(() => - layer.pipe( - Layer.provide(Session.defaultLayer), - Layer.provide(Snapshot.defaultLayer), - Layer.provide(Storage.defaultLayer), - Layer.provide(Bus.layer), - ), + export const defaultLayer = Layer.suspend(() => + layer.pipe( + Layer.provide(Session.defaultLayer), + Layer.provide(Snapshot.defaultLayer), + Layer.provide(Storage.defaultLayer), + Layer.provide(Bus.layer), ), ) diff --git a/packages/opencode/src/share/share-next.ts b/packages/opencode/src/share/share-next.ts index 2eb9887ea4..c3879b60ac 100644 --- a/packages/opencode/src/share/share-next.ts +++ b/packages/opencode/src/share/share-next.ts @@ -336,13 +336,15 @@ 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), + ), ) const { runPromise } = makeRuntime(Service, defaultLayer) diff --git a/packages/opencode/src/skill/index.ts b/packages/opencode/src/skill/index.ts index a2ac3d351c..d901366043 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 }) {