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.
layered-deferred-comp
Simon Klee 2026-04-05 20:41:12 +02:00
parent 3a0e00dd7f
commit 48024a7ba3
No known key found for this signature in database
GPG Key ID: B91696044D47BEA3
10 changed files with 81 additions and 85 deletions

View File

@ -393,11 +393,13 @@ export namespace Agent {
}),
)
export const defaultLayer = layer.pipe(
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)

View File

@ -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)

View File

@ -380,8 +380,7 @@ When constructing the summary, try to stick to this template:
}),
)
export const defaultLayer = Layer.unwrap(
Effect.sync(() =>
export const defaultLayer = Layer.suspend(() =>
layer.pipe(
Layer.provide(Provider.defaultLayer),
Layer.provide(Session.defaultLayer),
@ -391,7 +390,6 @@ When constructing the summary, try to stick to this template:
Layer.provide(Bus.layer),
Layer.provide(Config.defaultLayer),
),
),
)
const { runPromise } = makeRuntime(Service, defaultLayer)

View File

@ -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)

View File

@ -505,8 +505,7 @@ export namespace SessionProcessor {
}),
)
export const defaultLayer = Layer.unwrap(
Effect.sync(() =>
export const defaultLayer = Layer.suspend(() =>
layer.pipe(
Layer.provide(Session.defaultLayer),
Layer.provide(Snapshot.defaultLayer),
@ -518,6 +517,5 @@ export namespace SessionProcessor {
Layer.provide(Bus.layer),
Layer.provide(Config.defaultLayer),
),
),
)
}

View File

@ -1709,8 +1709,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the
}),
)
const defaultLayer = Layer.unwrap(
Effect.sync(() =>
const defaultLayer = Layer.suspend(() =>
layer.pipe(
Layer.provide(SessionStatus.layer),
Layer.provide(SessionCompaction.defaultLayer),
@ -1731,7 +1730,6 @@ NOTE: At any point in time through this workflow you should feel free to ask the
Layer.provide(Bus.layer),
Layer.provide(CrossSpawnSpawner.defaultLayer),
),
),
)
const { runPromise } = makeRuntime(Service, defaultLayer)

View File

@ -148,8 +148,7 @@ export namespace SessionRevert {
}),
)
export const defaultLayer = Layer.unwrap(
Effect.sync(() =>
export const defaultLayer = Layer.suspend(() =>
layer.pipe(
Layer.provide(Session.defaultLayer),
Layer.provide(Snapshot.defaultLayer),
@ -157,7 +156,6 @@ export namespace SessionRevert {
Layer.provide(Bus.layer),
Layer.provide(SessionSummary.defaultLayer),
),
),
)
const { runPromise } = makeRuntime(Service, defaultLayer)

View File

@ -150,15 +150,13 @@ export namespace SessionSummary {
}),
)
export const defaultLayer = Layer.unwrap(
Effect.sync(() =>
export const defaultLayer = Layer.suspend(() =>
layer.pipe(
Layer.provide(Session.defaultLayer),
Layer.provide(Snapshot.defaultLayer),
Layer.provide(Storage.defaultLayer),
Layer.provide(Bus.layer),
),
),
)
const { runPromise } = makeRuntime(Service, defaultLayer)

View File

@ -336,13 +336,15 @@ export namespace ShareNext {
}),
)
export const defaultLayer = layer.pipe(
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)

View File

@ -230,11 +230,13 @@ export namespace Skill {
}),
)
export const defaultLayer = layer.pipe(
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 }) {